Python多模块单日志配置问题:日志文件为空求助
核心问题点
日志级别不匹配
你的info_filehandler设置的级别是INFO,但代码中所有日志调用用的都是logger.debug——DEBUG级别低于INFO,会被该handler直接过滤,不会写入日志文件。根日志配置错误
配置里loggers的key写的是' '(空格),这不是Python logging中根日志的正确标识,根日志的key必须是''(空字符串)。当前getLogger(__name__)获取的logger无法匹配到这个错误配置的logger,导致日志没有关联到对应的文件handler。日志调用格式错误
比如logger.debug("main pid:", os.getpid())这种写法不符合logging的规范,正确的用法应该是将参数通过格式化字符串传递,否则日志消息不会包含你期望的参数内容,甚至可能导致日志无法正常输出。未定义的handler引用
配置中mypackagelogger引用了debug_consolehandler,但这个handler在handlers部分完全没定义,不过这不是日志文件为空的直接原因,但会影响该logger的日志输出。
修正步骤
1. 修复日志配置
修改dictConfig中的配置,调整根日志标识和handler级别:
d = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'detailed': { 'format': '%(asctime)s-%(levelname)s-%(name)s-%(process)d::%(module)s|%(lineno)s:: %(message)s' } }, 'handlers': { 'info_file': { 'class': 'logging.FileHandler', 'level':'DEBUG', # 改为DEBUG,让debug级日志能被写入 'formatter': 'detailed', 'filename': 'test.log', 'mode': 'w', }, 'errors_file': { 'class': 'logging.FileHandler', 'filename': 'errors.log', 'mode': 'w', 'level': 'ERROR', 'formatter': 'detailed', }, }, 'loggers': { '': { # 改为空字符串,作为根日志配置 'handlers': ['info_file','errors_file'], 'level':'DEBUG', 'propagate':False } }, # 注释掉或修复未定义的handler引用 # 'mypackage': { # 'level': 'DEBUG', # 'handlers': ['debug_console'] # debug_console未定义,需补充或删除 # }, }
2. 修正日志调用格式
把所有多参数的日志调用改为格式化字符串形式:
def starting_main_mod(thisfile): logger.debug("starting the main module") try: logger.debug("main pid: %s", os.getpid()) logger.debug("start time: %s", time.strftime("%H:%M:%S", time.localtime())) logger.debug("available worker: %s", worker_count) logger.debug("end time: %s, elapsed: %s", time.strftime("%H:%M:%S", time.localtime()), time.time()-start_time) except: logger.debug("could not write file %s to destination", thisfile) finally: logger.debug("the function is done for the file %s", thisfile)
3. 确认配置生效条件
确保config['system']['log_ind'] == 1为True,否则dictConfig不会执行,日志配置完全不生效。
额外提示
如果只需要记录INFO及以上级别日志,也可以不修改handler的level,而是把代码中的logger.debug改为logger.info,根据你的实际需求选择即可。
内容的提问来源于stack exchange,提问作者aadya bajaj

