如何从toString方法输出的日志内容创建POJO类
简便实现方案
针对从日志字符串还原类实例的需求,推荐用Python的ast.literal_eval配合类构造的方式,安全且易实现,具体步骤如下:
核心思路
- 解析日志字符串,拆分出类名和参数部分
- 将参数字符串转换为字典(用
ast.literal_eval规避安全风险) - 根据类名匹配对应类,用字典参数实例化对象
代码实现
1. 定义与原应用一致的类
工具中需要保持和原应用完全相同的类结构,以Class01为例:
from datetime import datetime import ast import re class Class01: def __init__(self, name, age, dateModified): self.name = name self.age = age # 处理日期类型转换 if isinstance(dateModified, str): self.dateModified = datetime.strptime(dateModified, "%Y-%m-%d").date() else: self.dateModified = dateModified def __repr__(self): date_str = self.dateModified.isoformat() if hasattr(self.dateModified, 'isoformat') else self.dateModified return f"Class01(name={repr(self.name)},age={self.age},dateModified={repr(date_str)})"
2. 日志字符串还原函数
def restore_failed_record(log_str): # 清理日志字符串前后的引号 log_str = log_str.strip('"') # 拆分类名和参数段 split_idx = log_str.find('(') class_name = log_str[:split_idx].strip() params_raw = log_str[split_idx+1:-1].strip() # 处理无引号的日期(如果原日志未给日期加引号) params_raw = re.sub(r'(\d{4}-\d{2}-\d{2})', r'"\1"', params_raw) # 将参数转为字典 params_dict = ast.literal_eval(f"{{{params_raw}}}") # 获取目标类(需确保类已在当前命名空间) target_class = globals()[class_name] # 实例化对象 return target_class(**params_dict)
3. 测试使用
# 模拟日志输入 log_input = 'Class01(name="John",age=30,dateModified=2022-09-30)' # 还原实例 record = restore_failed_record(log_input) print(record) # 输出:Class01(name='John',age=30,dateModified='2022-09-30') print(type(record)) # 输出:<class '__main__.Class01'>
注意事项
- 工具中必须定义与原应用完全一致的类(属性、构造方法参数需完全匹配)
- 如果原日志中特殊类型(如日期)未加引号,需提前用正则处理,避免
ast.literal_eval解析错误 - 优先使用
ast.literal_eval而非eval,防止恶意代码执行风险
内容的提问来源于stack exchange,提问作者Parth
相关产品推荐
相关产品推荐

