I would like to control at which level I log to file, and at which level I print to stdout. To be more precise in this case, I wish to make logger
print INFO|WARNING|ERROR
messages to stdout and log WARNING|ERROR
messages to file.
This is what I have currently:
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
However, INFO
level messages do not show up in stdout. Why is that?
I'm on OS X Mavericks.
Your problem is that you set level of logger to WARNING. Therefore all your handlers are logging from warning level.
You should set file logger handler to level WARNING and logger itself to level INFO or not set. Default level is NOTSET which means that all messages are processed or delegated.
hdlr.setLevel(logging.WARNING)
logger.setLevel(logging.INFO)
As already pointed out, your logger level is set to WARNING, so messages are filter in it and do not reach the handler. I would also suggest using 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'],
},
},
})
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.