python-logging
一、Logging概念总结:
Logger是一个树形层级结构,Logger可以包含一个或多个Handler和Filter,即Logger与Handler或Fitler是一对多的关系;
一个Logger实例可以新增多个Handler,一个Handler可以新增多个格式化器或多个过滤器,而且日志级别将会继承。
二、logging工作流程
三、logging配置文件支持以下三种方式加载
1)、通过logging.conf配置文件加载;logging.config.fileconfig('logging.conf')

# 1、记录器logger #定义记录器 [loggers] keys=root #定义根记录器 [logger_root] level=DEBUG handlers=streamhandler,filehandler #--------------------------------------------------------------------------------- # 2、 处理器handler #定义所有处理器 [handlers] keys=filehandler,streamhandler #定义子处理器 [handler_streamhandler] class=StreamHandler level=DEBUG formatter=streamformatter args=(sys.stdout,) #定义子处理器 [handler_filehandler] class=FileHandler level=ERROR formatter=fileformatter args=('file.log','a') #--------------------------------------------------------------------------------- # 3、 格式化器formatter #定义所有格式化器 [formatters] keys=fileformatter,streamformatter [formatter_fileformatter] format=%(asctime)s - %(name)s - %(levelname)s - PID:%(process)s - %(message)s [formatter_streamformatter] format=%(asctime)s - %(name)s - %(levelname)s - PID:%(process)s - %(message)s
import logging import logging.config logging.config.fileConfig("logging.conf") logger = logging.getLogger("example01") logger.debug('This is debug message') logger.info('This is info message') logger.warning('This is warning message')
import logging import logging.config logging.config.fileConfig("logging.conf") logger = logging.getLogger("example02") logger.debug('This is debug message') logger.info('This is info message') logger.warning('This is warning message')
[loggers] keys=root [handlers] keys=consoleHandler,fileHandler [formatters] keys=formatter [logger_root] level=DEBUG handlers=consoleHandler,fileHandler [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=formatter args=(sys.stdout,) [handler_fileHandler] class=handlers.TimedRotatingFileHandler level=DEBUG formatter=formatter args=('logs/test.log', 'D', 1, 30) [formatter_formatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=%Y-%m-%d %H:%M:%S
2)、通过logging.json配置文件加载;

{ "version":1, "disable_existing_loggers":false, "formatters":{ "simple":{ "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s" } }, "handlers":{ "console":{ "class":"logging.StreamHandler", "level":"DEBUG", "formatter":"simple", "stream":"ext://sys.stdout" }, "info_file_handler":{ "class":"logging.handlers.RotatingFileHandler", "level":"INFO", "formatter":"simple", "filename":"info.log", "maxBytes":"10485760", "backupCount":20, "encoding":"utf8" }, "error_file_handler":{ "class":"logging.handlers.RotatingFileHandler", "level":"ERROR", "formatter":"simple", "filename":"errors.log", "maxBytes":10485760, "backupCount":20, "encoding":"utf8" } }, "loggers":{ "my_module":{ "level":"ERROR", "handlers":["info_file_handler"], "propagate":"no" } }, "root":{ "level":"INFO", "handlers":["console","info_file_handler","error_file_handler"] } }
3)、通过logging.yaml配置文件加载;

version: 1 disable_existing_loggers: False formatters: simple: format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s" handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout info_file_handler: class: logging.handlers.RotatingFileHandler level: INFO formatter: simple filename: info.log maxBytes: 10485760 backupCount: 20 encoding: utf8 error_file_handler: class: logging.handlers.RotatingFileHandler level: ERROR formatter: simple filename: errors.log maxBytes: 10485760 backupCount: 20 encoding: utf8 loggers: my_module: level: ERROR handlers: [info_file_handler] propagate: no root: level: INFO handlers: [console,info_file_handler,error_file_handler]
StreamHandler
创建方法:
sh = logging.StreamHandler(stream=None)
FileHandler
创建方法:
fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
NullHandler
NullHandler类位于核心logging包,不做任何的格式化或者输出。
本质上它是个“什么都不做”的handler,由库开发者使用。
Formatter 格式化器
使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。
创建方法:
formatter = logging.Formatter(fmt=None, datefmt=None)
其中,fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用'%(message)s'。如果不指明datefmt,将使用ISO8601日期格式。
Filter 过滤器
Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤。Filter基类只允许特定Logger层次以下的事件。
例如用‘A.B’初始化的Filter允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’等记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串来初始化,所有的事件都接受。
创建方法:
filter = logging.Filter(name='')
四、名词解释
Logging.Formatter:这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。 Logging.Logger:Logger是Logging模块的主体,进行以下三项工作: 1. 为程序提供记录日志的接口 2. 判断日志所处级别,并判断是否要过滤 3. 根据其日志级别将该条日志分发给不同handler 常用函数有: Logger.setLevel() 设置日志级别 Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler Logger.addFilter() 添加一个Filter,过滤作用 Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。 常用函数有: setLevel() 设置级别 setFormatter() 设置Formatter
五、Formatter格式器
format常用格式说明 %(levelno)s: 打印日志级别的数值 %(levelname)s: 打印日志级别名称 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0] %(filename)s: 打印当前执行程序名 %(funcName)s: 打印日志的当前函数 %(lineno)d: 打印日志的当前行号 %(asctime)s: 打印日志的时间 %(thread)d: 打印线程ID %(threadName)s: 打印线程名称 %(process)d: 打印进程ID %(message)s: 打印日志信息
六、handler处理器
logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件 logging.FileHandler: 日志输出到文件 日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler logging.handlers.BaseRotatingHandler logging.handlers.RotatingFileHandler logging.handlers.TimedRotatingFileHandler logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets logging.handlers.DatagramHandler: 远程输出日志到UDP sockets logging.handlers.SMTPHandler: 远程输出日志到邮件地址 logging.handlers.SysLogHandler: 日志输出到syslog logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志 logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer logging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器
示例1: 基于时间切割日志文件

# 基于时间回滚日志文件 import logging from logging.handlers import TimedRotatingFileHandler formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') """ filename:日志文件名的prefix; when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下: “S”: Seconds “M”: Minutes “H”: Hours “D”: Days “W”: Week day (0=Monday) “midnight”: Roll over at midnight interval: 滚动周期,单位有when指定,比如:when=’D’,interval=1,表示每天产生一个日志文件 backupCount: 表示日志文件的保留个数 """ #每隔5秒钟切割一份日志文件,日志总文件数量保存20份。 # time_rotaing_filehandler = TimedRotatingFileHandler(filename='AA-AA-00-', when='S', interval=5, backupCount=20,encoding='utf-8') #每分钟切换1份日志文件,日志总文件数量保存20份。 # time_rotaing_filehandler = TimedRotatingFileHandler(filename='AA-AA-00-', when='M', interval=1, backupCount=20,encoding='utf-8') 每天晚上12:00切换1份日志文件,日志总文件数量保存30份,即保留30天日志文件。 time_rotaing_filehandler = TimedRotatingFileHandler(filename='AA-AA-00-', when='midnight', interval=1, backupCount=30,encoding='utf-8') time_rotaing_filehandler.suffix = "%F-%r.log" time_rotaing_filehandler.setLevel(logging.INFO) time_rotaing_filehandler.setFormatter(formatter) logger.addHandler(time_rotaing_filehandler)
实例2: 基于日志文件大小回滚日志文件

import logging from logging.handlers import RotatingFileHandler #定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5) Rthandler.setLevel(logging.INFO) formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') Rthandler.setFormatter(formatter) logging.getLogger('').addHandler(Rthandler)
参考:https://www.cnblogs.com/mq0036/p/12846216.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)