Django File Logger не регистрирует как исключено - PullRequest
0 голосов
/ 11 октября 2018

Я написал простой django LOGGING в своем файле settings.py, и я исключил это для регистрации всех ошибок с помощью трассировки в моем файле.Но это не так, и он просто регистрирует ошибки и все в одной строке, но трассировки регистрируются в консоли.вот моя регистрация:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
            'simple': {
                'format': '{levelname} {asctime} {name} {module}.{funcName}:{lineno} {message}',
                'style': '{',
            },
        },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'logs/debug.log',
            'formatter': 'simple'
        },
    },
    'loggers': {
        '': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': False,
        },
    },
}

Может кто-нибудь помочь мне понять, почему и что делать?спасибо.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Для этого вы можете добавить собственный формат и затем написать собственный фильтр для него, чтобы заполнить его значение:

'formatters': {

    'simple_trace': {
        'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(trace)s'
    },

Теперь CustomFilter должен быть унаследован от logging.Filter что-то вроде:

class CustomFilter(logging.Filter):

    def filter(self, log_record):

        def _get_trace():
            trace = ""
            if log_record.levelname in ['ERROR', 'CRITICAL']:
                # Get the recent stack-trace
                trace = traceback.format_exc().strip()
            return json.dumps(trace)

        log_record.trace = _get_trace()

Подобным образом вы можете добавить другой формат и просто добавить его значение в log_record.

Наконец, нам нужно унаследовать обработчик (в вашем случае - logging.FileHandler) и добавить этот пользовательский фильтр вit.

class CustomHandler(logging.FileHandler):    

    def __init__(self, *args, **kwargs):
        logging.FileHandler.__init__(self, *args, **kwargs)
        self.addFilter(CustomFilter())

при установке обработчиков нам нужно поместить наш CustomHandler в класс:

'handlers': {
    'file': {
        'level': 'DEBUG',
        'class': 'logging_custom.CustomHandler', # path to CustomHandler defination
        'filename': 'logs/debug.log',
        'formatter': 'simple_trace'
    },
},
0 голосов
/ 11 октября 2018

Форматер, который вы используете, является «простым» (как определено в конфиге:

 'formatters': {
        'simple': {
            'format': '{levelname} {asctime} {name} {module}.{funcName}:{lineno} {message}',
            'style': '{',
        },
    },

Так что поиграйте с этим в хитрости: посмотрите на это: https://docs.python.org/3/library/logging.html#logrecord-attributes

То, что вы, вероятно, хотите, это: {stack_info}

...