繁体   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