我需要从驻留在一对多日志文件服务器上的日志文件中收集信息的子集。我有以下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等等。
我需要完成以下任务:
结果只是打印到控制台/报告,因为这仅针对失败的测试打印,仅用于故障排除目的。
答案 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);