天天看点

python logging.basicConfig()调用多次以哪次为准?

今天在调程序的时候就遇到了上述问题,先猜一下下边两段代码的运行结果?有没有“日志级别”打印出来?:

logging.basicConfig(
            format='[%(processName)s-%(process)d] [%(filename)s:%(lineno)s] %(message)s',
            level=logging.DEBUG,
            datefmt='%Y-%m-%d %H:%M:%S'
        )

logging.basicConfig(
            format='%(levelname)7s [%(processName)s-%(process)d] [%(filename)s:%(lineno)s] %(message)s',
            level=logging.DEBUG,
            datefmt='%Y-%m-%d %H:%M:%S'
        )           

在测试之前,按照惯性思维去想,结果应该是会有“日志级别”输出吧?毕竟后边的赋值会覆盖前边的赋值,但真实结果却是:

[MainProcess-23556] [t.py:37] sd
[MainProcess-23556] [t.py:24] operator           

并没有输出“日志级别”!为什么呢?经过一番百度,在官网的文档中找到了答案:

python logging.basicConfig()调用多次以哪次为准?

原来只会以第一次的赋值为准啊!除非使用 force 参数,再来试一把 force 参数:

logging.basicConfig(
            format='[%(processName)s-%(process)d] [%(filename)s:%(lineno)s] %(message)s',
            level=logging.DEBUG,
            datefmt='%Y-%m-%d %H:%M:%S'
        )

logging.basicConfig(
            format='%(levelname)7s [%(processName)s-%(process)d] [%(filename)s:%(lineno)s] %(message)s',
            level=logging.DEBUG,
            datefmt='%Y-%m-%d %H:%M:%S',
            force=True
        )           

这次结果就是后边的一种格式了:

INFO [MainProcess-23633] [t.py:38] sd
   INFO [MainProcess-23633] [t.py:25] operator           

为什么会这样设计呢?

看一下上述官方文档所在章节就知道了:

python logging.basicConfig()调用多次以哪次为准?

原来是为了线程安全啊!