经常有在用,不过没有仔细看过,对于如何比较合理的,结构化的,规范的,比如根据不同的进程和目标来记录的话就会比较苦恼。所以来看一下。
logging.info 看起
无论我们是用 logging 还是用 logging.getLogger() 返回的 logger 来记录,都会调用相关的方法。
def info(msg, *args, **kwargs): |
设置一下默认设置,我们看到,其实有一个作为根的 logger 存在。
root = RootLogger(WARNING) |
同时还有一个 Logger 的管理器。
如果这个管理器的 handlers 数量为0,那么就会进行一个默认设置 basicConfig()
。当然,我们经常也会以一些键值参数来调用这个方法,具体就不说了。这个函数的默认行为是,如果 root 已经有 handler 了,就什么都不做;否则的话就以一个 StreamHandler 来写到 sys.stderr,使用 BASIC_FORMAT来作为格式化。
getLogger()
这个函数,实际上就是从 Logger.manager 里面获取一个 Logger 实例,我们的 manager 内部保存了一个日志记录器的字典列表,根据键值来获取。如果已经存在就直接返回,没有的话就新建。
多个日志的两种思路
为 root 添加多个 handler
这个个是比较简单,所有的地方都可以直接使用 logging 进行记录日志,但需要对特定的 handler 设置过滤器,记录对应的信息。
单独使用每个 logger
这样做的好处就是比较干净,不好的地方就是每个地方要使用都需要 logging.getLogger() 一下。