背景
前段时间,将公司框架的日志机制从所有线程\进程都输出日志到一个文件里,改造成线程\进程将各自的日志输出到各自的日志文件里,由于公司是内网涉密环境,所有资料都无法带出,这里总结仅描述思路。
假设通过logging模块封装好后可供调用的日志方法是:
myInfo(msg)
改造前
所有线程\进程调用myInfo,myInfo中使用的都是同一个加载同样文件处理器的记录器。所以不同的线程\进程,日志出口都是同一个文件。
改造后
- 框架依然调用myInfo(msg)方法输出日志。区别在于,在myInfo执行时,会使用当前线程\进程的记录器去输出日志,每个线程\进程都会创建不同的记录器,且每个线程\进程的记录器都加载不同的文件处理器。
- 提前创建好一个字典列表对象,用于缓存记录器对象。
[{线程\进程名字:记录器对象},{线程\进程名字:记录器对象}]
- 在myInfo执行时,会判断当前线程\进程的记录器对象是否已经存在,判断方法是通过当前线程\进程独特的字符串标志(比如说线程\进程名字),是否包含在上述字典列表里。
- 如果是,则从字典列表里取出记录器对象。如果否,则创建记录器对象,同时将该对象加入到字典列表中。
- 创建记录器对象时,不同的线程\进程应该加载不同的文件处理器。
下图是各个线程/进程对应的记录器、处理器、格式器的关系。
不同线程/进程的格式器可以是相同,但记录器和处理器需要不同。
tips
如果暂时不了解记录器和处理器的含义,请先了解logging模块中的Logger,filter,formatter,handler几大对象。其中Logger是记录器,filter是过滤器,formatter是格式器,handler是处理器。可百度这几个对象的含义和用法。