我目前正在开发由不同的独立模块制成的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时如何写在主管文件上?
答案 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}}处理。这就是为什么您在主管日志文件中看到那些日志的原因。
要解决此问题,至少有两个选项 。
StreamHandler
。而是使用另一个命名记录器,例如logging.xxxx
。console_logger
设置为fiscal_logger.propagate
。