我们正在使用Apache Tomcat 7并尝试设置Valve Component以存储我们的访问日志,以便在SnowPlow中进行处理。
我们遇到的问题是如何使这些日志健壮。举个例子 - 我们可以用制表符分隔字段并提取用户代理字符串,如下所示:
pattern="%{yyyy-MM-dd}t	%{hh:mm:ss}t	%{User-Agent}i	"
问题是Valve Component没有(据我所知)转义%{User-Agent}i
,因此useragent中的一个迷路选项卡会破坏数据(行看起来像包含四个字段,而不是三个)。
就解决方案而言,除非有办法逃避我错过的使用者,否则我可以看到几个解决方案:

?),但这似乎不起作用AccessLogValve
- 可能类似于此帖Sanitizing Tomcat access log entries 有点疑惑,我在网上找不到任何其他内容 - 没有人解析他们的Tomcat访问日志吗?
你推荐什么?我们有点卡住......
答案 0 :(得分:1)
RFC2616将用户代理字符串定义为
User-Agent = "User-Agent" ":" 1*( product | comment )
然后将产品定义为
product = token ["/" product-version]
product-version = token
在此之后,令牌被定义为
token = 1*<any CHAR except CTLs or separators>
和分隔符/ CTL为
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
我们不必忘记comment
,它被定义为
comment = "(" *( ctext | quoted-pair | comment ) ")"
ctext = <any TEXT excluding "(" and ")">
quoted-pair = "\" CHAR
CHAR = <any US-ASCII character (octets 0 - 127)>
因此,如果我理解正确,您应该可以使用任何separator
或CTL
,只要您可以区分comment
,其中包含(
和)
{1}}。如果评论中显示(
,则应使用\
进行转义。
答案 1 :(得分:0)
最后,我写了一个custom Tomcat AccessLogValve:
它看起来非常强大 - 我对未转义的值没有任何进一步的问题。