今天在调程序的时候就遇到了上述问题,先猜一下下边两段代码的运行结果?有没有“日志级别”打印出来?:
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
并没有输出“日志级别”!为什么呢?经过一番百度,在官网的文档中找到了答案:

原来只会以第一次的赋值为准啊!除非使用 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
为什么会这样设计呢?
看一下上述官方文档所在章节就知道了:
原来是为了线程安全啊!