файл ansible.cfg похитить мой путь вывода файла журнала проекта django - PullRequest
0 голосов
/ 08 января 2019

У меня странная проблема с выводом файла журнала django, я использую модуль ansible 2.5.0 в своем проекте django 1.11.11, как этот from ansible.plugins.callback import CallbackBase, и настройка log_path в файле /etc/ansible/ansible.cfg фактически вступает в силу для мой файл журнала проекта django, например, угон:

# /etc/ansible/ansible.cfg file
# logging is off by default unless this path is defined
# if so defined, consider logrotate
log_path = /var/log/ansible.log

Весь мой лог django выводит на /var/log/ansible.log, что довольно странно

# /var/log/ansible.log
2019-01-07 17:49:22,271 django.server "GET /docs/ HTTP/1.1" 200 1391207
2019-01-07 17:49:23,262 django.server "GET /docs/schema.js HTTP/1.1" 200 111440 

Я настроил LOGGING в моих настройках django, настройки django также вступают в силу, и результат выглядит так:

# /var/log/django_debug.log
"GET /docs/ HTTP/1.1" 200 1391207
"GET /docs/schema.js HTTP/1.1" 200 111440

Это будут два файла журнала для одного проекта django с тем же уровнем журнала, который я определил в настройках django:

# django settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': '/var/log/django_debug.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}

1 Ответ

0 голосов
/ 24 января 2019

Вы случайно импортировали Ansible как модуль Python?

TLDR : Когда вы импортируете Ansible в качестве модуля, экземпляр регистратора внутри Ansible lib сначала создается, и в итоге вы используете регистратор Ansible, если только вы не установите disable_existing_loggers в True.

Почему это происходит?

Ведение журнала Python является одноэлементным, что означает, что в данном процессе в памяти может существовать только один объект регистратора.

Библиотеки (такие как Ansible) также могут использовать регистраторы внутри. В моем случае регистратор Ansible был создан где-то в глобальной области Ansible. https://github.com/ansible/ansible/blob/devel/lib/ansible/utils/display.py#L65

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

Что делать, чтобы предотвратить это?

Пожалуйста, попробуйте переключить настройку disable_existing_loggers на True.

Django документы для регистрации: https://docs.djangoproject.com/en/2.1/topics/logging/#configuring-logging

Аналогичные настройки для самого Python logger: https://docs.python.org/3/library/logging.config.html?highlight=disable_existing_loggers#logging.config.fileConfig

Одна заметка для моего случая: я использовал logging.handlers.WatchedFileHandler, который, по-видимому, наследовал предыдущие регистраторы по умолчанию.

Пожалуйста, оставьте отзыв, если это решило вашу проблему!

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