【问题标题】:Python log parserPython 日志解析器
【发布时间】:2016-04-27 05:13:26
【问题描述】:

我有一个包含多个命令(以 ; 结尾)及其输出(直到 END)的大型日志,如下所示:

<blabla;

foo
...
...

END

<xyz;

...
...

END

--and so on

要求是具有单独的文件,其命令名称如

blabla
xyz

并且在每个文件中应该是它们各自的输出。

到目前为止我有:

def generateDicts(log_fh):
currentDict = {}
for line in log_fh:
    if line.endswith(";"):
       if line.endswith("END"):
          yield currentDict
       currentDict = {""}
   else:
      currentDict["text"] += line
yield currentDict

with open("logfile.txt") as f:
print list(generateDicts(f))

请帮忙。

【问题讨论】:

  • 1) 您的问题是什么? 2)你的解决方案有什么不足?它会打印错误吗?它是否无法正确执行?

标签: python parsing logging


【解决方案1】:

您的帖子说您需要写入文件,但您的示例不执行任何文件 I/O。这是一个打开、关闭和写入文件的程序。

import fileinput

output = None
for line in fileinput.input():
    line2 = line.strip()
    if line2.startswith('<'):
        output = open(line2[1:].split(';')[0], 'w')
    elif line2 == 'END':
        output.close()
        output = None
    elif output:
        output.write(line)

【讨论】:

  • 文件名应该放在哪里?
  • 你把文件名放在命令行上。将我的程序另存为“parse_log.py”,然后运行此命令:python parse_log.py logfilename.log
  • 我运行它。它生成了一个具有第一个命令名称的空白文件。这是我得到的错误:>python parse_log.py test.log Traceback(最近一次调用最后一次):文件“parse_log.py”,第 9 行,在 output.close() AttributeError: 'NoneType' object has no属性“关闭”
  • 您是否针对您帖子中的示例运行它?对我来说,它完全符合该输入。似乎您必须使用多个 END 而没有中间的“<?
【解决方案2】:

你可以使用re模块

import re
with open('test','r') as f,open('output','w') as f1:
    f1.write("\n".join(re.findall(r'\<(\w+)\;',f.read())))

输出:

blabla
xyz

但是,如果文件太大,可以考虑从文件中逐行读取,而不是整体读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多