Python 日志模块
使用带有内置处理器和自定义格式器的日志记录器
我们可以创建一个日志记录器对象,让它使用内建的日志处理器,和一个自定义的格式器。在这种情况下,日志处理器可以使用这个自定义格式器,并且日志处理器必须添加到日志记录器中。创建过程请参考下面的代码,用编程的方式创建一个处理器和格式器。注意,不再需要调用根日志记录器的basicConfig()
方法了:
import logging
logger = logging.getLogger("人生之中第一个日志记录器")
我的处理器 = logging.StreamHandler()
我的格式器 = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
我的处理器.setFormatter(我的格式器)
logger.addHandler(我的处理器)
logger.setLevel(logging.INFO)
logger.warning("警告")
logger.info("信息")
logger.debug("调试")
上面的代码输出如下:
2024-12-28 08:40:10,630 - 人生之中第一个日志记录器 - WARNING - 警告
2024-12-28 08:40:10,630 - 人生之中第一个日志记录器 - INFO - 信息
我们可以把同样的设置,作为实参,传递给 basicConfig()
方法,创建一个日志记录器。下面是示例代码:
import logging
logger = logging.getLogger("人生之中第一个日志记录器")
logging.basicConfig(handlers=[logging.StreamHandler()], level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
logger.warning("警告")
logger.info("信息")
logger.debug("调试")
上面的代码输出如下:
2024-12-28 08:46:41,829 - 人生之中第一个日志记录器 - WARNING - 警告
2024-12-28 08:46:41,829 - 人生之中第一个日志记录器 - INFO - 信息
以上就是使用内建处理器和自定义格式的全部内容。
在日志记录器中使用文件处理器
日志处理器可以把日志记录(发送到日志服务器、输出到终端、写入文件)不同的地方,下面是把日志写入到文件中的方法:
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', filename="log.txt")
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.warning("警告")
logger.info("信息")
logger.debug("调试")
运行这段代码,日志会被写入到 log.txt
文件里。
用编程的方式给日志记录器设置多个处理器
可以用编程的方式给日志记录器设置多个处理器,把日志一次性发送到不同的目标。在这种情况下,每个处理器可以单独设置日志级别和格式器。请参考下面的代码:
import logging
logger = logging.getLogger("人生之中第一个日志记录器")
logger.setLevel(logging.DEBUG)
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.INFO)
fileHandler = logging.FileHandler("log.txt")
fileHandler.setLevel(logging.DEBUG)
consoleFormatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
fileFormatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
consoleHandler.setFormatter(consoleFormatter)
fileHandler.setFormatter(fileFormatter)
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)
logger.warning("警告")
logger.info("信息")
logger.debug("调试")
尽管我们给 consoleHandler
设置了 INFO
日志级别,给 fileHanlder
设置了 DEBUG
日志级别,但是只有当日志记录器级别较低时,它们才有效。这就是为什么我们必须在程序开始时将日志记录器的日志级别设置为DEBUG
,处理程序级别的日志记录级别可以是DEBUG
或任何更高级别,低于这个级别的无效。在为应用程序设计日志策略时,这一点非常重要。
可以试一下,如果把日志记录器的级别改为WARNING
,那么上面的代码就只会会记录警告日志了。
使用配置文件配置日志记录器
可以使用更加方便的配置文件,来配置日志记录器。生产环境中的日志配置和开发环境中的日志配置可能会不同;在生产环境中,在时候需要动态调整日志级别。在上述情况中,使用配置文件配置日志记录器就非常有必要。
配置文件可以是 JSON
格式,也可以是 YAML
格式。下面就是一个 YAML
格式的配置文件:
version: 1
formatters:
console_formatter:
format: '%(name)s - %(levelname)s - %(message)s'
file_formatter:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
console_handler:
class: logging.StreamHandler
level: DEBUG
formatter: console_formatter
stream: ext://sys.stdout
file_handler:
class: logging.FileHandler
level: INFO
formatter: file_formatter
filename: logging.log
loggers:
my_logger:
level: DEBUG
handlers: [console_handler, file_handler]
propagate: no
root:
level: ERROR
handlers: [console_handler]
下面是使用这个配置文件的代码:
import logging
import logging.config
import yaml
with open('logging.conf.yaml', 'r', encoding='utf-8') as f:
config = yaml.load(f, Loader=yaml.FullLoader)
logging.config.dictConfig(config)
logger = logging.getLogger("my_logger")
logger.warning("警告")
logger.info("信息")
logger.debug("调试")
配置加载后,我们使用了 dictConfig()
,而不是 basicConfig()
配置了日志记录器。
<完>