本文目录导读:

我来帮你实现Python脚本中不同类型异常的日志记录,以下是几种常用的方法:
基础日志配置
import logging
import traceback
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('app.log', encoding='utf-8'),
logging.StreamHandler() # 同时输出到控制台
]
)
logger = logging.getLogger(__name__)
记录不同类型的异常
def handle_exceptions():
try:
# 示例:不同类型的异常
# 1. ValueError
int("abc")
except ValueError as e:
logger.error(f"值错误: {e}", exc_info=True) # 包含堆栈信息
except TypeError as e:
logger.error(f"类型错误: {e}")
except FileNotFoundError as e:
logger.error(f"文件未找到: {e}")
except Exception as e:
logger.critical(f"未预期的错误: {e}", exc_info=True)
自定义异常处理器
class ExceptionLogger:
"""异常日志记录器"""
def __init__(self, logger):
self.logger = logger
def log_exception(self, exception, context=None):
"""记录异常信息"""
error_info = {
'exception_type': type(exception).__name__,
'exception_message': str(exception),
'stack_trace': traceback.format_exc(),
'context': context or {}
}
# 根据异常类型使用不同日志级别
if isinstance(exception, (ValueError, TypeError)):
self.logger.warning(f"业务异常: {error_info}")
elif isinstance(exception, (IOError, ConnectionError)):
self.logger.error(f"系统异常: {error_info}")
else:
self.logger.critical(f"严重异常: {error_info}")
# 使用示例
handler = ExceptionLogger(logger)
try:
# 业务逻辑
result = 1 / 0
except Exception as e:
handler.log_exception(e, {'user': 'admin', 'operation': 'division'})
带详细信息的异常日志记录
import sys
from datetime import datetime
def detailed_exception_log(exception, verbose=True):
"""详细记录异常信息"""
exc_type, exc_value, exc_traceback = sys.exc_info()
log_entry = {
'timestamp': datetime.now().isoformat(),
'error_type': exc_type.__name__,
'error_message': str(exc_value),
'file': exc_traceback.tb_frame.f_code.co_filename if exc_traceback else None,
'line': exc_traceback.tb_lineno if exc_traceback else None,
'function': exc_traceback.tb_frame.f_code.co_name if exc_traceback else None
}
if verbose:
log_entry['stack_trace'] = traceback.format_exc()
# 获取调用栈信息
stack = []
tb = exc_traceback
while tb:
stack.append({
'file': tb.tb_frame.f_code.co_filename,
'line': tb.tb_lineno,
'function': tb.tb_frame.f_code.co_name
})
tb = tb.tb_next
log_entry['stack_frames'] = stack
return log_entry
# 使用示例
try:
# 一些可能出错的代码
x = [1, 2, 3]
print(x[10])
except Exception as e:
log_data = detailed_exception_log(e)
logger.error(f"异常详情: {json.dumps(log_data, indent=2)}")
装饰器方式记录异常
import functools
def log_exceptions(logger_level='error'):
"""异常日志装饰器"""
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
# 获取日志级别
log_func = getattr(logger, logger_level, logger.error)
# 记录异常信息
log_func(
f"函数 {func.__name__} 执行异常:\n"
f"参数: args={args}, kwargs={kwargs}\n"
f"错误: {e}\n"
f"堆栈: {traceback.format_exc()}"
)
raise
return wrapper
return decorator
# 使用示例
@log_exceptions(logger_level='critical')
def risky_operation(data):
"""可能抛出异常的函数"""
return 1 / data
# 测试
try:
risky_operation(0)
except ZeroDivisionError:
pass # 错误已被记录
完整的异常日志系统
import logging
import traceback
import json
from datetime import datetime
from functools import wraps
class AdvancedExceptionLogger:
"""高级异常日志系统"""
def __init__(self, log_file='advanced_exception.log'):
self.logger = logging.getLogger('AdvancedLogger')
self.logger.setLevel(logging.DEBUG)
# 文件处理器
file_handler = logging.FileHandler(log_file, encoding='utf-8')
file_handler.setLevel(logging.DEBUG)
# 格式器
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
file_handler.setFormatter(formatter)
self.logger.addHandler(file_handler)
def log_exception(self, exception, context=None, severity='error'):
"""记录异常并返回结构化信息"""
exc_type, exc_value, exc_traceback = sys.exc_info()
# 构建结构化日志
log_data = {
'timestamp': datetime.now().isoformat(),
'severity': severity,
'exception': {
'type': exc_type.__name__,
'message': str(exc_value),
'traceback': traceback.format_exc()
},
'context': context or {},
'app_info': {
'python_version': sys.version,
'platform': sys.platform
}
}
# 根据严重程度选择日志级别
log_methods = {
'debug': self.logger.debug,
'info': self.logger.info,
'warning': self.logger.warning,
'error': self.logger.error,
'critical': self.logger.critical
}
log_method = log_methods.get(severity, self.logger.error)
log_method(f"异常日志: {json.dumps(log_data, ensure_ascii=False, indent=2)}")
return log_data
# 使用示例
exception_logger = AdvancedExceptionLogger()
try:
# 模拟不同类型异常
data = {"key": "value"}
print(data["non_existent_key"])
except KeyError as e:
exception_logger.log_exception(
e,
context={'function': 'data_processing', 'data_id': 123},
severity='warning'
)
except Exception as e:
exception_logger.log_exception(e, severity='error')
finally:
# 清理资源
pass
使用建议
-
选择合适的日志级别:
DEBUG: 调试信息INFO: 正常操作信息WARNING: 潜在问题ERROR: 错误但不影响系统运行CRITICAL: 严重错误
-
记录足够的上下文信息:
- 执行时间
- 用户/操作信息
- 参数值(注意敏感信息)
- 系统状态
-
避免记录敏感信息:
- 密码、令牌
- 个人身份信息
- 信用卡号等
-
日志管理:
- 使用日志轮转
- 定期清理旧日志
- 设置合理的日志大小限制
这些方法可以帮助你有效地记录和分析不同类型的异常,便于问题排查和系统监控。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播