Python日志文件创建后始终为空的问题排查求助
Python日志文件创建后始终为空的问题排查求助
大家好,我最近碰到了一个Python日志的诡异问题,折腾了好一阵都没解决,来求助下各位!
我在测试脚本里配置了日志功能,运行完测试用例后,日志文件确实生成了,但文件内容是空的,权限显示正常(-rw-r--r-- 1 root root 0 Nov 30 12:50 /u/qiang/logs/mytest/01_test_with_simulator/001_TestWithSimulator.test_happy_path/simulator.log),完全搞不懂哪里出问题了。
初始配置代码
import logging from pathlib import Path # 日志配置部分 logging.basicConfig( level=logging.INFO, format="%(asctime)s %(message)s", datefmt="%Y%m%d %H:%M:%S", handlers=[ logging.FileHandler(args.log_file), logging.StreamHandler() ] ) logger = logging.getLogger() Path(args.log_file).chmod(0o644) logger.info("this_is_a_test")
第一次尝试(无效)
我怀疑是已有handler冲突,于是尝试先清空handler列表再重新添加,结果日志文件还是空的,没有任何变化:
logger = logging.getLogger() if logger.hasHandlers(): logger.handlers.clear() handlers = [logging.FileHandler(args.log_file), logging.StreamHandler()] for handler in handlers: handler.setFormatter(logging.Formatter(fmt="%(asctime)s %(message)s")) logger.addHandler(handler) logger.setLevel(logging.INFO) Path(args.log_file).chmod(0o644)
补充下代码结构:我的logger是在__main__命名空间下定义的,但实际调用logger.info()的地方是在一个外部类的方法里,比如:
class SimulatorRequestHandler(BaseHTTPRequestHandler): def do_POST(self): logger.info(f"request path is {self.path}") # ... 其他业务逻辑 def do_GET(self): logger.info(f"request path is {self.path}") # ... 其他业务逻辑 if __name__ == "__main__": # 命令行参数解析 parser.add_argument("--log-file", help="Simulator log file") args = parser.parse_args() # 日志配置代码写在这里
最终定位的原因
折腾了半天,居然是公司内部定制的Python库挖的坑!这个库重写了Logger.addHandler方法,里面做了类型判断:
def addHandler(self, hdlr, add_parent=True): # 注意这里的FileHandler是公司自定义的类 if (not isinstance(hdlr, (StreamHandler, FileHandler, logging.NullHandler, RotatingFileHandler, SysLogHandler))): return # ... 后续逻辑
关键问题在于:公司库的FileHandler是继承自标准库logging.FileHandler的子类,但不是同一个类对象!我用的是标准库原生的logging.FileHandler,直接触发了return分支,根本没把handler添加到logger里,自然日志写不进文件里!
真是没想到是这种内部定制的“隐形限制”导致的问题,抱歉浪费大家时间了,问题已经定位到,这个帖子可以关闭啦~




