user13145920
user13145920

Reputation: 189

Using same logger to seperate file outout with python logging

with the following code I use to write info logs to info.log and error log to error.log

import logging
logger_info = logging.getLogger('info')
logger_err = logging.getLogger('err')
logger_info.setLevel(logging.INFO)
logger_err.setLevel(logging.WARNING)
info_file_handler = logging.FileHandler('info.log')
error_file_handler = logging.FileHandler('error.log')
logger_info.addHandler(info_file_handler)
logger_err.addHandler(error_file_handler)
logger_info.info('info test')
logger_err.error('error test')

Now I using 2 logger : logger_err and logger_info.

Can I marge those 2 logger to 1 logger , that logger_info.info will write into info.log and logger_info.error will write to error.log

Upvotes: 1

Views: 39

Answers (2)

Serge Ballesta
Serge Ballesta

Reputation: 148880

It is uncommon because logging usually processes messages that have a higher severity than a threshold, but it is possible by using 2 handlers and a custom filter:

  • you attach a handler to the logger with a level of ERROR and make it write to the error.log file
  • you attach a second handler to the same logger with a level of INFO and make it write to the info.log file
  • you add a custom filter to that second handler to reject messages with a level higher than INFO

Demo:

class RevFilter:
"""A filter to reject messages ABOVE a maximum level"""
    def __init__(self, maxLev):
        self.maxLev = maxLev
    def filter(self, record):
        return record.levelno <= self.maxLev

hinf = logging.FileHandler('/path/to/info.log')
herr = logging.FileHandler('/path/to/error.log')
herr.setLevel(logging.ERROR)
hinf.setLevel(logging.INFO)
hinf.addFilter(RevFilter(logging.INFO))

logger = logging.getLogger(name)
logger.addHandler(hinf)
logger.addHandler(herr)

logger.setLevel(logging.INFO) # or lower of course...

From that point, the file error.log will receive messages send by logger at a level of ERROR or above, and info.log will only receive message at a level of INFO, neither higher nor lower.

Upvotes: 1

Adam Oellermann
Adam Oellermann

Reputation: 303

I'm not sure I understand what you're looking to achieve, but if you're simply wanting to log both types of messages to the same file, you can just specify the same output file when you create the two FileHandlers:

import logging
logger_info = logging.getLogger('info')
logger_err = logging.getLogger('err')
logger_info.setLevel(logging.INFO)
logger_err.setLevel(logging.WARNING)
info_file_handler = logging.FileHandler('combined.log')
error_file_handler = logging.FileHandler('combined.log')
logger_info.addHandler(info_file_handler)
logger_err.addHandler(error_file_handler)
logger_info.info('info test')
logger_err.error('error test')

Upvotes: 0

Related Questions