我正在寻找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提供了格式说明。任何帮助表示赞赏。
我正在尝试获取该行中包含的各种信息。以下是字段:
答案 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)
这假设所有字段都返回 除了标有星号的字段(星号是什么意思)?还有一些明显的失败案例,例如任何类型的嵌套括号,但如果记录器打印出合理合理的消息,那么我猜你会没事......
当然,即使我个人也不想维持这一点,但你有它。如果可以的话,你可能想考虑为此编写一个常规的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