Django LOGGING не печатает на консоль и файл - PullRequest
0 голосов
/ 25 марта 2020

Я столкнулся со странным поведением Django Логгеров.

Я разрабатываю интерфейсное приложение, используя Django. Во время службы входа в систему я делаю некоторые запросы к определенным компонентам и использую вызовы log.warning (), чтобы увидеть поток запросов.

Журналы работали отлично, пока я не решил добавить конфигурацию ЛОГИРОВАНИЯ, чтобы печатать выходные данные журналов в файле, так как я хочу развернуть приложение через Docker, и я хочу периодически проверять файлы журналов ,

Когда я добавил следующую Django конфигурацию, связанную с ведением журнала:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'detailed': {
            'class': 'logging.Formatter',
            'format': "[%(asctime)s] - [%(name)s:%(lineno)s] - [%(levelname)s] %(message)s",
        }
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'INFO',
            'formatter': 'detailed',
        },
        'file': {
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': "{}/am.log".format(BASE_DIR),
            'mode': 'w',
            'formatter': 'detailed',
            'level': 'INFO',
            'maxBytes': 2024 * 2024,
            'backupCount': 5,
        },
    },
    'loggers': {
        'am': {
            'level': 'INFO',
            'handlers': ['console', 'file']
        },
    }
}

Запись перестала работать. Файл, указанный в конфигурации регистрации, am.log, действительно создан, но в этот файл ничего не печатается. Даже запись в консоль не происходит.

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

Я буду sh всем вам хорошего дня!

1 Ответ

1 голос
/ 25 марта 2020

Используя ключ "am" в конфигурации 'loggers', вы определяете один регистратор с именем "am":

'loggers': {
        'am': {   #  <-- name of the logger
            'level': 'INFO',
            'handlers': ['console', 'file']
        },
    }

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

logger = logging.getLogger("am")
logger.warning("This is a warning")

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

logger = logging.getLogger(__name__)  # <-- this logger will be named after the module, e.g. your app name.

Затем в своей конфигурации ведения журнала вы можете указать поведение ведения журнала для модуля (для приложения):

'loggers': {
        'my_app': {  # <-- logging for my app
            'level': 'INFO',
            'handlers': ['console', 'file']
        },
        'django': {   # <-- logging for Django module
            'level': 'WARNING',
            'handlers': ['console', 'file']
        },
    }

Или, если вы просто хотите вести все то же самое, используйте root ('') регистратор, у которого нет имени, просто пустая строка:

'loggers': {
        '': {   # <-- root logger
            'level': 'INFO',
            'handlers': ['console', 'file']
        },
    }
...