我需要從駐留在一對多日誌文件服務器上的日誌文件收集信息子集。我有以下的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 = n ULL,GUID = null等等等等
我需要完成以下任務:
- 什麼我需要做的是能夠通過TIMESTAMP結果進行排序?它現在是未排序的,因爲我列舉了一個到多個文件,並將結果追加到字符串的末尾。
- 我只想要返回一列「列」的子集,如TYPE,TIMESTAMP,FUNCTION。我以爲我可以REGEX它在grep,但也許陣列會更好?
結果只是打印到控制檯/報告中,因爲只打印失敗的測試結果,並且僅用於故障排除目的。
,謝謝,我想切的解決辦法工作,從而解決了#2。我是否需要將數據放入不同的對象才能排序?你上面看到的是閱讀完所有文件後的結果。您所擁有的排序在每個文件中完成,因此最終結果仍未排序。 – Greg
如果文件不是太大,你可以先將它們結合在一起(合併它們),然後應用這個解決方案。 – Edd
或者,在過濾出不喜歡的列之後(如上所示),可以將每行存儲到您定義的數據結構中,將它們全部添加到ArrayList中並使用Collections.sort(yourList,new Comparator()),在比較器中需要爲時間戳定義一個比較運算符。它很混亂,但它會起作用。 –
Edd