我有一个具有调试级别的日志记录模块的基本配置 - 现在我想创建另一个仅具有错误级别的记录器。我怎样才能做到这一点?
问题是除了错误处理程序之外还调用了根处理程序 - 这是我想避免的事情。
import logging
fmt = '%(asctime)s:%(funcName)s:%(lineno)d:%(levelname)s:%(name)s:%(message)s'
logging.basicConfig(level=logging.DEBUG, format=fmt)
logger = logging.getLogger('Temp')
logger.setLevel(logging.ERROR)
handler = logging.StreamHandler()
handler.setLevel(logging.ERROR)
logger.addHandler(handler)
logger.error('boo')
Run Code Online (Sandbox Code Playgroud)
上面的代码打印了两次 boo ,而我只期望一次,而且我不知道如何处理这个恼人的问题......
In [4]: logger.error('boo')
boo
2021-04-26 18:54:24,329:<module>:1:ERROR:Temp:boo
In [5]: logger.handlers
Out[5]: [<StreamHandler stderr (ERROR)>]
Run Code Online (Sandbox Code Playgroud)
dra*_*fly 16
root记录器:上级中的上级,执行普通记录器所做的所有事情,但不会将接收到的日志传递给其他任何人。handler:记录器的私人承包商,实际上对日志进行任何操作,例如。格式化日志,将其写入文件或stdout,或通过 tcp/udp 发送。formatterhandler:适用于日志的主题、设计。basicConfig:配置记录器的快捷方式root。当您希望他完成所有工作并且他的所有低级别记录器都将日志传递给他时,这非常有用。basicConfig设置 为并添加将日志输出到 的。rootWARNINGStreamHandlerstderrformat并使用快捷方式basicConfig来配置root记录器。您希望根记录器执行所有实际的日志记录操作TempERROR级别及以上的日志。StreamHandler. 默认情况下输出到哪个stdout。ERROR级别及以上级别Temp记录器,这变得5.多余,因为级别设置为3. root记录器完成这项工作,因为1.!ERROR使用记录器记录了 。您的记录器在级别上Temp接受了一个字符串。然后告诉它的处理程序处理该字符串。由于该处理程序没有分配任何内容,因此它按原样输出字符串到:
之后,记录器将字符串传递给他的上级记录器。booERRORformatterstdoutbooTempbooroot
由于日志级别为> ,记录root器接受了日志。然后记录器告诉其处理程序处理该字符串。该处理程序将格式字符串应用于. 添加了时间戳、添加了位置、添加了传递日志的logger名称等,
最后将结果输出到:ERRORWARNINGrootbooboostderr2021-04-26 18:54:24,329:<module>:1:ERROR:Temp:boo
由于您的代码完全按照您的指示执行,因此您必须告诉它尽可能多的细节。
basicConfig只在你懒的时候使用。通过删除basicConfig线,您的问题就解决了。logger = logging.getLogger(__name__)以便记录器具有模块的名称。查看日志并确切地知道import path它来自哪个日志。propagate属性一起传递到链上。在你的情况下,logger.propagate = False也解决了问题。root并让根执行实际的日志记录。为什么?
propagating=False。root。您可以集中控制日志记录。| 归档时间: |
|
| 查看次数: |
3419 次 |
| 最近记录: |