用Java解析MySQL日志文件

时间:2016-11-20 01:00:11

标签: java mysql parsing

我有一个MySQL日志文件,其中包含每个文件的各种信息(当建立连接,进行查询时,连接结束时等)我必须解析日志文件以便我可以每行的数据,把它放在一个数组中,然后根据它进行一些计算。

以下是日志文件中的示例:

151011 12:52:51       1 Connect     user@127.0.0.1 on testdb
              1 Query       SHOW SESSION VARIABLES
              1 Query       SHOW COLLATION
              1 Query       SET character_set_results = NULL
              1 Query       SET autocommit=1
              1 Query       SELECT q1,q2 FROM q_table
              1 Query       SELECT s1,s2 FROM s_table
              1 Query       select count(*) as c from i_table WHERE val = 1
              1 Query       select count(*) as c from k_table WHERE cid = 1
              1 Query       SELECT name,age FROM i_table WHERE ck = 1
151011 12:52:54       1 Query       SELECT name,aid FROM j_table WHERE co = 1
151011 12:52:59       1 Query       SELECT * from values where lastname='smith'

不幸的是,行中的空格没有用制表符分隔(" \ t")。更糟糕的是,有些线路在开始时有额外的日期和时间,而有些则没有。这意味着某些行有更多数据要解析。我该如何解析这个日志文件?

到目前为止,我有以下内容:

Scanner scan = new Scanner(new File("data.log"));
ln = scan.nextLine();
ar = ln.split("\t");
System.out.println(ar[0]);
System.out.println(ar[1]);

但是会打印以下行,例如:

151018 12:52:51                              // First slot in the array
      1 Connect     user@127.0.0.1 on tested // Second slot in the array

有没有办法做到这一点?或者是不可能的?

1 个答案:

答案 0 :(得分:2)

对我来说,你想要使用由空格分隔的以下组进行正则表达式:

  1. 特定于日期的正则表达式(此组是可选的)
  2. 一个数字
  3. " Connect"," Query"或任何位于同一地方的字符串
  4. 以非空格开头并继续使用

    的组
    String dateTime, number, type, message;
    Pattern pattern = Pattern.compile(
        "(\\d{6} \\d{2}:\\d{2}:\\d{2})?\\s+(\\d+)\\s+(Connect|Query)\\s+([^\\s].*)");
    Matcher matcher = pattern.matcher(ln);
    
    if (matcher.matches()) {
        dateTime = matcher.group(1);//this will be null if no date
        number = matcher.group(2);
        type = matcher.group(3);
        message = matcher.group(4);
    }