Python Logger详细用法和说明
1. Logger简介
Logger是Python内置的logging
模块中的一个重要组件,用于记录程序运行过程中的事件信息,包括错误、警告、信息以及调试信息。合理使用Logger可以极大提高程序的调试效率和可维护性。
2. Logger的基本用法
导入模块
import logging
创建Logger对象
# 创建Logger对象,通常使用模块名作为logger的名称
logger = logging.getLogger(__name__)
# 设置日志级别,只有级别高于等于该级别的日志才会被记录
logger.setLevel(logging.DEBUG)
Handler详解
Handler用于指定日志输出的位置,例如控制台、文件、网络等。
常用Handler:
- StreamHandler: 输出日志到控制台(标准输出)
- FileHandler: 输出日志到文件
使用StreamHandler(输出到控制台)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
使用FileHandler(输出到文件)
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.ERROR)
Formatter详解
Formatter用于定义日志消息的格式,例如包含时间、日志级别、日志消息等。
# 定义日志的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 给handler设置formatter
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
将Handler添加到Logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
输出日志消息
logger.debug('这是一个调试信息')
logger.info('这是普通信息')
logger.warning('这是一个警告信息')
logger.error('这是一个错误信息')
logger.critical('这是一个严重错误信息')
3. Logger日志级别详细说明
Logger提供的日志级别有以下几种:
日志级别 | 数值 | 含义 |
---|---|---|
DEBUG | 10 | 详细信息,用于问题的调试与排查 |
INFO | 20 | 普通信息,记录正常运行时的事件 |
WARNING | 30 | 警告信息,可能导致问题的情况 |
ERROR | 40 | 错误信息,程序运行出现的问题 |
CRITICAL | 50 | 严重错误,通常导致程序崩溃 |
日志级别的顺序为:
CRITICAL > ERROR > WARNING > INFO > DEBUG
4. Logger的进阶配置
logging.config 的几种加载方式
Python提供logging.config
模块进行集中化配置:
- fileConfig 加载INI格式配置文件:
import logging.config
logging.config.fileConfig('logging.conf')
- dictConfig 加载字典(推荐):
import logging.config
logging.config.dictConfig(my_config_dict)
- 自定义代码方式配置:
使用Python代码动态设置Logger(前文已演示)。
使用配置文件进行日志配置
创建配置文件(如logging.conf
)用于Logger的配置。
logging.conf示例(包含两个handler):
[loggers]
keys=root,myLogger
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=WARNING
handlers=consoleHandler
[logger_myLogger]
level=DEBUG
handlers=consoleHandler,fileHandler
qualname=myLogger
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
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
loggers 字段的说明
在配置文件中,[loggers]
部分定义了有哪些Logger实例。每个Logger都可以拥有独立的级别、处理器和名称。
root
是Python默认的顶级Logger。- 你也可以自定义Logger(如上例中的
myLogger
),并通过qualname
设置其名称。 - 在代码中使用
getLogger('myLogger')
获取这个Logger。
这使得你可以为不同模块、不同用途设置不同的日志策略,实现更灵活的日志管理。
使用示例:
import logging.config
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('myLogger')
logger.debug('这是自定义logger的调试日志')
使用字典配置Logger
import logging.config
logging_config = {
'version': 1,
'formatters': {
'simpleFormatter': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
},
},
'handlers': {
'consoleHandler': {
'class': 'logging.StreamHandler',
'formatter': 'simpleFormatter',
'level': logging.DEBUG,
},
'fileHandler': {
'class': 'logging.FileHandler',
'formatter': 'simpleFormatter',
'level': logging.ERROR,
'filename': 'app.log',
},
},
'loggers': {
'myLogger': {
'handlers': ['consoleHandler', 'fileHandler'],
'level': 'DEBUG',
'propagate': False,
},
}
}
logging.config.dictConfig(logging_config)
logger = logging.getLogger('myLogger')
logger.debug('输出到控制台')
logger.error('输出到控制台并记录到文件')
5. logging模块常见方法和配置
Logger对象常用方法:
logger.debug(msg)
:记录调试信息logger.info(msg)
:记录普通信息logger.warning(msg)
:记录警告logger.error(msg)
:记录错误logger.critical(msg)
:记录严重错误logger.exception(msg)
:记录异常信息,自动附带堆栈(应在except块中使用)
常见配置项:
name
: 日志器名称(通过getLogger(name)
获取)level
: 级别过滤器handlers
: 所使用的输出通道formatter
: 日志格式控制器propagate
: 是否向父Logger传递日志(默认True)
6. 同时使用多个Handler的示例
实际应用中,通常需要日志同时输出到控制台和文件。
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
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('仅输出到控制台')
logger.error('同时输出到控制台和文件')
7. Logger的最佳实践
- 尽可能选择合适的日志级别,避免记录大量无意义的日志。
- 在实际生产环境中推荐使用配置文件进行管理,易于维护和修改。
- 日志文件管理中,应考虑日志文件大小、轮转机制以及长期备份。
- 利用多个Logger区分不同模块、用途,提高日志管理的灵活性。
8. 总结
Python中的Logger模块功能强大,理解Handler、Formatter、Logger本身的结构,以及配置方式(包括loggers字段的用途)、加载方法和常见函数使用,可以有效提升项目的可维护性和可观测性。