Python通过配置文件配置日志

Posted on 2020-10-13 15:31  甜心卜乙  阅读(963)  评论(0)    收藏  举报

此文章转载于https://blog.csdn.net/qq_34182808/article/details/100735895

1、简介

Python添加配置的方式有好几种,这里只介绍通过config文件方式,配置log日志。相对于直接在文件中配置日志,这种配置方式可以将日志配置和代码分离,方便代码的维护和日志管理。

2、步骤

新建配置文件logging.conf,用于存放logging配置文件的信息。

 2 [loggers]
 3 # 配置logger信息。必须包含一个名字叫做root的logger,当使用无参函数logging.getLogger()时,默认返回root这个logger,其他自定义logger可以通过 logging.getLogger("fileAndConsole") 方式进行调用
 4 keys=root,file,fileAndConsole
 5 [handlers]
 6 # 定义声明handlers信息。
 7 keys=fileHandler,consoleHandler
 8 [formatters]
 9 # 设置日志格式
10 keys=simpleFormatter
11 [logger_root]
12 # 对loggers中声明的logger进行逐个配置,且要一一对应,在所有的logger中,必须制定lebel和handlers这两个选项,对于非roothandler,还需要添加一些额外的option,其中qualname表示它在logger层级中的名字,在应用代码中通过这个名字制定所使用的handler,即 logging.getLogger("fileAndConsole"),handlers可以指定多个,中间用逗号隔开,比如handlers=fileHandler,consoleHandler,同时制定使用控制台和文件输出日志
13 level=DEBUG
14 handlers=consoleHandler
15 [logger_file]
16 level=DEBUG
17 handlers=fileHandler
18 qualname=file
19 propagate=1
20 [logger_fileAndConsole]
21 level=DEBUG
22 handlers=fileHandler,consoleHandler
23 qualname=fileAndConsole
24 propagate=0
25 [handler_consoleHandler]
26 # 在handler中,必须指定class和args这两个option,常用的class包括 StreamHandler(仅将日志输出到控制台)、FileHandler(将日志信息输出保存到文件)、RotaRotatingFileHandler(将日志输出保存到文件中,并设置单个日志wenj文件的大小和日志文件个数),args表示传递给class所指定的handler类初始化方法参数,它必须是一个元组(tuple)的形式,即便只有一个参数值也需要是一个元组的形式;里面指定输出路径,比如输出的文件名称等。level与logger中的level一样,而formatter指定的是该处理器所使用的格式器,这里指定的格式器名称必须出现在formatters这个section中,且在配置文件中必须要有这个formatter的section定义;如果不指定formatter则该handler将会以消息本身作为日志消息进行记录,而不添加额外的时间、日志器名称等信息;
27 class=StreamHandler
28 args=(sys.stdout,)
29 level=DEBUG
30 formatter=simpleFormatter
31 [handler_fileHandler]
32 class=FileHandler
33 args=('dialog-analysis.log', 'a')
34 level=DEBUG
35 formatter=simpleFormatter
36 [formatter_simpleFormatter]
37 format=%(asctime)s - %(module)s - %(thread)d - %(levelname)s : %(message)s
38 datefmt=%Y-%m-%d %H:%M:%S

 

说明,为了方便注释之间的对应,已在配置文件中添加了注释,在实际使用时,需要将里面的注释给删除,不然,可能由于中文的存在,引起异常。

  1. 在配置文件中,首先包含了三大主要模块,loggers, handlers, formatters。对于三个主要模块其包含的内容都是通过keys进行指定,然后通过logger_ke/handler_key/formatter_key对里面的key进行具体的设置。
  2. loggers配置logger的模块,其中必须包含一个名字叫做root的logger,当在应用程序中,使用无参函数logging.getLogger()时,默认返回root这个logger,其他自定义logger可以通过 logging.getLogger("name") 方式进行调用。
  3. handlers定义handlers的信息,通过keys进行指定。里面可以指定我们日志的输出方式、日志的级别、日志的格式等。
  4. formatters表示设置日志的格式。
  5. logger-XXX对loggers中声明的logger进行逐个配置,且要一一对应,在所有的logger中,必须制定lebel和handlers这两个选项,对于非roothandler,还需要添加一些额外的option,其中qualname表示它在logger层级中的名字,在应用代码中通过这个名字制定所使用的handler,即 logging.getLogger("fileAndConsole"),handlers可以指定多个,中间用逗号隔开,比如handlers=fileHandler,consoleHandler,同时制定使用控制台和文件输出日志。propagate通常设为零,这样,当我们在handlers中设置多个处理器时,不会多次打印日志信息。
  6. handler_xxx在handler中,必须指定class和args这两个option,常用的class包括 StreamHandler(仅将日志输出到控制台)、FileHandler(将日志信息输出保存到文件)、RotaRotatingFileHandler(将日志输出保存到文件中,并设置单个日志wenj文件的大小和日志文件个数),args表示传递给class所指定的handler类初始化方法参数,它必须是一个元组(tuple)的形式,即便只有一个参数值也需要是一个元组的形式;里面指定输出路径,比如输出的文件名称等。level与logger中的level一样,而formatter指定的是该处理器所使用的格式器,这里指定的格式器名称必须出现在formatters这个section中,且在配置文件中必须要有这个formatter的section定义;如果不指定formatter则该handler将会以消息本身作为日志消息进行记录,而不添加额外的时间、日志器名称等信息;
  7. 在这个配置文件中设置了三种日志的输出方式,root对应控制台输出、file对应配置文件输出、fileAndConsole对应着文件和控制台同时输出

log日志文件的使用

 1 import logging.config
 2 
 3 # '读取日志配置文件'
 4 logging.config.fileConfig('logging.conf')
 5 
 6 # 创建一个日志器logger
 7 logger = logging.getLogger('fileAndConsole')
 8 logger.debug('debug')
 9 logger.info('info')
10 logger.warning('warn')
11 logger.error('error')
12 logger.critical('critical')

3、打印错误信息

1 a = 'abc'
2 try:
3     int(a)
4 except Exception as e:
5     logger.exception(e) #打印异常到文件

 

 

问题

一、module 'logging' has no attribute 'config

1、检查import logging.config 而不是import logging. 2、如果使用pycharm或者idea,通过file-invalid caches/restart试试

二、UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 45: illegal multibyte sequence

conf文件中删除掉中文注释,该报错解决