python日志logger
写代码过程中,为了方便问题定位,经常需要打印信息,但是太多的print()不好,所以可以用到logger
Logger通常分为两类:
一类是StreamHandler,将日志信息输出到控制台;另一类是FileHandler,将日志信息输出到文件。
Python标准库中的logging模块提供了强大的Logger功能。
每次log都清空旧的数据
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 # 有时候文件输出内容为空,所以去掉了basicConfig,直接设置setLevel # logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') self.logger.setLevel(logging.INFO) # 因为系统默认输出到控制台,所以有关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时,建议设置合适的日志级别,如NOTSET、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)
每次运行log都保存一个文件
# _*_ coding: utf-8 _*_ import logging import time class Logger(object): def __init__(self, logger): self.logger = logging.getLogger(logger) self.logger.setLevel(logging.DEBUG) rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) log_path = '../log/' log_name = log_path + rq + '.log' fh = logging.FileHandler(log_name) fh.setLevel(logging.INFO) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.INFO) # 定义handler的输出格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) # 给logger添加handler self.logger.addHandler(fh) self.logger.addHandler(ch) def getlog(self): return self.logger