Python多脚本日志分离写入问题排查:Forgot.py日志串流至em.log
问题分析与解决方案
问题根源
logging.basicConfig()的特性:Python logging模块中,basicConfig()仅在第一次调用时生效,后续调用会被直接忽略。当运行Forgot.py时,它会先导入env.py,此时env.py中的basicConfig()已将全局日志配置设置为写入em.log,后续Forgot.py里的basicConfig()不会覆盖原有配置,导致日志仍写入em.log,而forgot.log仅被创建但无内容。- 语法与字段缺失问题:原代码中
_logconfig={'hostname': _host)存在括号不匹配的语法错误,且默认LogRecord对象没有hostname字段,直接在格式化字符串中使用%(hostname)s会触发报错。
解决方案
放弃依赖basicConfig()的全局配置,每个脚本手动创建**独立的FileHandler**绑定到自身的logger实例,并通过自定义Filter注入hostname字段,确保日志输出到对应文件且格式化正常。
修改后的代码
env.py
import logging # 自定义Filter,用于注入hostname字段 class HostnameFilter(logging.Filter): def __init__(self, hostname): self.hostname = hostname def filter(self, record): record.hostname = self.hostname return True # 配置专属logger FORMAT = '%(hostname)s : %(message)s' logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 避免模块重复导入时重复添加Handler if not logger.handlers: handler = logging.FileHandler("/balaji/empty/log/em.log") formatter = logging.Formatter(FORMAT) handler.setFormatter(formatter) handler.addFilter(HostnameFilter("Admin")) logger.addHandler(handler) server = "DEV" host = "Admin"
Trigger.py
import logging from env import host class HostnameFilter(logging.Filter): def __init__(self, hostname): self.hostname = hostname def filter(self, record): record.hostname = self.hostname return True FORMAT = '%(hostname)s : %(message)s' logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) if not logger.handlers: handler = logging.FileHandler("/balaji/empty/log/em.log") formatter = logging.Formatter(FORMAT) handler.setFormatter(formatter) handler.addFilter(HostnameFilter(host)) logger.addHandler(handler) # 测试日志输出 logger.info("Trigger.py 执行日志")
Forgot.py
import logging from env import host class HostnameFilter(logging.Filter): def __init__(self, hostname): self.hostname = hostname def filter(self, record): record.hostname = self.hostname return True FORMAT = '%(hostname)s : %(message)s' logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) if not logger.handlers: handler = logging.FileHandler("/balaji/empty/log/forgot.log") formatter = logging.Formatter(FORMAT) handler.setFormatter(formatter) handler.addFilter(HostnameFilter(host)) logger.addHandler(handler) # 测试日志输出 logger.info("Forgot.py 执行日志")
关键要点
- 每个脚本使用
__name__作为logger名称,确保模块级别的独立性,避免互相干扰。 - 手动创建
FileHandler并指定对应日志文件,完全脱离全局配置的限制。 - 添加
if not logger.handlers:判断,防止模块被多次导入时重复添加Handler导致日志重复输出。 - 通过自定义
HostnameFilter为日志记录注入hostname字段,解决原代码中格式化字段缺失的问题。
内容的提问来源于stack exchange,提问作者Yes_par_row
相关产品推荐
相关产品推荐

