我有日志,我需要解析和提取传递给方法或类结构的值。
例如。日志行类似
2021-08-10 08:10:00.345 | 2021-08-10 08:10:00.345 |调试 |测试.进口A.yada |sometext - [ somefunction(arg1=3,arg2=">odd"),somefunction2(arg1=8,arg2="even")]。
从上面的行我需要提取字符串列表(上面的粗斜体)。并检索参数和函数名称。该列表可以具有相同或不同的功能。
我能够使用正则表达式检索字符串列表,但在从字符串更改为列表后将其迭代为列表,python抱怨:对象未定义或值错误。为了解决这个问题,我使用了exec.但是想知道是否有更多的pythonic方法可以做到这一点。
寻求专家意见。正如我们记录函数条目的地方一样很正常 - 使用参数退出,但我们如何检索它。如果您无权访问这些函数签名或模块,则实际上无法导入所有可能在日志中弹出的函数。
给定问题中的message
值,此python将通过eval(str)
创建有效对象:
创建函数名称和参数为 k,v 的字典列表
import re
msg = u' { "message" : "sometext - [func1(arg1=2,arg2='even'), func1(arg1=3,arg2='odd')]"}'
# get the string representing the list
lstStr = msg.split(' - ')[1][:-2]
#replace 'func1(' with 'dict(...'
arr = re.sub('func1[(]','dict(name="func1",',lstStr)
print(eval(arr)[0])
print(eval(arr)[1])
结果:
{'name': 'func1', 'arg1': 2, 'arg2': 'even'}
{'name': 'func1', 'arg1': 3, 'arg2': 'odd'}
此正则表达式模式func1[(]
将被dict(name="func1"
替换,这将创建一个字典并将函数名称添加为项目。
用于搜索函数名称的正则表达式甚至可以是通用
的msg = u' { "message" : "sometext - [func1(arg1=2,arg2='even'), xyz_vcx(arg1=3,arg2='odd')]"}'
lstStr = msg.split(' - ')[1][:-2]
arr = re.sub(r'([a-z][a-zA-Z0-9_]+)[(]',r'dict(name="1",',lstStr)
lstOfDict = eval(arr)
print(arr)
print(lstOfDict[0])
print(lstOfDict[1])
print(u'function {} , args: {} {}'.format(lstOfDict[1]['name'], lstOfDict[1]['arg1'], lstOfDict[1]['arg2'] ))
结果:
[dict(name="func1",arg1=2,arg2='even'), dict(name="xyz_vcx",arg1=3,arg2='odd')]
{'name': 'func1', 'arg1': 2, 'arg2': 'even'}
{'name': 'xyz_vcx', 'arg1': 3, 'arg2': 'odd'}
function xyz_vcx , args: 3 odd
由于该函数可能有 args 和 kwarg,并且它们的数量是未知的,我想避免到处切片并使用一些。
msg = u' { "message" : "sometext - [func1(arg1=2,arg2='even'), xyz_vcx(arg1=3,arg2='odd')]"}'
lstStr = msg.split(' - ')[1][:-2]
创建了另一个函数名称evalstring
,它将在try异常块中递归地评估lstSTR
,异常调用了其他函数createfunction
,这些函数基于预定义的模板创建函数。createfunction
的输入是从异常中的回溯消息派生的名称。
createfunction
我只需将函数名称替换为 F 字符串,并用exec()
调用整个字符串。
预定义的模板字符串如下所示:
"""
def {functionname}(*args, **kwargs):
argdict = {{}}
argdict["args"]=args
argdict["kwargs"]=kwargs
return argdict
"""
如果对完整代码感兴趣,请告诉我。
@LMS 感谢您的帮助。