【问题标题】:ansible.cfg file hijack my django project log file output pathansible.cfg 文件劫持我的 django 项目日志文件输出路径
【发布时间】:2019-01-08 02:20:05
【问题描述】:

我有一个奇怪的django日志文件输出问题,我在我的django 1.11.11项目中像from ansible.plugins.callback import CallbackBase这样使用ansible 2.5.0模块,而/etc/ansible/ansible.cfg文件中的log_path设置实际上对我的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 

我确实在我的django设置中设置了LOGGING,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,
        },
    },
}

【问题讨论】:

    标签: django logging ansible


    【解决方案1】:

    您是否偶然将 Ansible 作为 Python 模块导入?

    TLDR:当您将 Ansible 作为模块导入时,Ansible lib 中的记录器实例首先被实例化,并且您最终会使用 Ansible 的记录器,除非您将 disable_existing_loggers 设置为 True

    为什么会这样?

    Python logging 是一个单例,这意味着在给定进程的内存中只能存在一个 logger 对象。

    库(例如 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,默认情况下它似乎继承了以前的记录器。

    如果这解决了您的问题,请提供反馈!

    【讨论】:

    • 是的,我将 ansible 作为 python 模块导入。和disable_existing_loggers setting to True。作品。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2011-05-19
    • 2012-09-02
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多