用于解析HttpLog格式的正则表达式模式

时间:2010-10-29 19:59:12

标签: regex logging haproxy

我正在寻找HttpLogFormat中字符串的正则表达式模式匹配器。该日志由haproxy生成。以下是此格式的示例字符串。

Feb 6 12:14:14 localhost haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} {} "GET /index.html HTTP/1.1"

HttpLogFormat提供了格式说明。任何帮助表示赞赏。

我正在尝试获取该行中包含的各种信息。以下是字段:

  1. process_name'['pid']:'
  2. client_ip':'client_port
  3. '['accept_date']'
  4. frontend_name
  5. backend_name'/'server_name
  6. Tq'/'Tw'/'Tc'/'Tr'/'Tt *
  7. STATUS_CODE
  8. bytes_read缓存
  9. captured_request_cookie
  10. captured_response_cookie
  11. termination_state
  12. actconn'/'feconn'/'beconn'/'srv_conn'/'retries
  13. srv_queue'/'backend_queue
  14. '{'captured_request_headers *'}'
  15. '{'captured_response_headers *'}'
  16. '“'http_request'”'

5 个答案:

答案 0 :(得分:4)

正则表达式:

^(\w+ \d+ \S+) (\S+) (\S+)\[(\d+)\]: (\S+):(\d+) \[(\S+)\] (\S+) (\S+)/(\S+) (\S+) (\S+) (\S+) *(\S+) (\S+) (\S+) (\S+) (\S+) \{([^}]*)\} \{([^}]*)\} "(\S+) ([^"]+) (\S+)" *$

结果:

Group 1:    Feb 6 12:14:14
Group 2:    localhost
Group 3:    haproxy
Group 4:    14389
Group 5:    10.0.1.2
Group 6:    33317
Group 7:    06/Feb/2009:12:14:14.655
Group 8:    http-in
Group 9:    static
Group 10:   srv1
Group 11:   10/0/30/69/109
Group 12:   200
Group 13:   2750
Group 14:   -
Group 15:   -
Group 16:   ----
Group 17:   1/1/1/1/0
Group 18:   0/0
Group 19:   1wt.eu
Group 20:   
Group 21:   GET
Group 22:   /index.html
Group 23:   HTTP/1.1

我使用RegexBuddy来编写复杂的正则表达式。

答案 1 :(得分:2)

Use at your own peril

这假设所有字段都返回 除了标有星号的字段(星号是什么意思)?还有一些明显的失败案例,例如任何类型的嵌套括号,但如果记录器打印出合理合理的消息,那么我猜你会没事......

当然,即使我个人也不想维持这一点,但你有它。如果可以的话,你可能想考虑为此编写一个常规的ol'解析器。

编辑:将此标记为CW,因为它更像是“我想知道这会变成什么样的答案”而不是其他任何答案。为了快速参考,这是我最终在rubular中构建的内容:

^[^[]+\s+(\w+)\[(\d+)\]:([^:]+):(\d+)\s+\[([^\]]+)\]\s+[^\s]+\s+(\w+)\/(\w+)\s+(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d*)\s+(\d+)\s+(\d+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d+)\s+(\d+)\/(\d+)\s+\{([^}]*)\}\s\{([^}]*)\}\s+\"([^"]+)\"$

我的第一个编程语言是Perl,甚至我也愿意承认我对此感到害怕。

答案 2 :(得分:1)

这看起来像是一个非常复杂的字符串。我建议使用像Expresso这样的工具。从您尝试匹配的字符串开始,然后开始用Regex表示法替换它。

要抓取单个部分,请使用分组括号。

另一种选择是为你想要抓取的每件作品制作正则表达式。

答案 3 :(得分:1)

为什么要准确匹配这条线?如果您正在寻找其中的特定字段,请更好地指定哪些字段并将其提取出来。如果要在haproxy日志上运行统计信息,则应该查看源中“contrib”目录中的“halog”工具。从版本1.4.9开始,它甚至知道如何按响应时间对URL进行排序。

但无论你想用这些线做什么,正则表达式可能永远是最慢和最复杂的解决方案。

答案 4 :(得分:0)

我不认为正则表达式是你最好的选择...但是,如果这是你的唯一选择......

请尝试查看这些选项。 https://serverfault.com/q/62687/438