簡體   English   中英

使用 java 從日志文件中讀取用戶名

[英]Read username from log file using java

我想從日志文件中讀取通過 SSO 和非 sso 成功登錄的用戶名。 我認為正則表達式將有助於實現,但我需要一些方向來構建正則表達式。

從日志中讀取的輸入行:

    12:59:39.924 [ajp-nio-0.0.0.0-8009-exec-87] INFO  AuthenticationStrategy - Authentication for username [user1] & realm [SSORealm] successful.
    13:21:38.017 [ajp-nio-0.0.0.0-8009-exec-87] INFO  AuthenticationStrategy - Authentication for username [user2] & realm [Realm] successful.
    13:19:30.419 [ajp-nio-0.0.0.0-8009-exec-87] INFO  AuthenticationStrategy - Authentication for username [user1] & realm [LdapRealm] failed.

注意:我想讀取成功登錄的用戶名,因為也會出現一些身份驗證失敗並且不想讀取這些名稱。

預期 output:

user1
user2

嘗試讀取日志文件的示例代碼:

public class Log {
public static void main(String as[])
{
    try{
           FileInputStream fstream = new FileInputStream("C:\\Users\\test.log");
           BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
           String strLine;
           while ((strLine = br.readLine()) != null)   {
              System.out.println (strLine);
           }
           fstream.close();
        } catch (Exception e) {
             System.err.println("Error: " + e.getMessage());
        }
}
}

感謝你的幫助

您可以使用正則表達式來獲取每行的用戶名:

String input = "12:59:39.924 INFO  AuthenticationStrategy - Authentication for username [user1] & realm [SSORealm] successful.";
Matcher matcher = Pattern.compile(" (\\[.*?\\])").matcher(input);
if (matcher.find(1)) {
    String userName = matcher.group(1);
    System.out.println(userName);
}

這也可能是一個值得關注的選項:

(?m)(?<=username\\s\\[)[^\\r\\n\\]]+

如果您希望排除failed的,我們可以添加一個否定的前瞻,例如:

(?m)(?!.*\\bfailed)(?<=username\\s\\[)[^\\r\\n\\]]+

正則表達式演示

測試

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "(?m)(?!.*\\bfailed)(?<=username\\s\\[)[^\\r\\n\\]]+";
        final String string = "    12:59:39.924 [ajp-nio-0.0.0.0-8009-exec-87] INFO  AuthenticationStrategy - Authentication for username [user1] & realm [SSORealm] successful.\n"
             + "    13:21:38.017 [ajp-nio-0.0.0.0-8009-exec-87] INFO  AuthenticationStrategy - Authentication for username [user2] & realm [Realm] successful.\n"
             + "    13:19:30.419 [ajp-nio-0.0.0.0-8009-exec-87] INFO  AuthenticationStrategy - Authentication for username [user1] & realm [LdapRealm] failed.\n"
             + "N";

        final Pattern pattern = Pattern.compile(regex);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
        }
    }
}


Output

Full match: user1
Full match: user2

如果您希望簡化/更新/探索表達式,它已在regex101.com的右上角面板中進行了解釋。 如果您有興趣,可以在此調試器鏈接中觀看匹配步驟或修改它們。 調試器演示了 RegEx 引擎如何逐步使用一些示例輸入字符串並執行匹配過程。


正則表達式電路

jex.im可視化正則表達式:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM