Python的logging
模块是一个功能强大且灵活的日志记录工具,用于在程序中输出运行时的信息、警告、错误等。它能够帮助开发者跟踪代码的执行过程、调试问题,并记录运行中的重要事件。
1. 基本用法
import logging# 设置日志的基本配置
logging.basicConfig(level=logging.DEBUG)# 打印不同级别的日志
logging.debug("This is a debug message.")
logging.info("This is an info message.")
logging.warning("This is a warning message.")
logging.error("This is an error message.")
logging.critical("This is a critical message.")
输出:
DEBUG:root:This is a debug message.
INFO:root:This is an info message.
WARNING:root:This is a warning message.
ERROR:root:This is an error message.
CRITICAL:root:This is a critical message.
logging.basicConfig(level=logging.DEBUG)
设置了日志的最低级别为DEBUG
,所以从DEBUG
到 CRITICAL
的所有日志都会被记录。
默认情况下,只有WARNING
级别及以上的日志会显示在控制台。如果要显示更低级别(如 DEBUG
和INFO
),需要通过basicConfig
设置日志级别。
2. 日志级别
logging
模块提供了5个标准的日志级别,从低到高分别为:
DEBUG
:用于调试,详细信息,通常只出现在诊断问题时。
INFO
:用于确认一切按预期工作。
WARNING
:表示某些问题,但并不影响程序运行。
ERROR
:严重问题,程序部分功能无法正常运行。
CRITICAL
:非常严重的错误,可能导致程序崩溃。
3. 配置日志格式
可以自定义日志的输出格式,包括时间、日志级别、模块名等信息。
import logging# 配置日志级别及格式
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')# 打印不同级别的日志
logging.debug("This is a debug message.")
logging.info("This is an info message.")
logging.warning("This is a warning message.")
logging.error("This is an error message.")
logging.critical("This is a critical message.")
输出:
2024-10-03 15:38:45,690 - DEBUG - This is a debug message.
2024-10-03 15:38:45,690 - INFO - This is an info message.
2024-10-03 15:38:45,690 - WARNING - This is a warning message.
2024-10-03 15:38:45,690 - ERROR - This is an error message.
2024-10-03 15:38:45,690 - CRITICAL - This is a critical message.
%(asctime)s
:记录日志的时间。
%(levelname)s
:日志的级别名(如DEBUG
,INFO
,等)。
%(message)s
:日志消息。
4. 将日志输出到文件
可以通过filename
参数将日志输出到文件,而不是控制台。
import logging# 将日志输出到文件
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s', filename='train.log')# 注意,每执行一次logging.debug(info/warning/error/critical)操作都是往之前的train.log中追加信息,程序重新运行也是追加信息(已有信息不会清空)
logging.debug("This is a debug message.")
logging.info("This is an info message.")
logging.warning("This is a warning message.")
logging.error("This is an error message.")
logging.critical("This is a critical message.")
这个示例中,所有日志信息都会被写入名为train.log
的文件,而不是在控制台输出。
5. 日志记录器(Logger)与处理器(Handler)
import logging# 创建训练log
train_logger = logging.getLogger("train_logger")
train_logger.setLevel(logging.DEBUG)# 创建一个控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING) # 最终输出的日志级别由train_logger和console_handler综合的最严格的级别执行# 创建一个文件处理器
file_handler = logging.FileHandler(filename='train.log')
file_handler.setLevel(logging.DEBUG) # 最终输出的日志级别由train_logger和file_handler综合的最严格的级别执行# 设置日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)# 将处理器添加到train_logger
train_logger.addHandler(console_handler) # 如果不添加这句,控制台不会有任何日志输出
train_logger.addHandler(file_handler)# 使用 Logger 记录日志
train_logger.debug("This is a debug message.")
train_logger.info("This is an info message.")
train_logger.warning("This is a warning message.")
train_logger.error("This is an error message.")
train_logger.critical("This is a critical message.")
控制台输出:
2024-09-30 16:08:17,986 - train_logger - WARNING - This is a warning message.
2024-09-30 16:08:17,986 - train_logger - ERROR - This is an error message.
2024-09-30 16:08:17,986 - train_logger - CRITICAL - This is a critical message.
生成的日志文件train.log
中的内容:
2024-09-30 16:09:39,996 - train_logger - DEBUG - This is a debug message.
2024-09-30 16:09:39,996 - train_logger - INFO - This is an info message.
2024-09-30 16:09:39,996 - train_logger - WARNING - This is a warning message.
2024-09-30 16:09:39,996 - train_logger - ERROR - This is an error message.
2024-09-30 16:09:39,996 - train_logger - CRITICAL - This is a critical message.
6. 日志中的异常信息
在except
语句中记录日志时,logging
可以自动捕获异常的详细信息。
exc_info=True
会记录异常的详细堆栈信息,帮助调试程序中的错误。
import loggingtry:result = 10/0
except ZeroDivisionError:logging.error("ZeroDivisionError", exc_info=True)
输出:
ERROR:root:ZeroDivisionError
Traceback (most recent call last):File "E:\02.Projects\13.PyTorch\08.logging.py", line 77, in <module>result = 10/0~~^~
ZeroDivisionError: division by zero