1. 程式人生 > >Java實現獲取伺服器日誌並進行處理解析

Java實現獲取伺服器日誌並進行處理解析

一、伺服器登陸公鑰祕鑰設定

步驟如下:

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;

二、連線伺服器

步驟如下

  1. 將私鑰檔案放到專案的resources目錄下

則程式碼中訪問的路徑是

private String privateKeypath = "src/main/resources/sshkey/id_rsa";

  1. 程式碼實現連線伺服器
/**

 * 建立與伺服器的連線

 * @param host 伺服器IP  String host = "192.168.178.1";

 * @param port 埠   int port = 22;

 * @param userName  登入伺服器的使用者名稱

 * @param 
password  登入伺服器的密碼  * @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;

    }

正則僅供參考,可以根據自己的需要寫不同的正則來匹配需要的資料