Вот как я настраиваю регистратор в моем 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 является родительским для всех регистраторов по умолчанию
Или другим способом может быть создание регистратора для каждого приложения с ним соответствующее имя, которое может вызывать боль и повторение.
Может мне как-то помочь с этим?