解析字符串的多个日志文件

时间:2017-02-16 21:57:28

标签: python linux python-2.7 logging glob

我试图从日志目录中解析许多日志文件,在列表中搜索任意数量的字符串以及服务器名称。我觉得我已经尝试了一百万个不同的选项,而且我只使用一个日志文件就可以正常工作..但是当我尝试浏览目录中的所有日志文件时,我似乎无法获得任何地方。

if args.f:
    logs = args.f
else:
    try:
        logs = glob("/var/opt/cray/log/p0-current/*")
    except IndexError:
        print "Something is wrong. p0-current is not available."
        sys.exit(1)

valid_errors = ["error", "nmi", "CATERR"]

logList = []
for log in logs:
    logList.append(log)



#theLog = open("logList")
#logFile = log.readlines()
#logFile.close()
#printList = []

#for line in logFile:
#    if (valid_errors in line):
#        printList.append(line)
#
#for item in printList:
#    print item


#    with open("log", "r") as tmp_log:

#       open_log = tmp_log.readlines()
#           for line in open_log:
#               for down_nodes in open_log:
#                   if valid_errors in open_log:
#                       print valid_errors

down_nodes是脚本内部的预填充列表,其中包含标记为关闭的服务器列表。

注释掉了我正在努力完成的各种尝试。

logList = []
for log in logs:
    logList.append(log)

我认为这可能是将每个单独的日志文件放在列表中的方法,然后遍历此列表并使用open()后跟readlines(),但我错过了某种类型的逻辑在这里..也许我没有正确思考。

我可以在这里做一些指示。

感谢。

2 个答案:

答案 0 :(得分:1)

所以你的最后一个for循环是多余的,因为logs已经是一个字符串列表。有了这些信息,我们就可以遍历logs并为每个log执行一些操作。

for log in logs:
    with open(log) as f:
        for line in f.readlines():
            if any(error in line for error in valid_errors):
                #do stuff

if any(error in line for error in valid_errors):检查line,看看valid_errors中的任何错误是否在行中。语法是一个生成器,为error中的每个error生成valid_errors

要回答涉及down_nodes的问题,我认为您不应将其包含在同一any()中。你应该尝试像

这样的东西
if any(error in line for error in valid_errors) and \
    any(node in line for node in down_nodes):

答案 1 :(得分:1)

首先,您需要找到所有日志:

import os
import fnmatch

def find_files(pattern, top_level_dir):
    for path, dirlist, filelist in os.walk(top_level_dir):
        for name in fnmatch.filter(filelist, pattern)
            yield os.path.join(path, name)

例如,要查找当前目录中的所有*.txt个文件:

txtfiles = find_files('*.txt', '.')

然后从名称中获取文件对象:

def open_files(filenames):
    for name in filenames:
        yield open(name, 'r', encoding='utf-8')

最后来自文件的各行:

def lines_from_files(files):
    for f in files:
        for line in f:
            yield line

由于您要查找某些错误,因此检查可能如下所示:

import re

def find_errors(lines):
    pattern = re.compile('(error|nmi|CATERR)')
    for line in lines:
        if pattern.search(line):
            print(line)  

您现在可以处理从给定目录生成的行流:

txt_file_names = find_files('*.txt', '.')
txt_files = open_files(txt_file_names)
txt_lines = lines_from_files(txt_files)
find_errors(txt_lines)

将日志作为数据流处理的想法源于David Beazley的谈话。