前言:python日志记录的系列文章的前面两篇文章已经介绍了,模块级别的日志记录与面向类与对象的日志记录,即:
python日志记录系列教程,内置logging模块(一)——直接使用logging模块的基础日志记录
python日志记录系列教程,内置logging模块(二)——logging日志进阶教程(五大核心组件)
本文将在此基础之上介绍日志文件的配置方式。
一、日志记录三种配置方式简介
开发者可以通过三种方式配置日志记录:
- (1)使用调用上面列出的配置方法的 Python 代码显式创建记录器Logger、处理器Handler和格式化器Formatter
又包括两种实现形式,第一种是通过模块级别的函数来实现,即系列文章第一篇;
另一种是通过面向类与对象的方式来设计,参考系列文章的第二篇;
- (2)创建日志配置文件并使用
fileConfig()
函数读取它。- (3)创建配置信息字典并将其传递给
dictConfig()
函数。
参考文档:
https://docs.python.org/zh-cn/3.7/library/logging.config.html#module-logging.config
https://docs.python.org/3.5/howto/logging-cookbook.html
https://www.cnblogs.com/yyds/p/6885182.html
二、三种日志配置方式的简单示例
2.1 通过python代码来配置(五步走策略)
import logging
# 第一步:创建Logger并进行设置
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# 第二步:创建Handler并设置
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 第三步:创建Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 第四步:将Formatter添加到Handler
ch.setFormatter(formatter)
# 第五步:将Handler添加到Logger
logger.addHandler(ch)
# 通过logger对象来记录日志信息
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
'''
2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
2005-03-19 15:10:26,620 - simple_example - INFO - info message
2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
2005-03-19 15:10:26,697 - simple_example - ERROR - error message
2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
'''
2.2 通过xxx.conf配置文件来配置日志——fileConfig()
以下 Python 模块创建的记录器、处理程序和格式化程序几乎与上面列出的示例中的相同,唯一的区别是对象的名称:
import logging
import logging.config
logging.config.fileConfig('logging.conf')
# 创建logger
logger = logging.getLogger('simpleExample')
# 通过logger记录日志
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
这是 logging.conf 文件:
[loggers]
keys=root,simpleExample
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
输出几乎与不基于配置文件的示例相同:
$ python simple_logging_config.py
2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
2005-03-19 15:38:55,979 - simpleExample - INFO - info message
2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
你可以看到配置文件方法比 Python 代码方法有一些优势,主要是配置和代码的分离以及非开发者轻松修改日志记录属性的能力。
2.3 通过dictConfig()来配置日志
在 Python 3.2 中,引入了一种新的配置日志记录的方法,使用字典来保存配置信息。 这提供了上述基于配置文件方法的功能的超集,并且是新应用程序和部署的推荐配置方法。 因为 Python 字典用于保存配置信息,并且由于你可以使用不同的方式填充该字典,因此你有更多的配置选项。 例如,你可以使用 JSON 格式的配置文件,或者如果你有权访问 YAML 处理功能,则可以使用 YAML 格式的文件来填充配置字典。当然,你可以在 Python 代码中构造字典,通过套接字以 pickle 形式接收它,或者使用对你的应用程序合理的任何方法。
以下是与上述相同配置的示例,采用 YAML 格式,用于新的基于字典的方法:
version: 1
formatters:
simple:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
loggers:
simpleExample:
level: DEBUG
handlers: [console]
propagate: no
root:
level: DEBUG
handlers: [console]
有关使用字典进行日志记录的更多信息,请参阅 Configuration functions 。
本文仅仅是针对官方文档做了一个简单的整理,关于后面两种配置方法的详细信息,后面有时间再做说明。
更多关于logging的复杂以及实用使用方法,可以参考官方文档的 《logging cookbook》