[英]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.