Python 中的日志模块 logging
使用技巧与应用实战
Python 提供了内置的日志模块 logging
,它是一个功能强大的日志管理工具,适用于各种规模的项目。通过使用 logging
模块,开发者可以记录调试信息、错误信息、程序运行状态等内容,并将日志输出到控制台、文件或远程服务器。本文将深入探讨 logging
模块的使用技巧及应用实战。
一、logging
模块的基础使用
1.1 基本用法
logging
模块的基本用法相对简单,开发者可以通过 logging.basicConfig
方法进行配置,然后使用不同的日志级别来记录信息。
import logging
# 配置日志输出格式和级别
logging.basicConfig(level=logging.INFO, 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")
解释:
basicConfig
:用于一次性配置日志的基本设置。包括日志的输出级别、格式、输出位置等。- 日志级别:
DEBUG
、INFO
、WARNING
、ERROR
、CRITICAL
,它们表示日志的不同严重性。默认情况下,只有日志级别大于等于配置的级别才会输出。
1.2 自定义日志格式
开发者可以通过 format
参数来自定义日志的输出格式。常见的日志格式字段包括:
%(asctime)s
:输出当前时间。%(levelname)s
:输出日志级别。%(message)s
:输出日志信息。%(filename)s
:输出日志所在的文件名。%(lineno)d
:输出日志所在的行号。
示例:
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
这将输出包含时间、日志器名称、日志级别和消息内容的日志记录。
二、高级使用技巧
2.1 日志器、处理器和格式器
logging
模块基于模块化设计,主要由三个核心组件组成:Logger
(日志器)、Handler
(处理器)和 Formatter
(格式器)。这些组件可以组合使用,以实现更为复杂的日志管理需求。
- Logger:日志器用于创建日志记录的入口点。通过
getLogger
方法可以创建或获取一个日志器实例。 - Handler:处理器用于定义日志的输出位置,如控制台、文件或远程服务器。
- Formatter:格式器用于定义日志记录的格式。
示例:
import logging
# 创建日志器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# 创建控制台处理器并设置日志级别
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 创建文件处理器并设置日志级别
file_handler = logging.FileHandler('app.log')
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('This is a debug message')
logger.info('This is an info message')
logger.error('This is an error message')
解释:
getLogger('my_logger')
:创建一个名为my_logger
的日志器。StreamHandler
:将日志输出到控制台。FileHandler
:将日志输出到文件app.log
。setFormatter
:为处理器设置日志格式。
通过这种方式,开发者可以同时将日志输出到多个位置,并为不同的处理器设置不同的日志级别和格式。
2.2 日志的按大小轮转与按时间轮转
对于长期运行的服务应用,日志文件可能会不断增长,导致磁盘空间消耗过多。此时可以使用日志的轮转功能来控制日志文件的大小或数量。logging.handlers
模块提供了两种常见的日志轮转方式:按文件大小轮转(RotatingFileHandler
)和按时间轮转(TimedRotatingFileHandler
)。
- 按大小轮转:
from logging.handlers import RotatingFileHandler
rotating_handler = RotatingFileHandler('app.log', maxBytes=2000, backupCount=5)
rotating_handler.setLevel(logging.INFO)
rotating_handler.setFormatter(formatter)
logger.addHandler(rotating_handler)
解释:
maxBytes=2000
:当日志文件大小超过 2000 字节时触发轮转。backupCount=5
:最多保留 5 个旧日志文件。- 按时间轮转:
from logging.handlers import TimedRotatingFileHandler
timed_handler = TimedRotatingFileHandler('app.log', when='midnight', interval=1, backupCount=7)
timed_handler.setLevel(logging.INFO)
timed_handler.setFormatter(formatter)
logger.addHandler(timed_handler)
解释:
when='midnight'
:每天午夜时刻触发轮转。interval=1
:表示每 1 个单位的时间间隔触发轮转。backupCount=7
:保留最近 7 天的日志文件。
2.3 异常信息记录
在捕获异常时,可以通过 logging
模块记录详细的异常信息(包括堆栈跟踪信息),而不是简单的错误消息。这可以帮助开发者更快地定位问题。
try:
1 / 0
except ZeroDivisionError:
logger.exception("An error occurred")
解释:
logger.exception
:自动捕获异常信息并记录堆栈跟踪,日志级别为ERROR
。
三、应用实战:结合配置文件使用 logging
在复杂项目中,手动配置日志器的方式可能显得冗长且不易管理。此时可以通过配置文件来配置 logging
,这使得日志配置更加灵活和模块化。
3.1 使用字典配置
Python logging
模块支持通过字典来配置日志系统。以下是一个简单的字典配置示例:
import logging
import logging.config
log_config = {
'version': 1,
'formatters': {
'simple': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'simple',
},
'file': {
'class': 'logging.FileHandler',
'level': 'ERROR',
'formatter': 'simple',
'filename': 'app.log',
},
},
'loggers': {
'my_logger': {
'handlers': ['console', 'file'],
'level': 'DEBUG',
'propagate': False,
},
},
}
logging.config.dictConfig(log_config)
logger = logging.getLogger('my_logger')
logger.info("This is an info message")
logger.error("This is an error message")
解释:
logging.config.dictConfig
:通过字典配置日志系统。handlers
:定义了控制台输出和文件输出的处理器。loggers
:定义了一个名为my_logger
的日志器,绑定到控制台和文件处理器。
3.2 使用配置文件
另一种常见方式是将日志配置放到一个独立的配置文件中(如 logging.conf
),并使用 fileConfig
进行加载。
logging.conf
示例:
[loggers]
keys=root,my_logger
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_my_logger]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=my_logger
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=ERROR
formatter=simpleFormatter
args=('app.log', 'a')
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
使用 fileConfig
加载配置:
import logging
import logging.config
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('my_logger')
logger.info("This is an info message")
logger.error("This is an error message")
解释:
fileConfig
:从配置文件加载日志配置。- 配置文件中定义了日志器、
处理器和格式器等,便于集中管理日志配置。
四、思维导图
Python logging 模块使用技巧与应用实战
1. 基本使用
1.1 基本用法
1.2 自定义日志格式
2. 高级技巧
2.1 日志器、处理器、格式器
2.2 按大小轮转与按时间轮转
2.3 异常信息记录
3. 应用实战
3.1 字典配置
3.2 配置文件
五、总结
Python 的 logging
模块是一个功能强大且灵活的日志记录工具,能够满足各种复杂场景的日志需求。通过学习 Logger
、Handler
、Formatter
的使用技巧,以及结合轮转机制和配置文件的灵活配置,开发者可以在项目中实现高效、可维护的日志系统,从而提升调试效率和系统监控能力。