[英]Logging at WARNING level to file and print to stdout at INFO level
我想控制我记录到文件的级别以及打印到stdout的级别。 在这种情况下,更准确地说,我希望使logger
INFO|WARNING|ERROR
消息打印到标准输出,并将WARNING|ERROR
消息记录到文件。
这是我目前拥有的:
import logging
# Logging
log_filepath = 'log_file.log'
logger = logging.getLogger('My logger')
hdlr = logging.FileHandler( log_filepath )
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.WARNING)
# Logging to stdout
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.INFO)
ch.setFormatter(formatter)
logger.addHandler(ch)
# Usage
logger.info('Hello') # Show infos but do not log to file (does not show in stdout)
logger.warning('Oops') # Show warnings and log to file
logger.error('Dang!') # Show errors and log to file
但是, INFO
级别的消息不会显示在stdout中。 这是为什么?
我在OS X Mavericks上。
您的问题是您将记录器级别设置为“警告”。 因此,您的所有处理程序都从警告级别进行记录。
您应该将文件记录器处理程序设置为“警告”级别,而将记录器本身设置为“信息”级别或未设置。 默认级别为NOTSET,这意味着所有消息都已处理或委派。
hdlr.setLevel(logging.WARNING)
logger.setLevel(logging.INFO)
如前所述,您的记录器级别已设置为“警告”,因此消息已在其中过滤并且未到达处理程序。 我也建议使用dictConfig
:
import logging.config
logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'formatter': {
'format': '%(asctime)s %(levelname)s %(message)s',
},
},
'handlers': {
'stderr': {
'class': 'logging.StreamHandler',
'formatter': 'formatter',
'level': 'INFO',
},
'log_file': {
'class': 'logging.FileHandler',
'filename': 'log_file.log',
'mode': 'a',
'formatter': 'formatter',
'level': 'WARNING',
},
},
'loggers': {
'': {
'level': 'INFO',
'handlers': ['stderr', 'log_file'],
},
},
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.