Настройка одного пользовательского логгера для всего проекта django - PullRequest
0 голосов
/ 30 мая 2020

Вот как я настраиваю регистратор в моем Django проекте в настоящее время

В файле settings.py

import os
import logging.config
from django.utils.log import DEFAULT_LOGGING

logger = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
            'dark': {
                'format': '{asctime} {name} {levelname} {message}',
                'datefmt': '%d-%b-%y %H:%M:%S',
                 'style': '{',
            },
    },
    'handlers': {
            'file': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',
                'filename': 'logs.log',
                'formatter': 'dark'
            },
        },
    'loggers': {
            'darkbot': {
                'handlers': ['file'],
                'level': 'DEBUG',
                'propagate': False,
            },
        },
}


logging.config.dictConfig(logger)

Журналы записываются в файл, как и ожидалось, но проблема, с которой я сталкиваюсь, заключается в том, что имя модуля в журналах остается постоянным, не имеет значения, в каком модуле записывается этот журнал

Например, если я использую это

logger = logging.getLogger("darkbot")
logger.info("started reading new file")

Тогда мой журнал выглядит примерно так

30-мая-20 12:22:56 darkbot INFO начал читать новый файл

Как вы можете см. Я получаю darkbot в качестве имени модуля, который является постоянным. По которому я не могу отследить модуль, из которого он изначально возник.

, но если я заменю свое имя регистратора именем django app, так как одно из моих django имя приложения будет fileparser

import os
import logging.config
from django.utils.log import DEFAULT_LOGGING

logger = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
            'dark': {
                'format': '{asctime} {name} {levelname} {message}',
                'datefmt': '%d-%b-%y %H:%M:%S',
                 'style': '{',
            },
    },
    'handlers': {
            'file': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',
                'filename': 'logs.log',
                'formatter': 'dark'
            },
        },
    'loggers': {
            'fileparser': {  # here
                'handlers': ['file'],
                'level': 'DEBUG',
                'propagate': False,
            },
        },
}


logging.config.dictConfig(logger)

Тогда, если я использую регистратор в любом файле с в приложении fileparser следующим образом

logger = logging.getLogger(__name__)
logger.info("started reading new file")

Тогда мой журнал выглядит как-то вот так

30-May-20 12:50:54 fileparser.scripts.main INFO начал читать новый файл

Как видите, я получаю fileparser.scripts.main в качестве имени модуля, чтобы я мог проследить, какой модуль записал этот журнал

Но разве нет способа использовать только один регистратор для всего проекта при использовании

logger = logging.getLogger(__name__)
logger.info("started reading new file")

Один из способов, который я могу придумать, - это переопределить регистратор root, но будет ли это безопасно. Я не уверен, что это вызовет какие-либо проблемы с ведением журнала по умолчанию Django или нет, поскольку root является родительским для всех регистраторов по умолчанию

Или другим способом может быть создание регистратора для каждого приложения с ним соответствующее имя, которое может вызывать боль и повторение.

Может мне как-то помочь с этим?

...