返回

Python日志记录:同时记录到文件并打印到标准输出

python

## 在 Python 中同时记录到文件和打印到 stdout

问题

在 Python 中,如何配置日志记录以同时将日志消息记录到文件和打印到标准输出 (stdout)?

解决方案

在 Python 中,可以通过使用多个处理程序来实现此目的,每个处理程序负责执行特定的任务。以下是逐步说明:

1. 配置文件处理程序

设置一个文件处理程序来记录日志消息到指定文件。示例代码:

import logging
import logging.handlers

logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)

# 按文件大小旋转的文件处理程序
handler = logging.handlers.RotatingFileHandler(
    "my_log.log", maxBytes=(1048576 * 5), backupCount=7
)

# 文件处理程序格式化器
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)

# 将文件处理程序添加到日志记录器
logger.addHandler(handler)

2. 配置流处理程序

创建一个流处理程序来将日志消息打印到 stdout。示例代码:

# 创建流处理程序
stream_handler = logging.StreamHandler()

# 设置流处理程序格式化器
stream_handler.setFormatter(formatter)

# 将流处理程序添加到日志记录器
logger.addHandler(stream_handler)

3. 使用日志记录器

使用日志记录器同时将日志消息记录到文件和打印到 stdout。示例代码:

# 记录调试消息
logger.debug("这条消息将被记录到文件和打印到 stdout")

完整代码示例

import logging
import logging.handlers

logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)

# 文件处理程序
file_handler = logging.handlers.RotatingFileHandler(
    "my_log.log", maxBytes=(1048576 * 5), backupCount=7
)

# 文件处理程序格式化器
file_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
file_handler.setFormatter(file_formatter)

# 流处理程序
stream_handler = logging.StreamHandler()

# 流处理程序格式化器
stream_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
stream_handler.setFormatter(stream_formatter)

# 将处理程序添加到日志记录器
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

# 记录调试消息
logger.debug("这条消息将被记录到文件和打印到 stdout")

结论

通过使用多个处理程序,你可以灵活地将日志记录消息同时记录到文件和打印到 stdout,从而方便地查看和分析日志信息。

常见问题解答

1. 如何自定义日志消息的格式?

通过修改处理程序的格式化器来实现,例如:handler.setFormatter(logging.Formatter("%(asctime)s - %(message)s"))

2. 如何更改日志记录级别?

使用 logger.setLevel() 方法,例如:logger.setLevel(logging.INFO)

3. 如何记录异常信息?

使用 logging.exception() 函数,例如:try: ... except Exception: logging.exception()

4. 如何关闭日志记录?

使用 logging.disable() 函数,例如:logging.disable(logging.CRITICAL)

5. 如何将日志信息发送到远程服务器?

使用第三方库,如 logstashfluentd