将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的库看起来没问题。寻求解决方案。

广告
将在 10 秒后关闭
bannerAds