Python的logging
库提供了一个完整且灵活的日志系统。通过使用logging
,可以记录应用程序中发生的事件,帮助调试程序、了解程序运行情况、或在程序部署后监视其行为。
日志级别
在logging
模块中,日志消息分为不同的级别,这些级别从上到下表示信息的严重性或重要性逐渐降低:
CRITICAL
:严重错误,需要立刻处理的错误。ERROR
:运行时出现的错误,但程序可能还能继续运行。WARNING
:潜在的问题或不寻常的情况,但不一定会影响程序的执行。INFO
:记录程序运行的重要信息,如用户登录、操作等。DEBUG
:详细的调试信息,用于在开发过程中查找问题。NOTSET
:特殊的级别,表示所有消息都将被记录。
日志记录器(Logger)
记录器是logging
模块中的核心组件,它负责处理日志消息。每个记录器都有一个名字,通常是对应的模块名或应用名。可以为不同的模块或功能创建多个记录器,并通过名字来获取和配置它们。
处理器(Handler)
处理器决定了日志消息应该发送到什么地方。logging
模块提供了多种内置处理器,如StreamHandler
(将日志消息发送到标准输出或文件),FileHandler
(将日志消息写入到文件),SMTPHandler
(通过电子邮件发送日志消息)等。
格式器(Formatter)
格式器用于指定日志消息的显示格式。你可以通过配置格式器来决定日志消息的布局,包括时间戳、日志级别、消息内容等。
示例1:
import logging
import logging.config
# 配置日志
logging.basicConfig(
level=logging.DEBUG, # 设置记录器的日志级别为DEBUG
format='%(asctime)s - %(levelname)s - %(message)s', # 设置日志消息的格式
handlers=[ # 配置处理器
logging.StreamHandler(), # 添加到控制台的处理器
logging.FileHandler('app.log') # 添加到文件的处理器
]
)
# 创建一个名为'my_app'的记录器
logger = logging.getLogger('my_app')
# 记录不同级别的日志
'''
*
日志消息是否被记录取决于记录器(logger)的级别设置和处理器(handler)的级别设置。
记录器的级别(logger level):决定了该记录器会处理哪些级别的日志消息。如果记录器的级别设置为DEBUG,那么DEBUG级别及以上的所有消息都会被处理;如果设置为INFO,则只有INFO、WARNING、ERROR和CRITICAL级别的消息会被处理,DEBUG级别的消息将被忽略,以此类推。
处理器的级别(handler level):类似地,处理器也有自己的级别设置,它决定了处理器会处理哪些通过记录器级别检查的日志消息。即使记录器允许某个级别的消息通过,如果处理器的级别设置得更高,那么低于处理器级别的消息将不会被该处理器处理。
'''
logger.debug('Debug message') # DEBUG级别以上的消息会被记录
logger.info('Info message') # INFO级别以上的消息会被记录
logger.warning('Warning message') # WARNING级别以上的消息会被记录
logger.error('Error message') # ERROR级别以上的消息会被记录
logger.critical('Critical message') # CRITICAL级别以上的消息会被记录
示例2:
import logging
# 配置日志
logging.basicConfig(
level=logging.DEBUG, # 设置记录器的日志级别为DEBUG
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # 设置日志消息的格式,添加了记录器名称
handlers=[ # 配置处理器
logging.StreamHandler(), # 添加到控制台的处理器
logging.FileHandler('app.log') # 添加到文件的处理器
]
)
# 创建一个名为'my_app'的记录器
logger = logging.getLogger('my_app')
# 模拟一个简单的应用操作,并记录日志
def perform_operation(operation):
if operation == 'divide':
try:
result = 10 / 0 # 故意触发一个ZeroDivisionError异常
except ZeroDivisionError:
logger.error('Error: Division by zero occurred!')
elif operation == 'multiply':
result = 10 * 5
logger.info('Success: Multiplication result is {}'.format(result))
else:
logger.warning('Warning: Unknown operation {}'.format(operation))
# 执行一些操作并记录日志
perform_operation('divide')
perform_operation('multiply')
perform_operation('subtract')
# 记录一个调试信息
logger.debug('Debug: This is a debug message')
# 记录一个临界信息
logger.critical('Critical: This is a critical message')
输出:
2024-03-17 08:28:22,531 - my_app - ERROR - Error: Division by zero occurred!
2024-03-17 08:28:22,544 - my_app - INFO - Success: Multiplication result is 50
2024-03-17 08:28:22,544 - my_app - WARNING - Warning: Unknown operation subtract
2024-03-17 08:28:22,545 - my_app - DEBUG - Debug: This is a debug message
2024-03-17 08:28:22,646 - my_app - CRITICAL - Critical: This is a critical message
app.log
文件输出内容与控制台输出相同。