Skip to content

Python日志管理

在 Python 中,logging 模块可以轻松地将日志输出到控制台。通过配置 StreamHandler,你可以将日志消息打印到标准输出(通常是终端或命令行界面)。以下是详细的步骤和示例代码。

python
import logging

# 创建 Logger 对象
logger = logging.getLogger('console_logger')
logger.setLevel(logging.DEBUG)  # 设置最低日志级别为 DEBUG

# 创建 StreamHandler(默认输出到控制台)
stream_handler = logging.StreamHandler()

# 创建 Formatter,定义日志消息的格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 将 Formatter 添加到 Handler
stream_handler.setFormatter(formatter)

# 将 Handler 添加到 Logger
logger.addHandler(stream_handler)

# 记录日志
logger.debug('这是一个调试信息')
logger.info('这是一个普通信息')
logger.warning('这是一个警告信息')
logger.error('这是一个错误信息')
logger.critical('这是一个严重错误信息')

输出示例

2023-10-10 12:34:56,789 - console_logger - DEBUG - 这是一个调试信息
2023-10-10 12:34:56,789 - console_logger - INFO - 这是一个普通信息
2023-10-10 12:34:56,789 - console_logger - WARNING - 这是一个警告信息
2023-10-10 12:34:56,789 - console_logger - ERROR - 这是一个错误信息
2023-10-10 12:34:56,789 - console_logger - CRITICAL - 这是一个严重错误信息

2. 使用 basicConfig 简化配置

如果你不需要复杂的配置,可以直接使用 logging.basicConfig() 方法来快速设置日志输出到控制台。

示例代码

python
import logging

# 配置日志
logging.basicConfig(
    level=logging.DEBUG,  # 设置最低日志级别
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',  # 日志格式
    handlers=[logging.StreamHandler()]  # 输出到控制台
)

# 获取 Logger 对象
logger = logging.getLogger('console_logger')

# 记录日志
logger.debug('这是一个调试信息')
logger.info('这是一个普通信息')
logger.warning('这是一个警告信息')
logger.error('这是一个错误信息')
logger.critical('这是一个严重错误信息')

输出示例

2023-10-10 12:34:56,789 - console_logger - DEBUG - 这是一个调试信息
2023-10-10 12:34:56,789 - console_logger - INFO - 这是一个普通信息
2023-10-10 12:34:56,789 - console_logger - WARNING - 这是一个警告信息
2023-10-10 12:34:56,789 - console_logger - ERROR - 这是一个错误信息
2023-10-10 12:34:56,789 - console_logger - CRITICAL - 这是一个严重错误信息

3. 自定义日志格式

你可以根据需要自定义日志消息的格式。以下是一些常见的格式字段及其含义:

格式字段描述
%(asctime)s日志记录的时间,默认格式为 2023-10-10 12:34:56,789
%(name)sLogger 的名称(通常是你创建 Logger 时指定的名称)。
%(levelname)s日志级别(如 DEBUG, INFO, WARNING, ERROR, CRITICAL)。
%(message)s日志消息内容。
%(filename)s记录日志的文件名(不包含路径)。
%(lineno)d记录日志的代码行号。

示例:包含文件名和行号

python
import logging

# 配置日志
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s - %(message)s',
    handlers=[logging.StreamHandler()]
)

# 获取 Logger 对象
logger = logging.getLogger('console_logger')

# 记录日志
logger.debug('这是一个调试信息')
logger.info('这是一个普通信息')

输出示例

2023-10-10 12:34:56,789 - script.py:10 - DEBUG - 这是一个调试信息
2023-10-10 12:34:56,789 - script.py:11 - INFO - 这是一个普通信息

4. 同时输出到控制台和文件

如果你希望同时将日志输出到控制台和文件,可以添加多个 Handler

示例代码

python
import logging

# 创建 Logger 对象
logger = logging.getLogger('multi_logger')
logger.setLevel(logging.DEBUG)

# 创建 FileHandler,将日志写入文件
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)

# 创建 StreamHandler,将日志输出到控制台
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)

# 创建 Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 将 Formatter 添加到 Handler
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)

# 将 Handler 添加到 Logger
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

# 记录日志
logger.debug('这是一个调试信息')
logger.info('这是一个普通信息')
logger.warning('这是一个警告信息')
logger.error('这是一个错误信息')
logger.critical('这是一个严重错误信息')

输出示例

  • 控制台输出与文件内容相同:
2023-10-10 12:34:56,789 - multi_logger - DEBUG - 这是一个调试信息
2023-10-10 12:34:56,789 - multi_logger - INFO - 这是一个普通信息
2023-10-10 12:34:56,789 - multi_logger - WARNING - 这是一个警告信息
2023-10-10 12:34:56,789 - multi_logger - ERROR - 这是一个错误信息
2023-10-10 12:34:56,789 - multi_logger - CRITICAL - 这是一个严重错误信息

5. 使用颜色美化控制台输出

为了提高可读性,可以使用第三方库(如 colorlog)为控制台日志添加颜色。

安装 colorlog

bash
pip install colorlog

示例代码

python
import logging
from colorlog import ColoredFormatter

# 创建 Logger 对象
logger = logging.getLogger('color_logger')
logger.setLevel(logging.DEBUG)

# 创建 StreamHandler
stream_handler = logging.StreamHandler()

# 创建 ColoredFormatter
formatter = ColoredFormatter(
    "%(log_color)s%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    log_colors={
        'DEBUG': 'cyan',
        'INFO': 'green',
        'WARNING': 'yellow',
        'ERROR': 'red',
        'CRITICAL': 'bold_red',
    }
)

# 将 Formatter 添加到 Handler
stream_handler.setFormatter(formatter)

# 将 Handler 添加到 Logger
logger.addHandler(stream_handler)

# 记录日志
logger.debug('这是一个调试信息')
logger.info('这是一个普通信息')
logger.warning('这是一个警告信息')
logger.error('这是一个错误信息')
logger.critical('这是一个严重错误信息')

输出示例

  • 调试信息显示为青色。
  • 普通信息显示为绿色。
  • 警告信息显示为黄色。
  • 错误信息显示为红色。
  • 严重错误信息显示为加粗红色。

6. 注意事项

  1. 避免重复日志

    • 如果多次调用 basicConfig() 或添加多个 Handler,可能会导致日志重复输出。
    • 确保只初始化一次日志配置。
  2. 跨平台兼容性

    • 在 Windows 上,确保终端支持 ANSI 颜色(如使用 colorama 库)。
  3. 性能影响

    • 日志记录会增加程序运行时间,尤其是在高频日志场景下。建议在生产环境中调整日志级别(如设置为 INFO 或更高)。

7. 总结

通过以上方法,你可以轻松地将日志输出到控制台,并根据需要进行格式化和美化。以下是关键步骤:

  1. 创建 Logger 对象:使用 logging.getLogger()
  2. 设置日志级别:使用 setLevel()
  3. 创建 Handler:使用 StreamHandler 输出到控制台。
  4. 定义日志格式:使用 Formatter
  5. 添加 Handler 到 Logger:使用 addHandler()
  6. 记录日志:使用 logger.debug(), logger.info() 等方法。
最近更新