记录到多个文件和控制台
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.log
和 submission_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)
我正在尝试使用 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.log
和 submission_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)