You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多脚本日志分离写入问题排查:Forgot.py日志串流至em.log

问题分析与解决方案

问题根源

  1. logging.basicConfig()的特性:Python logging模块中,basicConfig()仅在第一次调用时生效,后续调用会被直接忽略。当运行Forgot.py时,它会先导入env.py,此时env.py中的basicConfig()已将全局日志配置设置为写入em.log,后续Forgot.py里的basicConfig()不会覆盖原有配置,导致日志仍写入em.log,而forgot.log仅被创建但无内容。
  2. 语法与字段缺失问题:原代码中_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:25:29