一些日志记录的简单记录:
用basicConfig
可以进行配置
注意日志的等级:
上述代码得到的日志如下(最基础的日志):
关于记录下来的日志格式可以有很多内容:如等级、发生的时间、发生的位置、发生的进程、发生的线程、发生的调用栈等,当日志进行格式化时,可以支持占位符
示例:
日志处理方式:
默认情况下:输出到标准错误stderr中,为了和print使用的标准输出stdout区分开来,pycharm会将日志显示为红色。
如果现在需要:
1.输出到指定的流,比如stdout
中,则通过stream
参数指定输出目标
2.输出到指定的文件,通过filename filemode encoding errors
参数指定文件的打开方式
filemode
默认值是a
即append 附加,errors
默认值是加斜杠转义
注意,不能和输出到流共同使用
日志记录流程
先去检查日志的等级,达到等级才去创建日志记录对象,判断日志是否会被拒绝被过滤,不被拒绝(记录),再交给日志的处理器,处理器再次判断等级(是否达到处理等级),判断是否会被过滤,ok再进行处理(格式化),回到主流程判断是否要交给父处理器再进行循环
- 日志记录器
1 提供方法,供程序创建日志
2 通过等级、过滤器来筛选要处理的日志
3 把要处理的日志交给日志处理器进行处理
默认是root记录器,就是在上述第一次运行日志脚本时看到的root
虽然有默认的,但是我们会创建自己的日志记录器,让不同的日志记录器有自己的执行模式
import logginglogging.basicConfig()logger_root = logging.getLogger()
logger_a = logging.getLogger("a")
logger_b = logging.getLogger("b")logger_root.warning("1111")
logger_a.warning("2222")
得到的结果:
如果在项目中,用不同的记录器就可以记录更加清晰的内容
代码示例:
import logginglogging.basicConfig(level=logging.INFO, filename="test.log", filemode="w", encoding="utf-8"
)
logger_code = logging.getLogger("code") # 业务代码
logger_test = logging.getLogger("test") # 测试代码def add(a, b):logger_code.info(f"收到参数:{a=}, {b=}")c = a + blogger_code.info(f"计算结果:{c=}")return cdef test_add():a = 1for b in range(5):logger_test.info(f"收到的参数为:{a=},{b=}")c = add(a, b)_c = a + blogger_test.info(f"预期结果为:{_c=}, 实际结果为:{c=}")if c == _c:logger_test.warning("测试通过")else:logger_test.warning("测试失败")if __name__ == "__main__":test_add()
结果为:
这样就方便后期再次操作,如在命令行中打开,通过grep进行筛选
当然也可以在配置中就进行筛选,可以配置logger
常用的配置选项:等级、过滤器、处理方法
如logger_test.setLevel(logging.DEBUG)
当在多个模块中使用logging时要注意,当记录器前缀相同时有父记录器子记录器的关系,子处理器的等级会和父记录器保持一致
注意python中可以通过
logging.getLogger(__name__)#为本模块创建记录器
而且即便在不同的文件中,get同一个名字的logger,得到的就是同一个logger
getLogger首先尝试获取,如果不存在就会创建,如果存在则直接返回
- 日志处理器(有等级判断)
可以选择将日志内容发送(保存)到指定地方,比如输出到TCP,输出到多个文件中等,只需要通过logger.addHandler(……)
添加处理器,将创建好的处理器添加给指定“记录器”,或者在basicConfig
中配置
处理器也是设置等级,通过处理器的差异化设置,使得不同级别的日志会按照不同的方式进行处理
logger.addHandler(……)
添加处理器
日志格式的配置
formatter = logging.Formatter()
,将设置好的格式给处理器hander.setFormatter(formatter)
,因为记得我们最开始的流程图,是处理器在最后才会用到格式化。注意,一个处理器只能有一个格式。
集中式配置
基于代码的配置可维护性可读性都不够好,我们用基于文件的配置,将配置信息和代码进行分离。
logging模块支持基于文件的配置,如ini格式,也支持基于字典的模式,字典数据可以保存为各种文件格式,如json、yaml、csv、mysql
import logging.configconfig = {}logging.config.dictConfig(config)
写好config文件之后,可以通过import json
来对config进行json文件的转换
字典转换成yaml也是同理,记得先pip install pyyamyaml.safe_dump(config, f);
json转换为字典:loads
yaml转为字典: