[英]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));
}
}
}
Full match: user1
Full match: user2
如果您希望簡化/更新/探索表達式,它已在regex101.com的右上角面板中進行了解釋。 如果您有興趣,可以在此調試器鏈接中觀看匹配步驟或修改它們。 調試器演示了 RegEx 引擎如何逐步使用一些示例輸入字符串並執行匹配過程。
jex.im可視化正則表達式:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.