django - ansible.cfg 文件劫持我的 django 项目日志文件输出路径
问题描述
我有一个奇怪的django日志文件输出问题,我在我的django 1.11.11项目中这样使用ansible 2.5.0模块,文件中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
我确实在我的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,
},
},
}
解决方案
您是否偶然将 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 记录器本身的类比设置:https ://docs.python.org/3/library/logging.config.html?highlight=disable_existing_loggers#logging.config.fileConfig
我的案例的一个注意事项:我使用logging.handlers.WatchedFileHandler
默认情况下似乎继承了以前的记录器。
如果这解决了您的问题,请提供反馈!
推荐阅读
- php - 尝试传递变量以在 Excel 中生成报告时出错
- c - 线程 1:EXC_BAD_ACCESS (code=1, address=0x0) 错误在运行期间不断发生
- sql - 当 R 中的 PostgreSQL 中的列号不同时如何附加两个数据框
- javascript - 不重定向到条带结帐页面 node.js
- amazon-web-services - 使用 api 调用结果作为 CloudFormation 资源的参数
- mysql - 将mysql“show grants”命令的输出保存到变量中
- vba - 改进 accdb 文件中的 INSERT-Access-VBA
- sql - PLSQL 过程迭代 SELECT 语句并提取列值
- email - Linkedin 电子邮件提取扩展概念
- php - POST 方法的 Slim 3 集成测试始终不包含标题