python日志(2)——logging进阶
一、logging的四大组件
名称 | 介绍 |
---|---|
Loggers | 提供应用程序代码直接使用的接口 |
Handlers | 处理程序将日志记录(由记录器创建)发送到相应的目标 |
Filters | 过滤器提供了更细粒度的工具,用于确定要输出哪些日志记录 |
Formatters | 格式化程序指定最终输出中日志记录的布局 |
1.logger
logger最常用的操作有类:配置和发生日志信息。
(1)logger=logging.getLogger(name)方法进行初始化,name可以不填。通常logger的名字对应模块名,如聊天模块、数据库模块、验证模块等。
(2) logger.setLevel(logging.DEBUG) 设置级别为debug
2.Handler
主要方法有两种:StreamHandler 和 FileHandler。(windows下可以简单理解为一个是console和文件日志,一个打印在CMD窗口上,一个记录在一个文件上)
通常情况下,在定义Handler后还要做一次setLevel(),原因是:Logger中设置的级别决定它将传递给Handler的消息严重性。每个Handler设置的setLevel()决定了该处理程序将发送哪些消息,但后者是在前者的基础上设置等级的。(如:Logger设置级别为INFO,那Handler设置的级别就只能是INFO自身或之后的级别)
3.Formatter
formatter,定义了最终log信息的顺序,结构和日志内容,(参数在上一篇文章有列举,如%(levelname)s 文本形式的日志级别)
参考格式:‘[%(asctime)s] - [%(name)s] -[%(levelname)s]- %(message)s’, ‘%Y-%m-%d %H:%M:%S’
用代码举例展示:
import logging
# 1.创建一个logger
logger = logging.getLogger('my_log')
logger.setLevel(logging.DEBUG)
# 2.1 创建一个handler,选择StreamHandler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 2.2 创建一个handler,选择FileHandler,用于写入日志文件
fh = logging.FileHandler('3.log')
fh.setLevel(logging.ERROR)
# 3、定义handler的输出格式(formatter)
formatter = logging.Formatter('[%(asctime)s] - [%(name)s] -[%(levelname)s]- %(message)s', '%Y-%m-%d %H:%M:%S')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# 4、将相应的handler添加到logger对象中
logger.addHandler(ch)
logger.addHandler(fh)
# 输出以下日志内容
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
控制台输出结果(设置等级为DEBUG):
[2023-07-11 10:24:30] - [my_log] -[DEBUG]- debug message
[2023-07-11 10:24:30] - [my_log] -[INFO]- info message
[2023-07-11 10:24:30] - [my_log] -[WARNING]- warn message
[2023-07-11 10:24:30] - [my_log] -[ERROR]- error message
[2023-07-11 10:24:30] - [my_log] -[CRITICAL]- critical message
3.log文件输出结果(设置等级为ERROR):
[2023-07-11 10:24:30] - [my_log] -[ERROR]- error message
[2023-07-11 10:24:30] - [my_log] -[CRITICAL]- critical message
二、输出日志的常用方式
(1)第一种就是上面那种显示创建Logger、Handler和formatter
(2)另一种就是创建配置文件,并使用fileConfig函数读取
代码示例:
import logging
import logging.config
logging.config.fileConfig('logging.conf')
# create logger
logger = logging.getLogger('myExample')
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
配置文件logging.conf
[loggers]
keys=root,myExample
[handlers]
keys=consoleHandler
[formatters]
keys=myFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_myExample]
level=DEBUG
handlers=consoleHandler
qualname=myExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=myFormatter
args=(sys.stdout,)
[formatter_myFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
控制台输出:
2023-07-11 10:47:29,732 - myExample - DEBUG - debug message
2023-07-11 10:47:29,733 - myExample - INFO - info message
2023-07-11 10:47:29,733 - myExample - WARNING - warn message
2023-07-11 10:47:29,733 - myExample - ERROR - error message
2023-07-11 10:47:29,733 - myExample - CRITICAL - critical message