Java實現獲取伺服器日誌並進行處理解析
阿新 • • 發佈:2018-11-03
一、伺服器登陸公鑰祕鑰設定
步驟如下:
1、本機生成私鑰公鑰檔案
本機進入到.ssh目錄下,c:/Users/**/.ssh, 在該目錄下執行
$ ssh-keygen -t rsa
然後一路回車即可。
說明:如果原先./ssh目錄下有id_rsa id_rsa.pub這兩個檔案,以上的一路回車操作會生成新的id_rsa id_rsa.pub來覆蓋原來的key檔案。
或者想生成不同命名的key檔案可以如下操作
說明:命令後面的“-C ‘**@**.com’”也是可以去掉的
2、將本地生成的公鑰資訊放到伺服器
將本地生成的公鑰資訊放置到需要訪問的伺服器,操作如下:
本地獲取公鑰資訊,複製資訊
Xshell登入伺服器,加入你有root許可權,
Cd /root/.ssh
Vi authorized_keys
將以上覆制的內容貼上到檔案尾部。Ok完成。
說明:假設你的伺服器上沒有authorized_keys這個檔案,那麼就自己建立一個,建立完後將公鑰資訊貼上到這個檔案中,儲存,還需要進行授權,chmod 600 authorized_keys。
另外:ssh公鑰生效需滿足至少下面兩個條件:
1 .ssh目錄的許可權必須是700;
2 .ssh/authorized_keys檔案許可權必須是600;
二、連線伺服器
步驟如下
- 將私鑰檔案放到專案的resources目錄下
則程式碼中訪問的路徑是
private String privateKeypath = "src/main/resources/sshkey/id_rsa";
- 程式碼實現連線伺服器
/** * 建立與伺服器的連線 * @param host 伺服器IP String host = "192.168.178.1"; * @param port 埠 int port = 22; * @param userName 登入伺服器的使用者名稱 * @parampassword 登入伺服器的密碼 * @param privateKeyFile 與伺服器公鑰對應的私鑰檔案 String pubkeypath = "src/main/resources/sshkey/id_rsa"; * @return 返回登入的連線, 在使用的最後一定記得關閉connect資源 * @throws IOException */ public static Connection getSSHConnection(String host, int port, String userName, String password, String privateKeyFile) throws IOException { Connection connection = new Connection(host, port); connection.connect(); File file = new File(privateKeyFile); boolean b = connection.authenticateWithPublicKey(userName, file, password); if (b){ return connection; }else { System.out.println("登入連線失敗,請檢查使用者名稱、密碼、私鑰檔案"); return null; } }
三、獲取日誌資訊
/** * 獲取指定log檔案的指定關鍵字的日誌資訊 * @param connection SSH的連線 * @param logFile 需要讀取的log檔案 全路徑 /opt/dubbo_server/**/logs/server-info.log * @param key 關鍵字 例如 節點 * @param timeKey 時間關鍵字 例如 09-21 14:42:1 * @return 返回需要的日誌資訊行 如果有多天日誌資訊滿足條件,只返回最後一天日誌資訊 * @throws IOException */ public static String getLogInfo(Connection connection, String logFile, String key, String timeKey) throws IOException { String cmd = "tail -1000 " + logFile + " | grep '" + key + "'" + " | grep '" + timeKey + "'"; System.out.println("====cmd===" + cmd); Session session = connection.openSession(); session.execCommand(cmd);//執行shell命令 //處理獲取的shell命令的輸出資訊 InputStream stdout = session.getStdout(); InputStreamReader inputStreamReader = new InputStreamReader(stdout); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String s = bufferedReader.readLine(); String lastLineLog = null; System.out.println("==========以下是獲取日誌的全部資訊============"); while(s != null){ if (s != null){ lastLineLog = s; System.out.println(s); } s = bufferedReader.readLine(); } System.out.println("==========以上是獲取日誌的全部資訊============"); System.out.println("========以下是日誌的最後一行資料======="); System.out.println(lastLineLog); //最後關閉session資源 if (session != null){ session.close(); } return lastLineLog; }
四、正則匹配需要的資料
/** * 通過正則表示式獲取需要的子串 * @param logStr * @param regex * 例如 "\\{\"89XF\".*\\}$" 就是匹配logStr中的json串 * "\\{.*\\}$" 匹配對應介面返回查詢資料體 * @return 返回 日誌中的訊息json串 */ public static String useRegexGetStr(String logStr, String regex){ Pattern p = Pattern.compile(regex); //匹配引數體 // Pattern p = Pattern.compile("\\{\"89XF\".*\\}$"); //匹配引數體 Matcher m = p.matcher(logStr); boolean b = m.find(); String params = null; if(b){ params = m.group(); System.out.println(params); } return params; }
正則僅供參考,可以根據自己的需要寫不同的正則來匹配需要的資料