在 Python 中,日志记录是通过内置的 logging
模块完成的。这个模块提供了灵活的框架来记录应用程序的各种信息,例如调试信息、错误消息、警告等
1.日志记录的基本概念
- 日志级别(Logging Levels): 日志级别决定了日志的严重性。常见的日志级别(从低到高)包括:
- DEBUG: 调试信息,详细信息,用于诊断问题。
- INFO: 普通的信息,确认程序按预期运行。
- WARNING: 表示潜在问题,程序还可以继续运行,但可能会出现问题。
- ERROR: 发生错误,程序某些功能可能无法正常运行。
- CRITICAL: 严重错误,程序可能无法继续运行。
- 日志记录器(Logger): 日志记录器是日志系统的核心组件,它负责创建日志消息。每个日志记录器都有一个名称,通常与模块名或应用名一致。可以创建多个日志记录器来为不同的模块或组件生成日志。
- 处理器(Handler): 处理器负责将日志记录器生成的日志消息发送到不同的目标,例如控制台、文件、网络或邮件。一个日志记录器可以有多个处理器。常见的处理器包括:
- StreamHandler: 将日志输出到控制台或其他流。
- FileHandler: 将日志输出到文件。
- RotatingFileHandler: 将日志输出到文件,并在文件达到指定大小时自动轮转(创建新文件)。
- 格式器(Formatter): 格式器定义了日志消息的输出格式。它可以控制日志记录的时间戳、日志级别、消息内容等信息的排列方式。常见的格式器字段包括:
- %(asctime)s: 日志时间。
- %(name)s: 日志记录器名称。
- %(levelname)s: 日志级别。
- %(message)s: 日志消息内容。
- %(filename)s: 文件名。
- %(lineno)d: 行号。
- 过滤器(Filter): 过滤器用于对日志消息进行进一步的过滤。它允许你更细粒度地控制哪些日志应该被处理或忽略。例如,你可以创建一个过滤器,只记录特定模块或特定条件下的日志。
2.日志简单配置
要记录简单的日志信息,可以使用 logging 模块的基本配置和记录方法。
import logging
# 基本配置
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
# 记录日志
logging.debug("这是调试信息")
logging.info("这是信息日志")
logging.warning("这是警告日志")
logging.error("这是错误日志")
logging.critical("这是严重错误日志")
:控制台输出
2024-09-09 10:50:13,989 - DEBUG - 这是调试信息
2024-09-09 10:50:13,989 - INFO - 这是信息日志
2024-09-09 10:50:13,989 - WARNING - 这是警告日志
2024-09-09 10:50:13,989 - ERROR - 这是错误日志
2024-09-09 10:50:13,989 - CRITICAL - 这是严重错误日志
3.代码配置
使用 logging.getLogger(name)
创建一个带有自定义名称的日志记录器,可以在项目的不同模块中使用。
import logging
# 创建自定义日志记录器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# 创建控制台处理器并设置日志级别为DEBUG
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 创建文件处理器并设置日志级别为ERROR, 保存在myapp.log文件中
file_handler = logging.FileHandler('myapp.log', encoding='utf8')
file_handler.setLevel(logging.ERROR)
# 创建日志格式器并将其添加到处理器
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("这是调试信息")
logger.info("这是信息日志")
logger.warning("这是警告日志")
logger.error("这是错误日志")
logger.critical("这是严重错误日志")
# 控制台
# 2024-09-09 10:50:48,089 - my_logger - DEBUG - 这是调试信息
# 2024-09-09 10:50:48,089 - my_logger - INFO - 这是信息日志
# 2024-09-09 10:50:48,090 - my_logger - WARNING - 这是警告日志
# 2024-09-09 10:50:48,090 - my_logger - ERROR - 这是错误日志
# 2024-09-09 10:50:48,090 - my_logger - CRITICAL - 这是严重错误日志
# myapp.log
# 2024-09-09 10:50:48,090 - my_logger - ERROR - 这是错误日志
# 2024-09-09 10:50:48,090 - my_logger - CRITICAL - 这是严重错误日志
4.字典配置
通过字典形式配置日志。这样可以更灵活地管理和修改日志配置。字典配置通常使用 logging.config.dictConfig()
方法加载。
import logging
import logging.config
# 定义日志配置字典
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False, # 保留已有的logger
'formatters': { # 定义格式器
'default': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
},
'detailed': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',
},
},
'handlers': { # 定义处理器
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'formatter': 'default',
},
'file': {
'class': 'logging.FileHandler',
'level': 'ERROR',
'formatter': 'detailed',
'filename': 'app.log',
'mode': 'a', # 追加模式
'encoding': 'utf8'
},
},
'loggers': { # 定义logger
'my_logger': {
'level': 'DEBUG',
'handlers': ['console', 'file'],
'propagate': False, # 不向上级logger传递
},
},
}
# 使用字典配置日志
logging.config.dictConfig(LOGGING_CONFIG)
# 获取logger
logger = logging.getLogger('my_logger')
# 测试日志记录
logger.debug("这是调试信息")
logger.info("这是信息日志")
logger.warning("这是警告日志")
logger.error("这是错误日志")
logger.critical("这是严重错误日志")
5.文件配置
可以通过配置文件来更灵活地管理日志记录。日志配置文件可以采用 .ini
格式,使用 logging.config.fileConfig()
加载。
-
创建新文件
logging.conf
:; logging.conf [loggers] keys=root,my_logger [handlers] keys=consoleHandler,fileHandler [formatters] keys=defaultFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_my_logger] level=DEBUG handlers=consoleHandler,fileHandler qualname=my_logger propagate=0 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=defaultFormatter args=(sys.stdout,) [handler_fileHandler] class=FileHandler level=ERROR formatter=defaultFormatter args=('app.log', 'a') [formatter_defaultFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
-
pyhon代码中加载配置文件
import logging import logging.config # 加载配置文件 logging.conf logging.config.fileConfig('logging.conf') # 获取自定义日志记录器 my_logger logger = logging.getLogger('my_logger') # 记录日志 logger.debug("这是调试信息") logger.info("这是信息日志") logger.warning("这是警告日志") logger.error("这是错误日志") logger.critical("这是严重错误日志")