Как только войти в журнал с определенным уровнем имени Python - PullRequest
2 голосов
/ 26 сентября 2019
[loggers]
keys=root

[handlers]
keys=consoleHandler,errorHandler,debugHandler

[formatters]
keys=errorFormatter,debugFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,errorHandler,debugHandler
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=debugFormatter
args=(sys.stdout,)

[handler_errorHandler]
class=FileHandler
level=ERROR
formatter=errorFormatter
args=('errors.log',)

[handler_debugHandler]
class=FileHandler
level=DEBUG
formatter=debugFormatter
args=('debugs.log',)

[formatter_errorFormatter]
style={
format=
    {asctime} - {name} - {levelname} - line {lineno} - {message}
datefmt=%d/%m/%y - %H:%M:%S

[formatter_debugFormatter]
style={
format={asctime} - {name} - {levelname} - {message}
datefmt=%d/%m/%y - %H:%M:%S

Если у меня есть файл конфигурации, как указано выше, как я могу получить доступ к debugHandler, чтобы я мог делать как debugHandler.addFilter(my_custom_filter)?

Я пытаюсь сделать так, чтобы DEBUG сообщения отправлялись на debugs.log, а ERROR сообщения отправлялись на errors.log, но в настоящее время ERROR сообщения также отправляются на * 1011.* который я не хочу.Теперь, основываясь на этой записи StackOverflow , это достигается с помощью фильтров, но для добавления фильтра мне нужен объект logging.Handler, и я не знаю, как его получить.

Заранее спасибо: ~)

1 Ответ

0 голосов
/ 27 сентября 2019

Да, вам понадобится фильтр для вашего 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, см. этот ответ , в котором используются настраиваемые средства форматирования, которые достигают того же самого, без фильтров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...