我的雇主有一个 CustomLog 管道处理程序,它可以将静态 Web 内容机器访问日志缩减并准备为适合转储到 Hadoop/Hive 中的格式。不幸的是,它依赖于正则表达式来转换日志格式,以及一些复杂的逻辑来处理互联网可能遇到的最坏情况。
解决方法是替换当前脚本并使整个管道更加耐用。我的一个想法是取消正则表达式部分并执行以下操作:
LogFormat "%v:%p\t%h\t%l\t%u\t%t\t\"%r\"\t%>s\t%O\t\"%{Referer}i\"\t\"%{User-Agent}i\"" vhost_combined_tabs
诀窍在于每个字段都用制表符分隔。因此,在脚本语言中,只需按“\t”进行简单拆分即可可靠地分解访问日志。即使其中一个字段返回“”,制表符也会保持记录完整性。
问题是,我在谷歌上找不到任何提到这样做的内容。对我来说,从源头上分解工作而不是使用脚本来处理问题似乎是直观的。我在这里遗漏了什么吗?
答案1
我认为您没有遗漏任何东西,明显的问题是未加引号的数据字段不可能包含分隔符。如果任何加引号的数据字段可能包含您的分隔符,那么您将不得不使用效率较低的方法来随后分隔字段。
Tab 应该相对安全
请注意,在 2.0.46 之前的 httpd 2.0 版本中,未对 %...r、%...i 和 %...o 中的字符串执行转义。这主要是为了符合通用日志格式的要求。这意味着客户端可以将控制字符插入日志中,因此在处理原始日志文件时必须非常小心。
出于安全原因,从 2.0.46 开始,不可打印字符和其他特殊字符大多使用 \xhh 序列进行转义,其中 hh 代表原始字节的十六进制表示。此规则的例外是 " 和 \,它们通过在前面添加反斜杠进行转义,以及所有以 C 样式表示法书写的空格字符(\n、\t 等)。
http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats