此文章转载于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
说明,为了方便注释之间的对应,已在配置文件中添加了注释,在实际使用时,需要将里面的注释给删除,不然,可能由于中文的存在,引起异常。
- 在配置文件中,首先包含了三大主要模块,loggers, handlers, formatters。对于三个主要模块其包含的内容都是通过keys进行指定,然后通过logger_ke/handler_key/formatter_key对里面的key进行具体的设置。
- loggers配置logger的模块,其中必须包含一个名字叫做root的logger,当在应用程序中,使用无参函数logging.getLogger()时,默认返回root这个logger,其他自定义logger可以通过 logging.getLogger("name") 方式进行调用。
- handlers定义handlers的信息,通过keys进行指定。里面可以指定我们日志的输出方式、日志的级别、日志的格式等。
- formatters表示设置日志的格式。
- logger-XXX对loggers中声明的logger进行逐个配置,且要一一对应,在所有的logger中,必须制定lebel和handlers这两个选项,对于非roothandler,还需要添加一些额外的option,其中qualname表示它在logger层级中的名字,在应用代码中通过这个名字制定所使用的handler,即 logging.getLogger("fileAndConsole"),handlers可以指定多个,中间用逗号隔开,比如handlers=fileHandler,consoleHandler,同时制定使用控制台和文件输出日志。propagate通常设为零,这样,当我们在handlers中设置多个处理器时,不会多次打印日志信息。
- 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将会以消息本身作为日志消息进行记录,而不添加额外的时间、日志器名称等信息;
- 在这个配置文件中设置了三种日志的输出方式,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文件中删除掉中文注释,该报错解决
浙公网安备 33010602011771号