天天看点

Python Logging 模块Python Logging 模块

Python Logging 模块

1.Logging 模块介绍

介绍连接: https://www.jianshu.com/p/7b5e4752932e

Python 中的 logging 模块可以让你跟踪代码运行时的事件,当程序崩溃时可以查看日志并且发现是什么引发了错误。

logging模块用于便捷记录日志且线程安全。

Log信息有内置的层级——调(debugging)、信息(informational)、警告(warnings)、错误(error)和严重错(critical)。

logging 模块可以:

控制信息层级,仅记录需要的信息。
控制显示或者保存日志的时机。
使用内置信息模板控制日志格式。
知晓信息来自于哪个模块。
           

2.第一个logging程序

import logging
logging.basicConfig(level=logging.WARNING)

def hypotenuse(a, b):
    """计算三角形斜边"""
    return (a**2 + b**2)**0.5

kwargs = {'a':3, 'b':4, 'c':hypotenuse(3, 4)}

logging.debug("a = {a}, b = {b}".format(**kwargs))
logging.info("{a}, {b} 的斜边是 {c}".format(**kwargs))
logging.warning("a={a} 和 b={b} 相等".format(**kwargs))
logging.error("a={a} 和 b={b} 不能为负".format(**kwargs))
logging.critical("{a}, {b} 的斜边是 {c}".format(**kwargs))
           

2.1 基本设置 logging.basicConfig()

参数说明

Python Logging 模块Python Logging 模块

2.2 日志级别(level)

只有大于当前日志等级的操作才会被记录。

Python Logging 模块Python Logging 模块

3.第二个logging程序

import logging
logger = logging.getLogger("my_test")
logger.setLevel(logging.DEBUG)

fh = logging.FileHandler("access.log")
fh.setLevel(logging.INFO)

ch = logging.StreamHandler()
ch.setLevel(logging.WARNING)

formatter = logging.Formatter("%(asctime)s :: %(levelname)s :: %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter)

logger.addHandler(fh)
logger.addHandler(ch)

logger.debug("I am debug")
logger.info("I am info")
logger.warning("I am warning")
logger.error("I am error")
logger.critical("I am critical")
           

3.1 Formatter 参数解读

常用参数说明

Python Logging 模块Python Logging 模块

3.2 getLogger 创建对象

使用方法

3.3 setLevel 设置级别

使用方法

3.4 FileHandler 与 StreamHandler 输出设置

斜体样式

fh = logging.FileHandler("access.log")  #输出文件
ch = logging.StreamHandler()            #输出命令行
           

3.5 setFormatter 匹配命令

fh.setFormatter(formatter)
ch.setFormatter(formatter)
           

3.6 addHandler 添加

将指定的处理程序hdlr添加到此记录器

logger.addHandler(fh)
logger.addHandler(ch)
           

3.7 debug info warning error critical

logger.debug("I am debug")
logger.info("I am info")
logger.warning("I am warning")
logger.error("I am error")
logger.critical("I am critical")
           
logging.debug("a = {a}, b = {b}".format(**kwargs))
logging.info("{a}, {b} 的斜边是 {c}".format(**kwargs))
logging.warning("a={a} 和 b={b} 相等".format(**kwargs))
logging.error("a={a} 和 b={b} 不能为负".format(**kwargs))
logging.critical("{a}, {b} 的斜边是 {c}".format(**kwargs))
           

4.logHelper类

logHelper基于logging,做了一些二次封装工作,主要实现设置日志级别、
  格式化日志内容,将日志输出至文件中并可以自定义日志文件大小。
  Arguments:
         name: String. 此字段仅用于传入日志输出中一个名称字段
         maxsize: String. 此字段用于自定义日志文件大小,单位为M
           
import logging
from logging.handlers import RotatingFileHandler


class LogHelper:
    def __init__(self, name, maxsize):
        """
          logHelper基于logging,做了一些二次封装工作,主要实现设置日志级别、
        格式化日志内容,将日志输出至文件中并可以自定义日志文件大小。
        Arguments:
            name: String. 此字段仅用于传入日志输出中一个名称字段
            maxsize: String. 此字段用于自定义日志文件大小,单位为M
        """
        super().__init__()

        # 是否回显标志
        self.isEcho = False

        # 创建logger实例,logging模块在使用之前首先需要创建这样的一个实例
        self.logger = logging.getLogger(name)

        # 默认设置为DEBUG级别,低于次级别的日志不会写入到文件中
        self.logger.setLevel(level=logging.DEBUG)

        # 格式化日志输出,目前格式为:时间 - 名称 - 级别 - 日志内容
        self.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

        # 创建文件Handler,默认日志文件为同级目录下的log.txt文件,最大文件大小为初始化函数中传入,backupCount 为日志备份数量
        self.fileHandler = RotatingFileHandler("log.txt", maxBytes=1024*1024*maxsize, backupCount=1)

        # 设置文件输出的日志级别
        self.fileHandler.setLevel(logging.DEBUG)

        # 设置日志输出格式以及文件输出(此时不会在终端中输出)
        self.fileHandler.setFormatter(self.formatter)
        self.logger.addHandler(self.fileHandler)

    def set_level(self, level):
        """设置日志级别
        Arguments:
            level: int. 日志级别.  debug-10 info-20 warning-30 error-40 critical-50
        """
        self.logger.setLevel(level)
        self.fileHandler.setLevel(level)

    def echo(self):
        # 设置是否回显
        self.isEcho = True

    def debug(self, string):
        # debug
        self.logger.debug(string)
        if self.isEcho:
            return string

    def info(self, string):
        # info
        self.logger.info(string)
        if self.isEcho:
            return string

    def warning(self, string):
        # warning
        self.logger.warning(string)
        if self.isEcho:
            return string

    def error(self, string):
        # error
        self.logger.error(string)
        if self.isEcho:
            return string

    def critical(self, string):
        # critical
        self.logger.critical(string)
        if self.isEcho:
            return string


if __name__ == "__main__":
    logHelper = LogHelper("test", 3)