如何在不使用龙卷风应用程序的受监管日志文件中进行打印的情况下,使用记录器在特定日志文件中进行打印

时间:2018-08-08 08:03:04

标签: python python-2.7 logging tornado supervisord

我目前正在开发由不同的独立模块制成的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)
    )

记录器可以工作,可以写在特定文件上,但也总是写在主管日志文件中,我不明白为什么。

所以我的问题是:当我使用tax_logger.info时如何写在特定文件上,而当使用logging.info时如何写在主管文件上?

1 个答案:

答案 0 :(得分:1)

首先,我解释一下为什么您的记录器还写入主管日志文件。

写入主管日志文件意味着您当前的记录器链中有一个StreamHandler

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

默认情况下,日志将沿记录器链传播(例如,"tornado.application.fiscal"的记录器链为root -> tornado -> application -> fiscal)。因此,fiscal_logger的日志将传播到root记录器,并由root的{​​{1}}处理。这就是为什么您在主管日志文件中看到那些日志的原因。


要解决此问题,至少有两个选项

  1. 请勿再使用StreamHandler。而是使用另一个命名记录器,例如logging.xxxx
  2. console_logger设置为fiscal_logger.propagate