我想创建两个不同的记录器,这就是我所拥有的:
import logging def logger(logger_name, level): """Create logger with given name and level""" # Set up logger logger = logging.getLogger(logger_name) logger.setLevel(logging.DEBUG) # print(logger.handlers) formatter = logging.Formatter('%(levelname)-8s %(asctime)s %(message)s') handler = logging.StreamHandler() handler.setFormatter(formatter) # Set level handler.setLevel(level) # Add handlers to logger logger.addHandler(handler) return logger LOGGER1 = logger(logger_name='main_app', level=logging.INFO) LOGGER2 = logger(logger_name='main_app.module', level=logging.DEBUG) LOGGER1.info('one') LOGGER2.info('two') LOGGER1.info('three')
这是记录的内容:
INFO 2017-01-25 11:49:45,209 one INFO 2017-01-25 11:49:45,209 two INFO 2017-01-25 11:49:45,209 two INFO 2017-01-25 11:49:45,210 three
我在这做错了什么?
如何防止LOGGER2
多次记录同一事物?
将属性更改propagate
为False
,如下所示
def logger(logger_name, level): """Create logger with given name and level""" # Set up logger logger = logging.getLogger(logger_name) #stops logging messages being passed to ancestor loggers logger.propagate = False #....
从文件 ;
如果[Logger.propagate]的计算结果为true,则除了连接到此记录器的任何处理程序之外,记录到此记录器的事件将传递给更高级别(祖先)记录器的处理程序.消息直接传递给祖先记录器的处理程序 - 既不考虑有问题的祖先记录器的级别也不考虑过滤器.
默认值logger.propagate
是True
在构造函数中设置getLogger
.
需要注意的是一个记录器的名称可以是一个"期间分隔层次值",让父子关系(如你在两个对象都做main.app
和main.app.module
,后者是儿童).
请参阅记录器对象部分 ;
该名称可能是一个以句点分隔的层次值,如foo.bar.baz(例如,它也可能只是普通的foo).在分层列表中较低的记录器是列表中较高的记录器的子项.