python logging 模块的使用
示例代码如下:
import logging
import sys
def logging_init():
logger = logging.getLogger()
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler("test.log", mode='w')
file_handler.setLevel(level=logging.INFO)
formatter1 = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(module)s - %(levelname)s: %(message)s")
file_handler.setFormatter(formatter1)
logger.addHandler(file_handler)
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(level=logging.INFO)
formatter2 = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s")
stream_handler.setFormatter(formatter2)
logger.addHandler(stream_handler)
logging_init()
logging.info("hello")
设置和引用时的logging level会影响最后的输出。logging包默认对输出分成了6个等级:
设置为高等级时低等级不会输出。例如设置成info等级,debug信息就无法输出。
addHandler指的是输出对象,如示例,file_handler对应的是test.log,stream_handler对应的是标准输出。执行过后,hello会同时输出到文件与控制端。
同时,输出对象的形式由Formatter分别设置,logging在这一部分自定义变量如下:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息
logging模块工作流程如下:
官网链接
https://docs.python.org/zh-cn/3/library/logging.html
filter的创建与使用
示例:
class levelfilter(logging.Filter):
def filter(self,record):
if record.levelno == logging.INFO:
return False
return True
对应的record是logging模块的LogRecord对象,所有属性可以查看官方链接。上面示例就是过滤掉所有INFO等级的日志不输出。
可以对logger或者handler添加filter,如logger.addFilter(levelfilter())
一个日志分别经过logger与handler的filter过后才能正常输出。
父子记录器
可以知道,logging.getLogger()获得的是ROOT记录器,logging.getLogger('a')获得的是名为'a'的记录器,logging.getLogger('a.b')获得的是名为'a.b'的记录器。
从logging的记录器名称来看,从父亲到子代可以理解为:ROOT>'a'>'a.b'
也就是说'a.b','a'记录器的propagate设置为False,'a.b'的记录器进行记录时同时会调用'a'记录器和ROOT记录器进行记录,于是就进行了三次记录,同理,
如果'a'记录器的propagate设置为False,'a.b'的记录器进行记录时则不会调用上层记录器。
参考链接1与参考链接2
本文作者:心比天高xzh
本文链接:https://www.cnblogs.com/xzh-personal-issue/p/17171647.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步