在tornado应用程序中,如何使用记录器打印特定日志文件而不打印supervisord日志文件

2024-04-16 08:31:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在开发一个由不同独立模块组成的Tornado应用程序。你知道吗

应用程序使用supervisord运行,所以现在,每次我使用

logging.info()

日志打印在主管日志上,我同意。你知道吗

问题是,现在的管理器日志文件充满了来自不同模块的非常不同的内容,非常难以读取,所以我现在希望每个模块使用一个特定的记录器,每个记录器在不同的文件上写入。你知道吗

所以我创建了记录器:

def set_log_config(filename, when='h', interval=1, backupCount=0):
    directory = os.path.dirname(os.path.abspath(filename))
    create_folder(directory)

    app_log = logging.getLogger("tornado.application.fiscal")

    handler = logging.handlers.TimedRotatingFileHandler(filename, when=when, interval=interval, backupCount=backupCount)
    formatter = logging.Formatter('[%(levelname)s %(asctime)s.%(msecs)d %(module)s:%(lineno)d] %(message)s', datefmt='%y%m%d %H:%M:%S')

    handler.setFormatter(formatter)
    app_log.addHandler(handler)
    app_log.setLevel(logging.INFO)
    return app_log

fiscal_logger = set_log_config(
        '/home/dir/Trace/fiscal/fiscal_module_{:%Y-%m-%d}.log'.format(datetime.now(), when='midnight', interval=1, backupCount=21)
    )

记录器工作,它写在特定的文件,但它也总是写在主管日志文件,我不明白为什么。你知道吗

所以我的问题是:当我使用财务报表时,如何在特定的文件上写_记录器.info当我使用日志记录信息?你知道吗


Tags: 模块文件infologapp应用程序loggingfilename
1条回答
网友
1楼 · 发布于 2024-04-16 08:31:40

首先,我解释为什么记录器也会写入主管日志文件。你知道吗

写入主管日志文件意味着当前记录器链中存在StreamHandler。你知道吗

logging.info基本上等于logging.getLogger().info,这意味着它使用root记录器。此外,如果root没有处理程序,则logging.xxx将自动将StreamHandler添加到root记录器。你知道吗

默认情况下,日志将沿着记录器链传播(例如,"tornado.application.fiscal"的记录器链是root -> tornado -> application -> fiscal)。因此fiscal_logger的日志被传播到root记录器,并由rootStreamHandler处理。这就是为什么您会在主管日志文件中看到这些日志。你知道吗


要解决此问题,您至少有两个选项。你知道吗

  1. 不要再使用logging.xxxx。相反,请使用另一个命名的记录器,如console_logger。你知道吗
  2. fiscal_logger.propagate设置为False。你知道吗

相关问题 更多 >