Python';s logging.config.dictConfig()应用记录器';s的配置设置?
我一直在尝试实现一个基本的记录器,它在Python3.5中写入文件,从JSON配置文件加载设置。 我将首先显示我的代码Python';s logging.config.dictConfig()应用记录器';s的配置设置?,python,json,python-3.x,logging,Python,Json,Python 3.x,Logging,我一直在尝试实现一个基本的记录器,它在Python3.5中写入文件,从JSON配置文件加载设置。 我将首先显示我的代码 log\u config.json { "version": 1, "disable_existing_loggers": "false", "logging": { "formatters": { "basic": { "class": "logging.Formatter",
log\u config.json
{
"version": 1,
"disable_existing_loggers": "false",
"logging": {
"formatters": {
"basic": {
"class": "logging.Formatter",
"style": "%",
"datefmt": "%I:%M:%S",
"format": "[%(asctime)] %(levelname:<8s): (name:<4s): %(message)"
}
},
"handlers": {
"file": {
"class": "logging.handlers.FileHandler",
"level": "DEBUG",
"formatter": "basic",
"filename": "test.log",
"mode": "a",
"encoding": "utf-8"
}
},
"loggers": { },
"root": {
"handlers": ["file"],
"level": "DEBUG"
}
}
}
当使用python3 logger.py运行时,会产生输出(在终端中)
第一,;看着。30是“警告”的默认日志记录级别。这与我在处理程序和根记录器中设置的级别
属性的设置相矛盾。JSON似乎不正确,或者我错过了应用它的函数调用
第二;这让我想到,尽管我使用调用dictConfig()
加载配置,但我仍然需要在logger.py
文件中通过进一步调用将其应用于日志记录。这似乎有点多余,你有配置,然后必须详细应用每个设置无论如何
此外;当我试着使用它时,它就像我想的那样工作。即,;通过一个函数调用加载文件,并能够直接进行日志调用。这令人困惑,因为为什么与此格式一起使用的较旧的fileConfig()
调用比使用JSON或YAML的dictConfig()
调用提供更精简的功能
最后,我有点困惑,想弄明白这一点。我感谢你的时间和帮助
编辑:根据Alex.p的评论,我在log\u config.json
中添加了以下处理程序,并将根处理程序改为它
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "basic",
"stream": "ext://sys.stdout"
},
检查输出,与上面相同。啊,我找出了问题所在。原来是JSON。
我的工作就是基于此,它在JSON中有一个额外的logging
属性,它封装了所有记录器、处理程序等
删除该属性并使层次结构更像YAML文件(我也测试了它,并且工作正常),它可以按预期工作。我甚至可以在我的logger.py
中删除对basicConfig
的额外调用
最终JSON
{
"version": 1,
"disable_existing_loggers": "false",
"formatters": {
"basic": {
"class": "logging.Formatter",
"datefmt": "%I:%M:%S",
"format": "%(asctime)s %(levelname)s %(name)s %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "basic",
"stream": "ext://sys.stdout"
},
"file": {
"class": "logging.FileHandler",
"level": "DEBUG",
"formatter": "basic",
"filename": "test.log",
"mode": "w",
"encoding": "utf-8"
}
},
"loggers": { },
"root": {
"handlers": ["console", "file"],
"level": "DEBUG"
}
}
我现在无法测试它,但我认为您只设置了到文件的日志记录,而没有设置到控制台,因此日志记录可能使用警告
作为登录到终端的默认值。尝试将logging.StreamHandler
作为一个类添加另一个处理程序。@Alex.P谢谢您的输入。我添加了一个输出到控制台的处理程序,不幸的是它给出了相同的输出。有关我添加到JSON文件的内容,请参见我的编辑。注意,我打算将日志写入一个文件。我不知道dictconfig中可以有一个“root”字段。我从您那里了解到,如果代码在具有不同字符集的其他计算机上运行,则必须指定utf-8。
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "basic",
"stream": "ext://sys.stdout"
},
{
"version": 1,
"disable_existing_loggers": "false",
"formatters": {
"basic": {
"class": "logging.Formatter",
"datefmt": "%I:%M:%S",
"format": "%(asctime)s %(levelname)s %(name)s %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "basic",
"stream": "ext://sys.stdout"
},
"file": {
"class": "logging.FileHandler",
"level": "DEBUG",
"formatter": "basic",
"filename": "test.log",
"mode": "w",
"encoding": "utf-8"
}
},
"loggers": { },
"root": {
"handlers": ["console", "file"],
"level": "DEBUG"
}
}