python - Python日志记录-具有根记录器的多个模块中的配置文件
问题描述
当我在配置文件中配置根记录器时。其他子记录器不遵循相同的配置。
主文件
import logging
import logging.config
import test
logging.config.fileConfig("logger.ini")
logger = logging.root
logger.critical("main")
test.f()
测试.py
import logging
logger = logging.getLogger(__name__)
def f():
print "inside f"
logger.critical("Test")
print logger.parent.name
print logger.parent.handlers
记录器.ini
[loggers]
keys=root
[handlers]
keys=console
[formatters]
keys=form
[logger_root]
level=DEBUG
handlers=console
[handler_console]
class=StreamHandler
formatter=form
args=()
[formatter_form]
format=%(levelname)s:%(name)s:%(message)s
当我运行我没有的程序时
CRITICAL:root:main
inside f
root
[<logging.StreamHandler object at 0x00000000021C4908>]
但我没有来自其他文件的日志。我认为如果孩子没有任何处理程序,他会将日志发送给他的父母。知道为什么我看不到日志吗?或如何解决?
解决方案
这里发生的情况是,获取的记录器test.py
是在您调用之前创建logging.config.fileConfig("logger.ini")
的main.py
。一旦fileConfig
被调用,任何未在配置文件中指定的预先存在的记录器都会被删除。
我可以建议两种方法来解决这个问题:
不要
logging.getLogger
在模块的全局范围内调用,但只有在函数/方法中需要记录器时才调用更改您的代码,以便在调用时
fileConfig()
指定:logging.config.fileConfig("logger.ini", disable_existing_loggers=False)
。这会导致在应用配置之前创建的任何记录器都将被维护而不是禁用。
有关选项 #2 的详细信息,请参阅https://docs.python.org/2/library/logging.config.html#logging.config.fileConfig。
推荐阅读
- javascript - 如何从 Google Sheet 获取日期类型的 HTML 元素?
- liquibase - 有没有办法在运行时使用 Liquibase 将属性替换作为参数传递?请分享一个例子?
- python - python中的API请求和“进程以退出代码0完成”
- laravel - Laravel 查询以将 json 数据输出为选择列表。如何修改现有代码以连接两个值
- flutter - 如何使变量保持不变?
- javascript - 反应不保存勾选的复选框
- python - PANDAS dataframe python: wanting to sort values by group
- angular - 角度列表包含元素但长度为 0
- html - KnockoutJS MVC 部分查看选中信息
- json - 使用 VBA (Access 2010) 下标解析 JSON 超出范围错误