You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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里,自然日志写不进文件里!

真是没想到是这种内部定制的“隐形限制”导致的问题,抱歉浪费大家时间了,问题已经定位到,这个帖子可以关闭啦~

火山引擎 最新活动