写代码过程中,为了方便问题定位,经常需要打印信息,但是太多的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