0

我有以下日志文​​件:

*** 2018-09-14T12:36:39.560671+02:00 (DB_NAME)
*** SESSION ID:(12345) 2018-09-14T12:36:39.560750+02:00
*** CLIENT ID:() 2018-09-14T12:36:39.560774+02:00
*** SERVICE NAME:(DB_NAME) 2018-09-14T12:36:39.560798+02:00
*** MODULE NAME:(mod_name_action (TNS V1-V3)) 2018-09-14T12:36:39.560822+02:00
*** ACTION NAME:() 2018-09-14T12:36:39.560848+02:00
*** CLIENT DRIVER:() 2018-09-14T12:36:39.560875+02:00
*** CONTAINER ID:(1) 2018-09-14T12:36:39.560926+02:00

我想存储从这一行提取的 MODULE_NAME 值:

*** MODULE NAME:(mod_name_action (TNS V1-V3)) 2018-09-14T12:36:39.560822+02:00

即只是这个:

mod_name_action (TNS V1-V3)

我必须使用 python 来做到这一点。我正在尝试类似的东西:

log_i=open(logname,"r")
    for line_of_log in log_i:
       #search the MODULE
       module = "MODULE NAME:("
       str_found_at = line_of_log.find(module)
       if str_found_at != -1: 
          regex = r"MODULE NAME:([a-zA-Z]+)"
          MODULE = re.findall(regex, line_of_log)
          print "MODULE_A==>", MODULE  

    log_i.close()

但它不起作用。有人能帮我吗?

4

3 回答 3

0

使用正则表达式。

演示:

import re

s = """*** 2018-09-14T12:36:39.560671+02:00 (DB_NAME)
*** SESSION ID:(12345) 2018-09-14T12:36:39.560750+02:00
*** CLIENT ID:() 2018-09-14T12:36:39.560774+02:00
*** SERVICE NAME:(DB_NAME) 2018-09-14T12:36:39.560798+02:00
*** MODULE NAME:(mod_name_action (TNS V1-V3)) 2018-09-14T12:36:39.560822+02:00
*** ACTION NAME:() 2018-09-14T12:36:39.560848+02:00
*** CLIENT DRIVER:() 2018-09-14T12:36:39.560875+02:00
*** CONTAINER ID:(1) 2018-09-14T12:36:39.560926+02:00"""

res = []
for line in s.splitlines():
    m = re.search(r"(?<=MODULE NAME:\()(.*?)(?=\)\))", line)
    if m:
        res.append(m.group()+")")
print(res)

输出:

['mod_name_action (TNS V1-V3)']
于 2018-09-20T10:47:23.650 回答
0

您可以在没有正则表达式的情况下执行此操作。我将使用该方法将您的日志数据放入行列表(保留换行符),.splitlines以便我们可以像循环文件一样循环它。

我们可以使用in查找包含“MODULE NAME:”的行,然后我们只需要搜索该行上的第一个 '(' 和最后一个 ')',以便我们可以切出包含名称的子字符串。

log_i = '''\
*** 2018-09-14T12:36:39.560671+02:00 (DB_NAME)
*** SESSION ID:(12345) 2018-09-14T12:36:39.560750+02:00
*** CLIENT ID:() 2018-09-14T12:36:39.560774+02:00
*** SERVICE NAME:(DB_NAME) 2018-09-14T12:36:39.560798+02:00
*** MODULE NAME:(mod_name_action (TNS V1-V3)) 2018-09-14T12:36:39.560822+02:00
*** ACTION NAME:() 2018-09-14T12:36:39.560848+02:00
*** CLIENT DRIVER:() 2018-09-14T12:36:39.560875+02:00
*** CONTAINER ID:(1) 2018-09-14T12:36:39.560926+02:00
'''.splitlines(True)

for line_of_log in log_i:
    #search for the MODULE NAME line
    if "MODULE NAME:" in line_of_log:
        # Find the location of the first '('
        start = line_of_log.index('(')
        # Find the location of the last ')'
        end = line_of_log.rindex(')')
        modname = line_of_log[start+1:end]
        print "MODULE_A==>", modname

输出

MODULE_A==> mod_name_action (TNS V1-V3)

如果日志中只有一个 "MODULE NAME:" 行(或者如果有多个,您只想打印第一个),那么您应该breakprint语句之后放置一个,这样您就不会浪费时间检查以下所有行在文件中。

于 2018-09-20T11:06:51.993 回答
0

它不起作用,因为您的正则表达式模式不正确:模式“[a-zA-Z]+”不匹配“_”和“-”等特殊字符。另外,如果你想去掉括号,你必须使用'\'转义字符将它们包含在你的模式中。最后,而不是使用

 str_found_at = line_of_log.find(module)

您可以在 python 中直接搜索字符串中的子字符串。最后,我会推荐以下代码:

log_i=open(logname,"r")
for line_of_log in log_i:
   #search the MODULE
   module = "MODULE NAME:("
   if module in line_of_log:
      regex = r"MODULE NAME:\((.+)\)"
      MODULE = re.findall(regex, line_of_log)
      print "MODULE_A==>", MODULE[0]
log_i.close()
于 2018-09-20T11:17:42.503 回答