Python 日志模块2/2

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() 配置了日志记录器。

<完>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dowhileprogramming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值