解析日志中编写的用户定义方法或类构造的更好方法是什么



我有日志,我需要解析和提取传递给方法或类结构的值。

例如。日志行类似

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 感谢您的帮助。

相关内容

  • 没有找到相关文章

最新更新