有这么一段python代码python
import threading import time import requests from decimal import Decimal, ROUND_DOWN import logging import os import sys import randomfrom utils import common, filter, cache from configs import settings logging.basicConfig(level=logging.INFO, format='%(levelname)s %(asctime)s [line:%(lineno)d] %(message)s')
无论怎么设置basicConfig里的值,一直都没法生效,后来看到一个说法:在调用basicConfig函数以前,由于导入了其余包,而其余包里又导入了logging包,就致使设置basicConfig不成功。一排查,确实在common和cache包里又导入了logging。app
调整代码顺序,以下:dom
import os import sys import random import threading import time import requests from decimal import Decimal, ROUND_DOWN import logging logging.basicConfig(level=logging.INFO, format='%(levelname)s %(asctime)s [line:%(lineno)d] %(message)s') this_dir = os.path.abspath(os.path.dirname(__file__)) sys.path.append(os.path.join(this_dir, '..')) from utils import common, filter, cache from configs import settings
确实,就生效了。函数
经排查,“在调用basicConfig函数以前,由于导入了其余包,而其余包里又导入了logging包,就致使设置basicConfig不成功” 这个说法还不够,应该是 “在调用basicConfig函数以前,由于导入了其余包,而其余包里又导入了logging包,且也调用了basicConfig函数,就致使设置basicConfig不成功”。ui
为何呢?上 basicConfig 源码:this
def basicConfig(**kwargs): _acquireLock() try: if len(root.handlers) == 0: filename = kwargs.get("filename") if filename: mode = kwargs.get("filemode", 'a') hdlr = FileHandler(filename, mode) else: stream = kwargs.get("stream") hdlr = StreamHandler(stream) fs = kwargs.get("format", BASIC_FORMAT) dfs = kwargs.get("datefmt", None) fmt = Formatter(fs, dfs) hdlr.setFormatter(fmt) root.addHandler(hdlr) level = kwargs.get("level") if level is not None: root.setLevel(level) finally: _releaseLock()
由于,在其余地方已经调用过了basicConfig函数,在当前文件中再调用basicConfig的时候,会发现 len(root.handlers) 的长度已经再也不为0了,因此致使不走 if len(root.handlers) == 0,因此设置的日志格式无效。spa