Да, вам понадобится фильтр для вашего debug_handler, однако вы не можете добавить фильтры через fileConfig .
Из документов:
fileConfig() API более старый, чем API dictConfig (), и не предоставляет функциональных возможностей для покрытия определенных аспектов ведения журнала.Например, вы не можете настроить объекты Filter, которые обеспечивают фильтрацию сообщений за пределами простых целочисленных уровней, используя fileConfig ().Если вам нужно иметь экземпляры Filter в конфигурации журналирования, вам нужно будет использовать dictConfig ().Обратите внимание, что будущие усовершенствования функциональности конфигурации будут добавлены в dictConfig (), поэтому стоит подумать о переходе на этот более новый API, когда это будет удобно.
Поэтому рассмотрите возможность использования dictConfig (у вас не должно быть никаких причин не переходить на dictConfig
, независимо от вашей конфигурации, так как она лучше, новее, более гибкая и та, где будут добавлены все хорошие вещи в будущем).
Итак, ваш конфиг, переведенный на dictConfig
, будет выглядеть примерно так (это можно вставить и протестировать как есть):
import logging
from logging import config
class FileFilter:
"""Allow only LogRecords whose severity levels are below ERROR."""
def __call__(self, log):
if log.levelno < logging.ERROR:
return 1
else:
return 0
logging_config = {
'version': 1,
'formatters': {
'error_formatter': {
'format': '{asctime} - {name} - {levelname} - line {lineno} - {message}',
'style': '{',
'datefmt': '%d/%m/%y - %H:%M:%S',
},
'debug_formatter': {
'format': '{asctime} - {name} - {levelname} - {message}',
'style': '{',
'datefmt': '%d/%m/%y - %H:%M:%S',
},
},
'filters': {
'file_filter': {
'()': FileFilter,
},
},
'handlers': {
'console_handler': {
'class': 'logging.StreamHandler',
'formatter': 'debug_formatter',
},
'error_handler': {
'class': 'logging.FileHandler',
'formatter': 'debug_formatter',
'level': 'ERROR',
'filename': 'errors.log',
},
'debug_handler': {
'class': 'logging.FileHandler',
'formatter': 'debug_formatter',
'filters': ['file_filter'],
'filename': 'debug.log',
},
},
'root': {
'level': 'DEBUG',
'handlers': ['console_handler', 'error_handler', 'debug_handler'],
},
}
config.dictConfig(logging_config)
logger = logging.getLogger(__name__)
# these get logged to the console and only to the debugs.log file
# if you want just the debug messages logged to the file, adjust the filter
logger.debug('this is a debug message')
logger.info('this is an info message')
logger.warning('this is a warning message')
# this get logged to the console and only to the errors.log file
logger.error('this is an error message')
logger.critical('this is a critical message')
, который выдаст:
27/09/19 - 07:52:44 - __main__ - DEBUG - this is a debug message # also to debug.log
27/09/19 - 07:52:44 - __main__ - INFO - this is an info message # also to debug.log
27/09/19 - 07:52:44 - __main__ - WARNING - this is a warning message # also to debug.log
27/09/19 - 07:52:44 - __main__ - ERROR - this is an error message # also to errors.log but not to debug.log
27/09/19 - 07:52:44 - __main__ - CRITICAL - this is a critical message # also to errors.log but not to debug.log
Если вы по какой-то таинственной причине (я не вижу ни одного) настаиваете на использовании более старого API, fileConfig
, см. этот ответ , в котором используются настраиваемые средства форматирования, которые достигают того же самого, без фильтров.