需要过滤,解析和排序多个日志文件

时间:2015-10-05 19:24:25

标签: java arrays regex grep

我需要从驻留在一对多日志文件服务器上的日志文件中收集信息的子集。我有以下java代码执行初始数据收集/过滤:

public String getLogServerInfo(String userName, String password, String hostNames, String id) throws Exception{
    int timeout = 5;
    String results = "";
    String[] hostNameArray = hostNames.split("\\s*,\\s*");

    for (String hostName : hostNameArray) {
        SSHClient ssh = new SSHClient();
        ssh.addHostKeyVerifier(new PromiscuousVerifier());

        try {
            Utils.writeStdOut("Parsing server: " + hostName);
            ssh.connect(hostName);
            ssh.authPassword(userName, password);
            Session s = ssh.startSession();

            try {
                String sh1 = "cat /logs/en/event/event*.log | grep \"" + id + "\" | grep TYPE=ERROR";
                Command cmd = s.exec(sh1);
                results += IOUtils.readFully(cmd.getInputStream()).toString();

                cmd.join(timeout, TimeUnit.SECONDS);
                Utils.writeStdOut("\n** exit status: " + cmd.getExitStatus());
            } finally {
                s.close();
            }
        } finally {
            ssh.disconnect();
            ssh.close();
        }
    }

    return results;
}

results字符串变量如下所示:

  

TYPE = ERROR,TIMESTAMP = 10/03/2015 07:14:31 253 AM,HOST = server1,APPLICATION = app1,FUNCTION = function1,STATUS = null,GUID = null等。   TYPE = ERROR,TIMESTAMP = 10/03/2015 07:14:59 123 AM,HOST = server1,APPLICATION = app1,FUNCTION = function1,STATUS = null,GUID = null等。   TYPE = ERROR,TIMESTAMP = 10/03/2015 07:14:28 956 AM,HOST = server2,APPLICATION = app1,FUNCTION = function2,STATUS = null,GUID = null等等。

我需要完成以下任务:

  1. 我需要做什么才能通过TIMESTAMP对结果进行排序?它现在没有被排序,因为我枚举了一个到多个文件,并将结果附加到字符串的末尾。
  2. 我只想要返回“column”的子集,例如TYPE,TIMESTAMP,FUNCTION。我以为我可以在grep中对它进行REGEX,但也许数组会更好?
  3. 结果只是打印到控制台/报告,因为这仅针对失败的测试打印,仅用于故障排除目的。

2 个答案:

答案 0 :(得分:1)

我把你提供的输出列表放在一个名为test.txt的文件中,确保每个“TYPE = ERROR等”都在一个新行中(我猜你的输出中是一样的) ,但目前尚不清楚。)

然后我用cat test.txt | cut -d',' -f1,2,5 | sort -k2做你想做的事。

  • cut -d',' -f1,2,5基本上用逗号分割,只报告令牌号1,2,5(TYPE,TIMESTAMP,FUNCTION)。如果您想要更多,可以根据您想要的标记添加更多数字
  • sort -k2根据第2栏(TIMESTAMP)
  • 排序

我得到的输出是:

TYPE = ERROR,TIMESTAMP = 10/03/2015 07:14:28 956 AM,FUNCTION = function2

TYPE = ERROR,TIMESTAMP = 10/03/2015 07:14:31 253 AM,FUNCTION = function1

TYPE = ERROR,TIMESTAMP = 10/03/2015 07:14:59 123 AM,FUNCTION = function1

所以你应该尝试做的是用|cut -d',' -f1,2,5 | sort -k2

进一步管理你的命令

我希望它有所帮助。

答案 1 :(得分:0)

在进行了更多工作之后,我发现其中一个键/值对允许使用逗号,因此cut将无效。这是成品:

我的grep命令保持不变,从所有服务器收集数据:

String sh1 = "cat /logs/en/event/event*.log | grep \"" + id + "\" | grep TYPE=ERROR";
Command cmd = s.exec(sh1);
results += IOUtils.readFully(cmd.getInputStream()).toString();

将字符串放入数组中,以便逐行处理:

String lines[] = results.split("\r?\n");

然后我使用正则表达式获取我需要的数据,对数组中的每一行重复下面的内容,并根据需要重复多列。这有点像黑客,我可能只需更换有问题的键/值对中的逗号,然后使用SPLIT()和逗号作为分隔符,然后循环我想要的字段,就可以做得更好。

lines2[i] = "";
Pattern p = Pattern.compile("TYPE=(.*?), APPLICATION=.*");
Matcher m = p.matcher(lines[i]);

if (m.find()) {
    lines2[i] += ("TYPE=" + m.group(1));
}

最后,这将按时间戳排序,因为它是第二列:

Arrays.sort(lines2);