制表符分隔的Apache 2.2x的Logformat的潜在问题?

我的雇主拥有一个CustomLogpipe道处理程序,可将静态Web内容机器访问日志缩减并准备好转换为可以转储到hadoop / hive中的kosher格式。 不幸的是,它取决于一个正则expression式,将日志格式与一些有些复杂的逻辑一起转换,以应对互联网可能导致的最糟糕的情况。

修复是取代当前的脚本,并使整个pipe道更持久。 我有一个想法是取消正则expression式的一部分,做一些事情:

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”上的简单拆分可以可靠地中断访问日志。 即使其中一个字段返回为“”,该选项卡也会保持logging的完整性。

问题是,我无法find任何提及这样做的谷歌。 对我来说,直接从源头上打破工作,而不是脚本处理问题。 我在这里错过了什么?

我不认为你错过了任何东西,显而易见的问题是,没有任何引号数据字段必须有任何可能包含分隔符字符。 如果任何带引号的数据字段可能包含您的分隔符,那么您将不得不使用效率较低的方法来随后分隔这些字段。

标签应该是比较安全的

请注意,在2.0.46之前的httpd 2.0版本中,从%… r,%… i和%… o中的string没有执行转义。 这主要是为了符合通用日志格式的要求。 这意味着客户端可以将控制字符插入到日志中,因此在处理原始日志文件时必须非常小心。

出于安全原因,从2.0.46开始,非打印和其他特殊字符主要通过使用\ xhh序列进行转义,其中hh表示原始字节的hex表示forms。 这条规则的例外是“和\,它们是通过预先加一个反斜杠,以及所有用C风格符号(\ n,\ t等)编写的空白字符来转义的。

http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#formats