ansible.cfg文件劫持了我的django项目日志文件输出路径

时间:2019-01-08 02:20:06

标签: django logging ansible

我有一个奇怪的django日志文件输出问题,我在django 1.11.11项目中使用了ansible 2.5.0模块,例如... const autocomplete = new google.maps.places.Autocomplete(input as HTMLInputElement); ... ,在{{1}中使用了from ansible.plugins.callback import CallbackBase设置}文件实际上对我的django项目日志文件输出生效,就像劫持一样:

log_path

我所有的django日志输出到/etc/ansible/ansible.cfg,这很奇怪

# /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设置中设置了LOGGING,django设置也生效,并且输出如下:

/var/log/ansible.log

在django设置中定义的同一日志级别中,这将是同一django项目的两个日志文件:

# /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 

1 个答案:

答案 0 :(得分:1)

您是否有机会将Ansible作为Python模块导入?

TLDR :当您将Ansible作为模块导入时,Ansible lib中的logger实例首先被实例化,最终您将使用Ansible的logger,除非您将disable_existing_loggers设置为{{1} }。

为什么会这样?

Python日志记录是单例的,这意味着在给定的进程中,记录器中只有一个对象可以存在于内存中。

图书馆(例如Ansible)也可以在内部使用记录器。就我而言,Ansible的记录器已在Ansible全局范围内的某个地方实例化。 https://github.com/ansible/ansible/blob/devel/lib/ansible/utils/display.py#L65

导入库时,记录器已经实例化,因此您自己的记录器将继承现有的日志处理程序,最终将日志写入两个日志文件中。

如何防止这种情况发生?

请尝试将True设置切换为disable_existing_loggers

用于记录的Django文档:https://docs.djangoproject.com/en/2.1/topics/logging/#configuring-logging

Python记录器本身的分析设置:https://docs.python.org/3/library/logging.config.html?highlight=disable_existing_loggers#logging.config.fileConfig

我的情况有一个注释:我使用了True,它似乎默认继承了以前的记录器。

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