[英]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,并由root
的StreamHandler
。 这就是为什么您在主管日志文件中看到那些日志的原因。
要解决此问题,您至少有两个选择。
logging.xxxx
。 而是使用另一个命名记录器,例如console_logger
。 fiscal_logger.propagate
为False
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.