在 Python 中,日志打印是通过内置的 logging
模块实现的。logging
模块提供了灵活的日志记录功能,允许你记录程序的运行信息,并根据不同的严重级别(如调试信息、警告、错误等)进行分类。相比于简单的 print()
,使用 logging
模块更适合在生产环境中记录调试信息、错误信息和程序的执行流程。
logging
模块的优势
- 不同级别的日志:可以记录不同严重级别的信息(调试、信息、警告、错误等)。
- 日志输出的灵活性:可以将日志输出到控制台、文件,甚至远程服务器。
- 日志格式化:可以自定义日志输出的格式,包括时间戳、日志级别、日志消息等。
- 日志过滤和路由:可以基于条件过滤日志,并将日志路由到不同的目的地。
日志的级别
logging
模块定义了 5 个标准的日志级别,每个级别表示日志的严重性,依次是:
- DEBUG:调试信息,详细的信息,通常只在诊断问题时使用。
- INFO:普通信息,确认程序按预期工作。
- WARNING:警告信息,表示某些不影响程序运行但需要注意的事件。
- ERROR:错误信息,表示由于更严重的问题,程序已不能执行某些功能。
- CRITICAL:严重错误,程序无法继续运行。
日志打印的基本示例
示例:使用 logging
输出日志到控制台
import logging
# 配置日志的基本设置
logging.basicConfig(level=logging.DEBUG, # 设置日志级别为 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-16 12:34:56,123 - DEBUG - This is a debug message
2024-10-16 12:34:56,124 - INFO - This is an info message
2024-10-16 12:34:56,125 - WARNING - This is a warning message
2024-10-16 12:34:56,126 - ERROR - This is an error message
2024-10-16 12:34:56,127 - CRITICAL - This is a critical message
解释:
logging.basicConfig()
用于配置日志系统,包括日志级别和输出格式。level=logging.DEBUG
设置最低日志级别为DEBUG
,这样所有级别的日志都会被记录。format='%(asctime)s - %(levelname)s - %(message)s'
设置日志的输出格式,包含时间戳、日志级别和日志消息。
日志输出到文件
可以将日志输出到文件,而不是控制台。通过配置 logging.basicConfig()
,我们可以指定文件名以及日志的写入模式。
示例:将日志写入文件
import logging
# 配置日志输出到文件
logging.basicConfig(filename='app.log', # 指定日志文件
level=logging.INFO, # 设置日志级别为 INFO
format='%(asctime)s - %(levelname)s - %(message)s')
# 记录日志
logging.info("Application started")
logging.warning("An example warning")
logging.error("An error occurred")
结果:
日志会被写入到 app.log
文件,内容类似如下:
2024-10-16 12:45:56,123 - INFO - Application started
2024-10-16 12:45:57,124 - WARNING - An example warning
2024-10-16 12:45:58,125 - ERROR - An error occurred
解释:
filename='app.log'
指定日志文件的路径。日志信息将被写入该文件中。logging.INFO
只记录INFO
及以上级别的日志信息,DEBUG
级别的信息将不会被记录。
自定义日志格式
可以通过 format
参数来自定义日志的输出格式。常用的格式化参数有:
%(asctime)s
:日志事件的时间。%(levelname)s
:日志的级别。%(message)s
:日志的消息内容。%(filename)s
:日志记录的模块的文件名。%(lineno)d
:日志记录的行号。
示例:自定义日志格式
import logging
# 配置日志的自定义格式
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - [Line %(lineno)d]: %(message)s')
logging.debug("This is a debug message with custom format")
输出:
2024-10-16 12:55:56,123 - root - DEBUG - [Line 5]: This is a debug message with custom format
解释:
%(name)s
:显示记录日志的 logger 名字,这里默认是root
。%(lineno)d
:显示日志语句所在的行号。
使用多个日志处理器(Handler)
在复杂应用中,可能需要同时将日志输出到不同的地方(如文件、控制台、远程服务器)。可以通过日志处理器(Handler
)实现。例如,既将日志输出到控制台,又将其保存到文件。
示例:同时将日志输出到控制台和文件
import logging
# 创建日志器
logger = logging.getLogger("MyLogger")
logger.setLevel(logging.DEBUG)
# 创建控制台处理器并设置日志级别为 DEBUG
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 创建文件处理器并设置日志级别为 WARNING
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.WARNING)
# 创建格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 将格式化器应用于处理器
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 将处理器添加到日志器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 打印日志信息
logger.debug("This is a debug message") # 只在控制台输出
logger.info("This is an info message") # 只在控制台输出
logger.warning("This is a warning message") # 输出到控制台和文件
logger.error("This is an error message") # 输出到控制台和文件
解释:
logger = logging.getLogger("MyLogger")
:创建了一个名为MyLogger
的日志器。StreamHandler()
:将日志输出到控制台。FileHandler("app.log")
:将日志输出到文件app.log
。formatter
:自定义日志的输出格式。logger.addHandler()
:为日志器添加处理器。
捕获异常信息并记录日志
在捕获异常时,使用 logging
记录异常信息,而不是简单地 print()
输出,有助于更好地调试和诊断问题。
示例:记录异常信息
import logging
logging.basicConfig(filename='error.log', level=logging.ERROR)
try:
result = 10 / 0
except ZeroDivisionError as e:
logging.error("Exception occurred", exc_info=True)
结果:
错误信息会记录到 error.log
文件中,包含详细的异常堆栈信息:
扫描二维码关注公众号,回复:
17454741 查看本文章

2024-10-16 13:05:56,123 - ERROR - Exception occurred
Traceback (most recent call last):
File "example.py", line 5, in <module>
result = 10 / 0
ZeroDivisionError: division by zero
解释:
exc_info=True
:在捕获异常时,设置此参数为True
,可以将异常的堆栈信息记录到日志中。
日志过滤器(Filter)
过滤器允许你根据条件筛选日志消息,只有满足特定条件的日志才会被处理。
示例:日志过滤器
import logging
class MyFilter(logging.Filter):
def filter(self, record):
# 仅允许记录包含 "important" 的消息
return "important" in record.msg
logger = logging.getLogger("MyLogger")
logger.setLevel(logging.DEBUG)
# 创建控制台处理器
console_handler = logging.StreamHandler()
# 添加自定义过滤器
console_handler.addFilter(MyFilter())
# 配置日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
# 添加处理器到日志器
logger.addHandler(console_handler)
# 测试日志输出
logger.debug("This is an important debug message")
logger.info("This is a regular info message")
输出:
2024-10-16 13:15:56,123 - DEBUG - This is an important debug message
解释:
MyFilter
类通过filter()
方法筛选消息,只有包含"important"
的消息才会被记录。
总结
- 日志级别:通过
logging
模块可以记录不同级别的日志,包括DEBUG
、INFO
、WARNING
、ERROR
和CRITICAL
。 - 输出到不同的目标:日志可以输出到控制台、文件或其他目标,使用
Handler
来控制输出位置。 - 自定义格式:可以通过
Formatter
自定义日志的输出格式,包含时间、日志级别、消息等信息。 - 捕获异常:可以使用
exc_info=True
在日志中捕获详细的异常信息。 - 日志过滤:可以通过
Filter
筛选符合条件的日志信息。
使用 logging
模块能够帮助开发者记录调试信息、监控应用状态、排查错误,在开发和生产环境中都非常有用。