user2435860
user2435860

Reputation: 798

java regular expression for parsing log file

I am trying to parse a log file, and I want to extract parameters from the lines entered. Here is an example, for the line:

"Apr  8 07:13:10 kali gnome-screensaver-dialog: gkr-pam: unlocked login keyring"

The program gives me:

Date&Time: Apr 11 00:06:30
Hostname: kali
Program Name: gnome-screensaver-dialog
Log: gkr-pam: unlocked login keyring

But for the line:

"Apr  8 07:13:45 kali gnome-screensaver-dialog: pam_unix(gnome-screensaver:auth): authentication failure; logname= uid=0 euid=0 tty=:0.0 ruser= rhost=  user=root"

I have an error from java. The error is "Regular Expression not matching", from my code, which indicates that my reges is bogus. Basically, I want to extract the Date&Time, Hostname, Program Name, and Log Message The problem is at extracting the Program Name, it is the first thing before the first colon, for example for the line above it should give me:

   Date&Time: Apr  8 07:13:45
    Hostname: kali
    Program Name: gnome-screensaver-dialog
    Log: pam_unix(gnome-screensaver:auth): authentication failure; logname= uid=0 euid=0 tty=:0.0 ruser= rhost=  user=root

Here is my partial java code:

private class FileTailerListenerAdapter extends TailerListenerAdapter {
        @Override
        public void handle(String line) {
            String logEntryPattern = "([\\w]+\\s[\\d]+\\s[\\d:]+) ([\\w]+) ([\\[\\]\\(\\)a-zA-Z0-9\\-]+)[?:] (.+)";
            Pattern p = Pattern.compile(logEntryPattern);
            Matcher matcher = p.matcher(line);

            if (!matcher.matches()) {
                System.err.println("Regular Expression not matching:");
                System.err.println(line);
                return;
            }
            System.out.println("Total groups: " + matcher.groupCount());
            System.out.println("Date&Time: " + matcher.group(1));
            System.out.println("Hostname: " + matcher.group(2));
            System.out.println("Program Name: " + matcher.group(3));
            System.out.println("Log: " + matcher.group(4));
            System.out.println();
            System.out.println();
        }
    }

Any help would be greatly appreciated!

Upvotes: 0

Views: 1290

Answers (1)

FlasH from Ru
FlasH from Ru

Reputation: 1215

It seems like hostname and program name cannot contain spaces - knowing that you can simplify your regexp a lot: separate hostname, program name and log message using whitespace characters - and everything will work:

final String logEntryPattern = "(\\w+\\s+\\d+\\s+\\d{2}:\\d{2}:\\d{2})\\s+(\\S+)\\s+(\\S+):\\s+(.+)";
final Pattern p = Pattern.compile(logEntryPattern);
final Matcher matcher = p.matcher(line);

if (!matcher.matches()) {
    System.err.println("Regular Expression not matching:");
    System.err.println(line);
    return;
}
System.out.println("Total groups: " + matcher.groupCount());
System.out.println("Date&Time: " + matcher.group(1));
System.out.println("Hostname: " + matcher.group(2));
System.out.println("Program Name: " + matcher.group(3));
System.out.println("Log: " + matcher.group(4));

Upvotes: 2

Related Questions