将Apache日志转换为YAML格式
Summary
如其所言,这是一种将Apache日志保存为YAML格式的方法。由于本文只是半开玩笑式的帖子,因此篇幅较短。
办法很简单
只需在httpd.conf文件中进行以下设置。这只是一个例子,您可以根据各自的情况设置要记录的日志项目即可。
LogFormat "- time: !!timestamp %{%Y-%m-%dT%H:%M:%S}t.%{usec_frac}t%{%z}t\n referer: \"%{Referer}i\"\n protocol: %H\n method: %m\n path: \"%U%q\"\n status: !!int %s\n lastStatus: !!int %>s\n file: \"%f\"\n ipAddress: !!str %a\n host: !!str %h\n userAgent: \"%{User-agent}i\"" yaml
CustomLog "/somewhere/httpd.log.yml" yaml
如果这样做,日志会…
- time: !!timestamp 2019-03-17T10:00:00.123456+0900
referer: "-"
protocol: HTTP/2.0
method: GET
path: "/file?query"
status: !!int 200
lastStatus: !!int 200
file: "/my/file"
ipAddress: !!str FE80:0000:0000:0000:0202:B3FF:FE1E:8329
host: !!str example.com
userAgent: "MyWebBrowser/1.0"
这就是YAML的感觉。这样的话,在解析日志的时候,只需使用现有的YAML解析器就可以了。非常方便。
如果在用户代理(User-Agent)中插入换行符或双引号,那就不好处理了。但是通常这样做的人都是不遵守规则的人,所以最好的办法是根本不让他们访问。※双引号似乎Apache会帮忙转义。
实际上,由于该日志中的时间戳不符合YAML的标准,所以需要使用一个可以妥善处理的解析器才能解析出来… Ruby的库看起来没问题。寻求解决方案。