繁体   English   中英

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

[英]how to print in a specific log file using a logger without printing in the supervisord log file in a tornado application

我目前正在开发由不同的独立模块组成的Tornado应用程序。

该应用程序使用超级用户运行,所以现在,每次我使用

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时如何写在主管文件上?

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

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

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

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


要解决此问题,您至少有两个选择。

  1. 不要再使用logging.xxxx 而是使用另一个命名记录器,例如console_logger
  2. 设置fiscal_logger.propagateFalse

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM