2

我正在尝试设置 goaccess 来分析一些高度定制的 apache 输出。我不希望我有机会直接编写 .goaccessrc 文件,因此决定简化日志(在文本编辑器中)并慢慢开始。但是,我什至无法让这个微不足道的例子起作用。我还尝试了一些标记为“已回答”的 SO 示例,但我仍然收到相当简洁的“处理无效”消息。

这是我的简化日志文件中的一行:

2014-05-14 06:26:18 "GET / HTTP/1.1" 200 37.157.246.146

这是我的.goaccessrc:

date_format %Y-%m-%d %H:%M:%S
log_format %d "%r" %s %h

我确定 .goaccessrc 文件在正确的位置并且正在被读取,因为如果我删除它,我会在运行 goaccess 时看到日志格式配置窗口。我敢肯定这是微不足道的,但我就是看不到。这是我最近的终端会话的完整输出:

[root@dev ~] # cat .goaccessrc
date_format %Y-%m-%d %H:%M:%S
log_format %d "%r" %s %h
[root@dev ~] # cat /var/log/apache2/simple.log
2014-05-14 06:26:18 "GET / HTTP/1.1" 200 37.157.246.146
[root@dev ~] # goaccess -f /var/log/apache2/simple.log

GoAccess - version 0.7.1 - Apr 18 2014 21:28:20

An error has occurred
Error occured at: goaccess.c - render_screens - 456
Message: Nothing valid to process.
4

1 回答 1

2

好的,请参阅此处以获取完整答案。它基本上归结为这一点。所有解析似乎都是由 驱动的log_format,而标记分隔符是空格字符。所以在上面的例子中,第一个%d占位符log_format匹配到结尾2014-05-14然后停止。然后下一个标记 ( "%r") 在找到时间部分的开始时失败。

上面的解决方法是:

date_format %Y-%m-%d
log_format %d %^ "%r" %s %h

它匹配日期(仅匹配时间,而不匹配时间),然后忽略直到第一个"字符的所有内容,然后匹配请求 URL,最后匹配状态和主机地址。

请注意,除非日期和时间是单个标记(无空格),否则您无法成功匹配时间部分。

于 2014-05-19T12:30:46.143 回答