python日志logger

发布时间 2023-10-07 16:14:17作者: yimu-yimu

写代码过程中,为了方便问题定位,经常需要打印信息,但是太多的print()不好,所以可以用到logger

Logger通常分为两类:

一类是StreamHandler,将日志信息输出到控制台;另一类是FileHandler,将日志信息输出到文件。

Python标准库中的logging模块提供了强大的Logger功能。

import logging


class Logger:
    def __init__(self, file_log):
        self.file_log = file_log
        # 给Logger添加Handler。创建日志记录器。获取名为may_logger的Logger对象
        self.logger = logging.getLogger("may_logger")

    def logger_may(self):
        # 配置Logger
        logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

        # 因为系统默认输出到控制台,所以有关StreamHandler日志处理器的给注释掉,要不然会重复输出
        # 创建一个StreamHandler日志处理器,输出到控制台
        # console_handler = logging.StreamHandler()
        # console_handler.setLevel(logging.DEBUG)

        # 创建一个FileHandler日志处理器,输出到文件
        # filelog = 'example.log'
        file_handler = logging.FileHandler(self.file_log)
        file_handler.setLevel(logging.DEBUG)

        # 定义Handler的输出格式
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
        # console_handler.setFormatter(formatter)  # 输出格式运用到控制台日志处理器
        file_handler.setFormatter(formatter)  # 输出格式运用到文件日志处理器

        # 将处理器添加到记录器中
        # logger.addHandler(console_handler)
        self.logger.addHandler(file_handler)

        return self.logger

    # 自定义清理函数,用于清空文件中旧的日志数据
    def clear_log_data(self):
        with open(self.file_log, 'w') as f:
            f.truncate()

运用如下:

from testcode import logUtil

file_log = 'example.log'

logger = logUtil.Logger(file_log).logger_may()
logUtil.Logger(file_log).clear_log_data()  # 清空旧的文件数据
# 使用Logger记录信息
logger.debug('这是一条debug级别的日志,即调试信息')
logger.info('这是一条info级别的日志,即普通日志')
logger.warning('这是一条warning级别的日志')
logger.error('这是一条error级别的日志')
logger.critical('这是一条critical级别的日志')

运行结果:

在同一目录下,会生成 .log 文件

 

注意事项:

  • 在使用Logger时,建议设置合适的日志级别,如DEBUG、INFO、WARNING、ERROR和CRITICAL。这样可以控制输出的日志信息量,避免过多的日志干扰程序运行。
  • Logger可以同时添加多个Handler,以便将日志输出到不同的地方,如控制台、文件等。
  • Logger的格式化字符串可以自定义,以满足不同的输出需求。在上面的示例中,我们使用了时间戳、日志级别和日志信息作为格式化字符串的内容。

 

如果要过滤指定的信息:

# 创建一个日志过滤器,只记录包含关键词"error"的日志消息
        class ErrorFilter(logging.Filter):
            def filter(self, record):
                return 'error' in record.getMessage()

        error_filter = ErrorFilter()

        # 将过滤器添加到处理器中
        console_handler.addFilter(error_filter)