Python日志管理
在 Python 中,logging
模块可以轻松地将日志输出到控制台。通过配置 StreamHandler
,你可以将日志消息打印到标准输出(通常是终端或命令行界面)。以下是详细的步骤和示例代码。
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()
方法来快速设置日志输出到控制台。
示例代码
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)s | Logger 的名称(通常是你创建 Logger 时指定的名称)。 |
%(levelname)s | 日志级别(如 DEBUG , INFO , WARNING , ERROR , CRITICAL )。 |
%(message)s | 日志消息内容。 |
%(filename)s | 记录日志的文件名(不包含路径)。 |
%(lineno)d | 记录日志的代码行号。 |
示例:包含文件名和行号
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
。
示例代码
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
pip install colorlog
示例代码
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. 注意事项
避免重复日志
- 如果多次调用
basicConfig()
或添加多个Handler
,可能会导致日志重复输出。 - 确保只初始化一次日志配置。
- 如果多次调用
跨平台兼容性
- 在 Windows 上,确保终端支持 ANSI 颜色(如使用
colorama
库)。
- 在 Windows 上,确保终端支持 ANSI 颜色(如使用
性能影响
- 日志记录会增加程序运行时间,尤其是在高频日志场景下。建议在生产环境中调整日志级别(如设置为
INFO
或更高)。
- 日志记录会增加程序运行时间,尤其是在高频日志场景下。建议在生产环境中调整日志级别(如设置为
7. 总结
通过以上方法,你可以轻松地将日志输出到控制台,并根据需要进行格式化和美化。以下是关键步骤:
- 创建 Logger 对象:使用
logging.getLogger()
。 - 设置日志级别:使用
setLevel()
。 - 创建 Handler:使用
StreamHandler
输出到控制台。 - 定义日志格式:使用
Formatter
。 - 添加 Handler 到 Logger:使用
addHandler()
。 - 记录日志:使用
logger.debug()
,logger.info()
等方法。