文章目录
- 创建 Logger 实例使用 logging.getLogger(name) 创建或获取一个 Logger 对象。若未指定名称,默认返回根 Logger(root)。 import logging logger = logging.getLogger(‘my_app’) # 创建名为 ‘my_app’ 的 Logger 设置日志级别Logger 的级别决定其处理的最低日志等级,可选级别从低到高为:DEBUG、INFO、WARNING、ERROR、CRITICAL。 logger.setLevel(logging.DEBUG) # 记录 DEBUG 及以上级别的日志 默认级别与继承关系 若未显式设置级别,Logger 会继承父级(如 root)的级别,默认 WARNING。 Logger 名称支持层级结构(如 a.b 继承 a 的配置),便于模块化日志管理。
- Handler 负责将日志发送到不同目标(如文件、控制台),可同时添加多个 Handler 实现多路输出。 常用 Handler 类型 Handler 功能 示例 StreamHandler 输出到控制台(默认 sys.stderr) logging.StreamHandler() FileHandler 输出到文件 logging.FileHandler('app.log', mode='a') RotatingFileHandler 日志文件按大小回滚(避免文件过大) from logging.handlers import RotatingFileHandler TimedRotatingFileHandler 按时间回滚日志文件(如每天生成新文件) from logging.handlers import TimedRotatingFileHandler 示例:同时输出到文件和控制台 # 文件 Handler(按大小回滚) from logging.handlers import RotatingFileHandler file_handler = RotatingFileHandler( ‘app.log’, maxBytes=1024*1024, backupCount=5 # 单个文件最大1MB,保留5个备份 ) file_handler.setLevel(logging.INFO) # 控制台 Handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) # 添加 Handler 到 Logger logger.addHandler(file_handler) logger.addHandler(console_handler)
- 通过 Formatter 可定义日志输出的格式,支持占位符如 %(asctime)s(时间)、%(levelname)s(级别)、%(message)s(消息)等。 formatter = logging.Formatter( ‘%(asctime)s – %(name)s – %(levelname)s – %(message)s’, datefmt=’%Y-%m-%d %H:%M:%S’ # 自定义时间格式 ) file_handler.setFormatter(formatter) console_handler.setFormatter(formatter)
- 通过 Logger 对象调用对应级别的方法记录日志: logger.debug(‘调试信息,用于开发阶段追踪细节’) # 仅当 Logger 级别 ≤ DEBUG 时输出 logger.info(‘常规信息,如服务启动’) logger.warning(‘潜在问题警告,如参数缺失’) logger.error(‘程序错误,但应用仍可运行’) logger.critical(‘严重错误,可能导致程序崩溃’)
- 全局配置快速启动使用 logging.basicConfig() 快速配置根 Logger,适合简单场景: logging.basicConfig( level=logging.INFO, format=’%(asctime)s – %(message)s’, handlers=[logging.FileHandler(‘app.log’), logging.StreamHandler()] ) 过滤器(Filter)通过 Filter 实现更精细的日志筛选,例如仅记录特定模块或包含关键字的日志: class CustomFilter(logging.Filter): def filter(self, record): return ‘important’ in record.getMessage() # 仅记录含 ‘important’ 的日志 logger.addFilter(CustomFilter()) 避免重复日志若 Logger 层级配置不当,可能导致日志重复输出。建议在子 Logger 中禁用传播到父级: child_logger = logging.getLogger(‘my_app.sub_module’) child_logger.propagate = False # 阻止日志传递给父 Logger
- 日志不显示:检查 Logger 和 Handler 的级别是否高于日志调用级别。 多 Handler 冲突:确保每个 Handler 的级别和 Formatter 独立配置。 性能优化:高频日志场景可使用 RotatingFileHandler 避免文件过大,或异步日志库(如 concurrent-log-handler)。 以下是 Python 中 logging 模块的详细使用教程,涵盖基础配置、高级用法及最佳实践,结合多篇权威资料整理而成:
- 引入模块与基础配置通过 basicConfig() 函数快速配置全局日志参数: import logging logging.basicConfig( level=logging.DEBUG, # 设置最低日志级别为 DEBUG format=’%(asctime)s – %(name)s – %(levelname)s – %(message)s’, datefmt=’%Y-%m-%d %H:%M:%S’, # 时间格式 filename=’app.log’, # 输出到文件(默认追加模式) filemode=’w’ # 覆盖模式写入文件(可选) ) 记录不同级别的日志使用预定义的日志级别方法输出信息: logging.debug(‘调试信息’) # 开发阶段追踪细节 logging.info(‘常规状态’) # 程序正常运行信息 logging.warning(‘潜在问题’) # 如参数缺失或兼容性问题 logging.error(‘错误事件’) # 功能异常但程序仍运行 logging.critical(‘严重故障’) # 系统可能崩溃的致命错误 注意:只有不低于 level 参数设置的级别才会被记录。
- 创建独立 Logger推荐为不同模块创建独立 Logger 以分类管理日志: logger = logging.getLogger(‘my_module’) # 名称建议使用模块名 logger.setLevel(logging.INFO) # 覆盖全局级别 添加处理器(Handler)支持同时输出到控制台、文件、网络等多种目标: # 控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) # 文件处理器(按大小轮转) from logging.handlers import RotatingFileHandler file_handler = RotatingFileHandler( ‘app.log’, maxBytes=10*1024*1024, backupCount=5 # 10MB/文件,保留5个备份 ) file_handler.setLevel(logging.ERROR) # 将处理器附加到 Logger logger.addHandler(console_handler) logger.addHandler(file_handler) 自定义日志格式通过 Formatter 定义日志输出样式: formatter = logging.Formatter( ‘%(asctime)s [%(levelname)s] %(module)s:%(lineno)d – %(message)s’, datefmt=’%H:%M:%S’ ) console_handler.setFormatter(formatter) file_handler.setFormatter(formatter)
- 配置文件管理使用 .conf 或 .ini 文件分离配置(推荐大型项目): import logging.config logging.config.fileConfig(‘logging.conf’) 示例 logging.conf 内容: [loggers] keys=root,my_app [handlers] keys=consoleHandler,fileHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_my_app] level=INFO handlers=fileHandler qualname=my_app propagate=0 # 禁止传播到父级 Logger 日志传播控制通过 propagate 属性控制是否向父级 Logger 传递日志: child_logger = logging.getLogger(‘parent.child’) child_logger.propagate = False # 仅当前 Logger 处理日志 过滤器(Filter)实现精细化日志筛选: class KeywordFilter(logging.Filter): def __init__(self, keyword): super().__init__() self.keyword = keyword def filter(self, record): return self.keyword in record.getMessage() logger.addFilter(KeywordFilter(‘重要’))
- 性能优化 避免高频日志调用:使用 isEnabledFor() 检查级别后再记录: if logger.isEnabledFor(logging.DEBUG): logger.debug(f’耗时计算: {expensive_function()}’) 使用异步日志库(如 concurrent-log-handler)处理高并发场景。 多环境配置根据运行环境动态调整配置: if os.getenv(‘ENV’) == ‘production’: logger.setLevel(logging.WARNING) else: logger.setLevel(logging.DEBUG) 错误处理为关键操作添加异常捕获并记录堆栈: try: risky_operation() except Exception as e: logger.exception(‘操作失败: %s’, e) # 自动记录堆栈跟踪
- 网络请求监控: import requests def fetch_data(url): try: response = requests.get(url, timeout=5) response.raise_for_status() logger.info(f’成功获取 {url} 数据’) return response.json() except requests.RequestException as e: logger.error(f’请求失败: {url} – {str(e)}’) return None 通过合理配置 Logger、Handler 和 Formatter,可以构建灵活高效的日志系统。更多高级功能(如远程日志、邮件通知)可参考 Python 官方文档。
目录
- 前言
- 功能说明
- 一、Logger 的创建与基础配置
- 二、Handler 的配置与使用
- 三、Formatter 自定义日志格式
- 四、记录不同级别的日志
- 五、高级配置与最佳实践
- 六、常见问题与调试
- 使用方法
- 一、基础配置与快速使用
- 二、自定义 Logger 对象
- 三、高级用法
- 四、最佳实践与注意事项
- 五、实际应用场景示例
- 总结
Python 的 logging 模块是标准库中用于记录日志的核心工具,通过灵活配置可实现多级别、多目标、多格式的日志管理。以下是其核心用法及详细说明:
-
创建 Logger 实例使用 logging.getLogger(name) 创建或获取一个 Logger 对象。若未指定名称,默认返回根 Logger(root)。
import logging
logger = logging.getLogger('my_app') # 创建名为 'my_app' 的 Logger
-
设置日志级别Logger 的级别决定其处理的最低日志等级,可选级别从低到高为:DEBUG、INFO、WARNING、ERROR、CRITICAL。
logger.setLevel(logging.DEBUG) # 记录 DEBUG 及以上级别的日志
-
默认级别与继承关系
- 若未显式设置级别,Logger 会继承父级(如
root)的级别,默认 WARNING。
- Logger 名称支持层级结构(如
a.b 继承 a 的配置),便于模块化日志管理。
创建 Logger 实例使用 logging.getLogger(name) 创建或获取一个 Logger 对象。若未指定名称,默认返回根 Logger(root)。
import logging
logger = logging.getLogger('my_app') # 创建名为 'my_app' 的 Logger
设置日志级别Logger 的级别决定其处理的最低日志等级,可选级别从低到高为:DEBUG、INFO、WARNING、ERROR、CRITICAL。
logger.setLevel(logging.DEBUG) # 记录 DEBUG 及以上级别的日志
默认级别与继承关系
- 若未显式设置级别,Logger 会继承父级(如
root)的级别,默认WARNING。 - Logger 名称支持层级结构(如
a.b继承a的配置),便于模块化日志管理。
Handler 负责将日志发送到不同目标(如文件、控制台),可同时添加多个 Handler 实现多路输出。
常用 Handler 类型
| Handler | 功能 | 示例 |
|---|---|---|
StreamHandler |
输出到控制台(默认 sys.stderr) |
logging.StreamHandler() |
FileHandler |
输出到文件 | logging.FileHandler('app.log', mode='a') |
RotatingFileHandler |
日志文件按大小回滚(避免文件过大) | from logging.handlers import RotatingFileHandler |
TimedRotatingFileHandler |
按时间回滚日志文件(如每天生成新文件) | from logging.handlers import TimedRotatingFileHandler |
示例:同时输出到文件和控制台
# 文件 Handler(按大小回滚)
from logging.handlers import RotatingFileHandler
file_handler = RotatingFileHandler(
'app.log', maxBytes=1024*1024, backupCount=5 # 单个文件最大1MB,保留5个备份
)
file_handler.setLevel(logging.INFO)
# 控制台 Handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 添加 Handler 到 Logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)
通过 Formatter 可定义日志输出的格式,支持占位符如 %(asctime)s(时间)、%(levelname)s(级别)、%(message)s(消息)等。
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S' # 自定义时间格式
)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
通过 Logger 对象调用对应级别的方法记录日志:
logger.debug('调试信息,用于开发阶段追踪细节') # 仅当 Logger 级别 ≤ DEBUG 时输出
logger.info('常规信息,如服务启动')
logger.warning('潜在问题警告,如参数缺失')
logger.error('程序错误,但应用仍可运行')
logger.critical('严重错误,可能导致程序崩溃')
-
全局配置快速启动使用 logging.basicConfig() 快速配置根 Logger,适合简单场景:
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(message)s',
handlers=[logging.FileHandler('app.log'), logging.StreamHandler()]
)
-
过滤器(Filter)通过 Filter 实现更精细的日志筛选,例如仅记录特定模块或包含关键字的日志:
class CustomFilter(logging.Filter):
def filter(self, record):
return 'important' in record.getMessage() # 仅记录含 'important' 的日志
logger.addFilter(CustomFilter())
-
避免重复日志若 Logger 层级配置不当,可能导致日志重复输出。建议在子 Logger 中禁用传播到父级:
child_logger = logging.getLogger('my_app.sub_module')
child_logger.propagate = False # 阻止日志传递给父 Logger
全局配置快速启动使用 logging.basicConfig() 快速配置根 Logger,适合简单场景:
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(message)s',
handlers=[logging.FileHandler('app.log'), logging.StreamHandler()]
)
过滤器(Filter)通过 Filter 实现更精细的日志筛选,例如仅记录特定模块或包含关键字的日志:
class CustomFilter(logging.Filter):
def filter(self, record):
return 'important' in record.getMessage() # 仅记录含 'important' 的日志
logger.addFilter(CustomFilter())
避免重复日志若 Logger 层级配置不当,可能导致日志重复输出。建议在子 Logger 中禁用传播到父级:
child_logger = logging.getLogger('my_app.sub_module')
child_logger.propagate = False # 阻止日志传递给父 Logger
- 日志不显示:检查 Logger 和 Handler 的级别是否高于日志调用级别。
- 多 Handler 冲突:确保每个 Handler 的级别和 Formatter 独立配置。
- 性能优化:高频日志场景可使用
RotatingFileHandler 避免文件过大,或异步日志库(如 concurrent-log-handler)。
RotatingFileHandler 避免文件过大,或异步日志库(如 concurrent-log-handler)。以下是 Python 中 logging 模块的详细使用教程,涵盖基础配置、高级用法及最佳实践,结合多篇权威资料整理而成:
-
引入模块与基础配置通过 basicConfig() 函数快速配置全局日志参数:
import logging
logging.basicConfig(
level=logging.DEBUG, # 设置最低日志级别为 DEBUG
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', # 时间格式
filename='app.log', # 输出到文件(默认追加模式)
filemode='w' # 覆盖模式写入文件(可选)
)
-
记录不同级别的日志使用预定义的日志级别方法输出信息:
logging.debug('调试信息') # 开发阶段追踪细节
logging.info('常规状态') # 程序正常运行信息
logging.warning('潜在问题') # 如参数缺失或兼容性问题
logging.error('错误事件') # 功能异常但程序仍运行
logging.critical('严重故障') # 系统可能崩溃的致命错误
注意:只有不低于 level 参数设置的级别才会被记录。
引入模块与基础配置通过 basicConfig() 函数快速配置全局日志参数:
import logging
logging.basicConfig(
level=logging.DEBUG, # 设置最低日志级别为 DEBUG
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', # 时间格式
filename='app.log', # 输出到文件(默认追加模式)
filemode='w' # 覆盖模式写入文件(可选)
)
记录不同级别的日志使用预定义的日志级别方法输出信息:
logging.debug('调试信息') # 开发阶段追踪细节
logging.info('常规状态') # 程序正常运行信息
logging.warning('潜在问题') # 如参数缺失或兼容性问题
logging.error('错误事件') # 功能异常但程序仍运行
logging.critical('严重故障') # 系统可能崩溃的致命错误
注意:只有不低于 level 参数设置的级别才会被记录。
-
创建独立 Logger推荐为不同模块创建独立 Logger 以分类管理日志:
logger = logging.getLogger('my_module') # 名称建议使用模块名
logger.setLevel(logging.INFO) # 覆盖全局级别
-
添加处理器(Handler)支持同时输出到控制台、文件、网络等多种目标:
# 控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 文件处理器(按大小轮转)
from logging.handlers import RotatingFileHandler
file_handler = RotatingFileHandler(
'app.log', maxBytes=10*1024*1024, backupCount=5 # 10MB/文件,保留5个备份
)
file_handler.setLevel(logging.ERROR)
# 将处理器附加到 Logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
-
自定义日志格式通过 Formatter 定义日志输出样式:
formatter = logging.Formatter(
'%(asctime)s [%(levelname)s] %(module)s:%(lineno)d - %(message)s',
datefmt='%H:%M:%S'
)
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
创建独立 Logger推荐为不同模块创建独立 Logger 以分类管理日志:
logger = logging.getLogger('my_module') # 名称建议使用模块名
logger.setLevel(logging.INFO) # 覆盖全局级别
添加处理器(Handler)支持同时输出到控制台、文件、网络等多种目标:
# 控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 文件处理器(按大小轮转)
from logging.handlers import RotatingFileHandler
file_handler = RotatingFileHandler(
'app.log', maxBytes=10*1024*1024, backupCount=5 # 10MB/文件,保留5个备份
)
file_handler.setLevel(logging.ERROR)
# 将处理器附加到 Logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
自定义日志格式通过 Formatter 定义日志输出样式:
formatter = logging.Formatter(
'%(asctime)s [%(levelname)s] %(module)s:%(lineno)d - %(message)s',
datefmt='%H:%M:%S'
)
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
-
配置文件管理使用 .conf 或 .ini 文件分离配置(推荐大型项目):
import logging.config
logging.config.fileConfig('logging.conf')
示例 logging.conf 内容:
[loggers]
keys=root,my_app
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_my_app]
level=INFO
handlers=fileHandler
qualname=my_app
propagate=0 # 禁止传播到父级 Logger
-
日志传播控制通过 propagate 属性控制是否向父级 Logger 传递日志:
child_logger = logging.getLogger('parent.child')
child_logger.propagate = False # 仅当前 Logger 处理日志
-
过滤器(Filter)实现精细化日志筛选:
class KeywordFilter(logging.Filter):
def __init__(self, keyword):
super().__init__()
self.keyword = keyword
def filter(self, record):
return self.keyword in record.getMessage()
logger.addFilter(KeywordFilter('重要'))
配置文件管理使用 .conf 或 .ini 文件分离配置(推荐大型项目):
import logging.config
logging.config.fileConfig('logging.conf')
示例 logging.conf 内容:
[loggers] keys=root,my_app [handlers] keys=consoleHandler,fileHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_my_app] level=INFO handlers=fileHandler qualname=my_app propagate=0 # 禁止传播到父级 Logger
日志传播控制通过 propagate 属性控制是否向父级 Logger 传递日志:
child_logger = logging.getLogger('parent.child')
child_logger.propagate = False # 仅当前 Logger 处理日志
过滤器(Filter)实现精细化日志筛选:
class KeywordFilter(logging.Filter):
def __init__(self, keyword):
super().__init__()
self.keyword = keyword
def filter(self, record):
return self.keyword in record.getMessage()
logger.addFilter(KeywordFilter('重要'))
-
性能优化
- 避免高频日志调用:使用
isEnabledFor() 检查级别后再记录:
if logger.isEnabledFor(logging.DEBUG):
logger.debug(f'耗时计算: {expensive_function()}')
- 使用异步日志库(如
concurrent-log-handler)处理高并发场景。
-
多环境配置根据运行环境动态调整配置:
if os.getenv('ENV') == 'production':
logger.setLevel(logging.WARNING)
else:
logger.setLevel(logging.DEBUG)
-
错误处理为关键操作添加异常捕获并记录堆栈:
try:
risky_operation()
except Exception as e:
logger.exception('操作失败: %s', e) # 自动记录堆栈跟踪
性能优化
- 避免高频日志调用:使用
isEnabledFor()检查级别后再记录:if logger.isEnabledFor(logging.DEBUG): logger.debug(f'耗时计算: {expensive_function()}') - 使用异步日志库(如
concurrent-log-handler)处理高并发场景。
多环境配置根据运行环境动态调整配置:
if os.getenv('ENV') == 'production':
logger.setLevel(logging.WARNING)
else:
logger.setLevel(logging.DEBUG)
错误处理为关键操作添加异常捕获并记录堆栈:
try:
risky_operation()
except Exception as e:
logger.exception('操作失败: %s', e) # 自动记录堆栈跟踪
网络请求监控:
import requests
def fetch_data(url):
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
logger.info(f'成功获取 {url} 数据')
return response.json()
except requests.RequestException as e:
logger.error(f'请求失败: {url} - {str(e)}')
return None
通过合理配置 Logger、Handler 和 Formatter,可以构建灵活高效的日志系统。更多高级功能(如远程日志、邮件通知)可参考 Python 官方文档。
到此这篇关于python中logger包详细使用的文章就介绍到这了,更多相关python logger包使用教程内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- 对python中的logger模块全面讲解
- Python实现Logger打印功能的方法详解
- Python中logger日志模块详解
- Python logging设置和logger解析
- Python自定义logger模块的实例代码
- Python中logger模块的使用场景分析
- python更加灵活的Logger日志详解