使用Python logging模块已经有一段时间了,为了更好的理解log工作方式,看了一下其源码,后总结如下: 日志模块中有以下核心组件:
- 1.Logger类:日志处理类
- 2.Filter类:过滤器类(是Logger、Handler等类父类)
- 3.Handler类:日志处理类,有各种子类(FileHandler,StreamHandler等)
- 4.LogRecord类:日志记录对象,代表一条日志记录
- 5.Manager类:日志对象管理器,维护所有Log实例,和其父子关系
- 6.Formatter类:日志记录格式化对象
1. logging模块的日志的根为RootLogger看下面示例代码:
logging.basicConfig()
logging.info('')
或
logger = logging.getLogger()
logger.info('')
其都是使用RootLogger,name为'root',level为WARNING,我理解成日志树的根(最高父日志实例)。
2.logging root看下面的示例代码:
logger1 = logging.getLogger('example')
print logger1.parent.name
#output
root
从上可看出,任何Logger实例,都是RootLogger的子节点,root是任何Logger name的最高父节点
3.logging 父子关系
看下面示例代码
logger1 = logging.getLogger('example')
logger2 = logging.getLogger('example.child1')
logger2 = logging.getLogger('example.child2')
print logger1.parent.name
print logger2.parent.name
#output
root
example
example
其父子结构如下:
-root
-example
-example.child1
-example.child2
4.logging.config.fileConfig
其原理就是从logconfig配置文件中读取filters,formmaters,handlers,loggers等信息,最后生成一个预置的logger实例池, 在外部使用:
logging.config.fileConfig("logging.conf")
#create logger
logger = logging.getLogger("example")
其原理是先从预置的日志管理器中检索有无name为example的log实例,如果有则直接使用,若没有,则新增。