不同tomcat日志条目的正则表达式模式

时间:2011-08-10 18:17:21

标签: java regex

我是正则表达式的新手。

如果我从tomcat的访问日志文件中获得以下行:

123.45.67.89 - - [27 / Oct / 2000:09:27:09 -0400] \“GET /java/javaResources.html HTTP / 1.0 \”200 10450 \“ - \”\“Mozilla / 4.6 [ en](X11; U; OpenBSD 2.8 i386;导航)\“”

以下模式适用于与上面完全相同的条目:

"^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"([^\"]+)\""

但并非所有日志条目看起来都与上面的条目完全相同,有时它包含9个字段,有时是7个。 9场准备的例子:

82.132.139.79 - - [14 / Jul / 2011:18:52:44 +0100]“GET /~roger/cpp/introans.htm HTTP / 1.1”200 11195“http://www.dcs.bbk .ac.uk / ~roger / cpp / intro3.htm“”Mozilla / 5.0(iPhone; U; CPU iPhone OS 4_2_1,如Mac OS X; en-us)AppleWebKit / 533.17.9(KHTML,与Gecko一样)Version / 5.0 .2移动/ 8C148 Safari / 6533.18.5“

但是,我只对IP,日期和时间以及URL感兴趣。 是否存在仅从日志条目中搜索匹配条目的模式,而不管其字段的编号是什么?

1 个答案:

答案 0 :(得分:6)

您在示例中提供的行是伪标准combined log format。这种9字段格式扩展了广泛使用的common log format和另外两个字段:referrer和user-agent。

通过在正则表达式中将最后两个字段设为可选字段,您可以匹配常用或组合格式的行:

"^(\\S+) (\\S+) (\\S+) \\[(.*?)\\] \"(.*?)\" (\\S+) (\\S+)( \"(.*?)\" \"(.*?)\")?"

捕获组是:

  1. 远程主机
  2. RFC 1413身份
  3. 用户ID
  4. 日期时间
  5. 请求
  6. 状态
  7. 字节
  8. 可选的合并字段
  9. 引荐
  10. 用户代理
  11. 此模式故意对日志消息中特定字段的内容不具体。通常,在解析日志时,您需要提取任何内容,而不是尝试验证规范。