记录到多个文件和控制台

Logging to multiple files AND the console

我正在尝试使用 Python 中的 logging 模块来记录文件和控制台。这是我目前所拥有的:

# configure logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s: %(levelname)s: %(message)s')

# main file logger
main_file_logger = logging.getLogger('main_file')
main_file_logger.addHandler(logging.FileHandler('logs/main.log'))

def loggingHelper(message, level='info', submission_id=None):
    method_name = level.lower().strip()
    if method_name not in ['debug', 'info', 'warning', 'error', 'critical']:
        method_name = 'info'

    if not submission_id:
        method_callable = getattr(main_file_logger, method_name)
        method_callable(message)
    else:
        submission_file_logger = logging.getLogger(f'submission_{submission_id}_file')
        submission_file_logger.addHandler(logging.FileHandler(f'logs/submission_{submission_id}.log'))

        method_callable = getattr(submission_file_logger, method_name)
        method_callable(message)

我想要完成的是:每次调用 loggingHelper 时,我都想向控制台打印一条消息。除此之外,我想将相同的内容打印到 logs/main.log。所以控制台和 main.log 应该得到同样的东西。最后,如果指定了 submission_id,我还想创建一个名为 submission_id.log 的文件,并且我还想在该文件上记录消息(同时还记录到控制台和 main.log) .

设置好之后,我运行下面的代码行:

from utils import loggingHelper

loggingHelper('1', level='debug')
loggingHelper('2', level='info')
loggingHelper('3', level='warning', submission_id=3)
loggingHelper('4', level='critical', submission_id=4)
loggingHelper('5', level='debug')

这将我想要的内容打印到控制台:

2021-08-19 10:10:01,966: DEBUG: 1
2021-08-19 10:10:01,966: INFO: 2
2021-08-19 10:10:01,967: WARNING: 3
2021-08-19 10:10:01,968: CRITICAL: 4
2021-08-19 10:10:01,968: DEBUG: 5

但是 main.log 看起来像这样:

1
2
5

submission_3.log 看起来像这样:

3

submission_4.log 看起来像这样:

4

None 的日志文件具有正确的格式。此外,主日志丢失了打印到 submission_3.logsubmission_4.log 的所有日志消息。我已经尝试了几种不同的配置,但其中 none 也按照我想要的方式工作。

没关系,修复它。这是我的做法:

# configure logging
LOGGING_FORMAT = '%(asctime)s: %(levelname)s: %(message)s'
LOGGING_FORMATTER = logging.Formatter(LOGGING_FORMAT)
LOGGING_LEVEL_THRESHOLD = logging.DEBUG

logging.basicConfig(level=LOGGING_LEVEL_THRESHOLD, format=LOGGING_FORMAT)

# main file logger
main_file_handler = logging.FileHandler('logs/main.log')
main_file_handler.setFormatter(LOGGING_FORMATTER)

main_logger = logging.getLogger('main')
main_logger.setLevel(LOGGING_LEVEL_THRESHOLD)
main_logger.addHandler(main_file_handler)

def loggingHelper(message, level='info', submission_id=None):
    method_name = level.lower().strip()
    if method_name not in ['debug', 'info', 'warning', 'error', 'critical']:
        method_name = 'info'

    method_callable = getattr(main_logger, method_name)
    method_callable(message)

    if submission_id:
        submission_file_handler = logging.FileHandler(f'logs/submission_{submission_id}.log')
        submission_file_handler.setFormatter(LOGGING_FORMATTER)

        submission_file_logger = logging.getLogger(f'submission_{submission_id}')
        submission_file_logger.setLevel(LOGGING_LEVEL_THRESHOLD)
        submission_file_logger.propagate = False
        submission_file_logger.addHandler(submission_file_handler)

        method_callable = getattr(submission_file_logger, method_name)
        method_callable(message)