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 中国大陆许可协议进行许可。

posted @   心比天高xzh  阅读(29)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起