当使用 apache 托管多个域时,查看包含虚拟主机名的 logwatch apache 输出很有用,但我只得到:
--------------------- httpd Begin ------------------------
Requests with error response codes
400 Bad Request
/: 1 Time(s)
/robots.txt: 1 Time(s)
而我想要类似的东西
--------------------- httpd Begin ------------------------
Requests with error response codes
400 Bad Request
example.com/: 1 Time(s)
example.org/robots.txt: 1 Time(s)
如何使用 logwatch 实现这一目标?
试试这个(对我有用):在你的
httpd.conf
as中定义 LogFormat在这种特殊情况下,您将拥有 remote_address、日期/时间、[根据 UseCanonicalName 设置的服务器名称]、请求、状态代码和Referer(这是我想要的格式),然后放
在您的 services/http.conf LogWatch 文件中。那将
以下是使用此特定指令集的日志输出中的 a 行示例:
如果我们关注错误代码,以及它们在 LogWatch 中的处理方式,您可以对/usr/share/logwatch/scripts/services/http进行以下更改:添加:
然后,关于第 462 行,添加此行以保存我们的第 4 列(HOST):
在第 560 行,在
fmt_url
缩短 (if (length($field{url}) > 60) {...}
) 之后添加:最后,改变:
$needs_exam{$field{http_rc}}{$fmt_url}++;
经过
$needs_exam{$field{http_rc}}{$my_url}++;
这样做,你会在你的 Logwatch 中有这个:
希望对大家有所帮助
我遇到了同样的问题并通过更改
LogFormat
(http://httpd.apache.org/docs/2.2/mod/mod_log_config.htmlapache.conf
)解决了它这会生成与默认相同的输出,添加规范服务器名称作为前缀。例如:
优点是您不需要任何其他自定义(例如在 logwatch 端)。缺点是您会为每个记录的行获得一些额外的字符。
如果您将所有虚拟域记录到同一个日志文件中,我认为这是不可能的...... apache 日志不会区分它们。
我还建议您查看开源OSSEC。我们从 logwatch 转移到它,因为它是实时的并且允许集中关联(将 ssh 登录失败与 apache 400 错误相关联)。
我找到了一篇博客文章,详细介绍了这个问题以及有人如何解决它。不知道这将如何影响日志分析,但在这里注意到它,因为我发现它很有用。
您可以使用 apache 配置中的 LogFormat 指令获取主机名。您可以使用以下选项
我在这个链接中找到了这个信息。Logwatch 应该能够解析自定义信息。
非常感谢@Syquus,他让我走上了修改
/usr/share/logwatch/scripts/services/http
文件的正确道路。我的文件和解决方案不同,但我认为我会共享相同的。
我使用
vhost_combined
Apache 提供的标准 LogFormat,如下所示:LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
输出类似:
example.org:80 1.1.1.1 - - [08/Oct/2013:16:55:01 +0000] "GET / HTTP/1.1" 200 6094 "-" "Opera/9.80 (X11; Linux x86_64; Edition Linux Mint) Presto/2.12.388 Version/12.16"
我把它放在服务配置覆盖中
/etc/logwatch/conf/services/http.conf
:在找到对@Syquus 的解决方案进行更改的大致正确位置之后
/usr/share/logwatch/scripts/services/http
,我认为只需将索引从 [3] 更改为 [0] 就可以了——它没有。我得到了不正确的路径段,即使在遍历整个哈希/数组之后,我也没有找到主机名。调试令人沮丧,因为我是 Perl 的新手,但我的解决方案是添加匹配%v
被丢弃的内容,然后进一步修改 url 以包含域名。我的解决方案的差异(我还删除了 url 截断),YMMV:
如果我决定在 :80 以外的端口上提供安全内容或内容,我可能会在将来包含它。现在应该很明显了。
希望这可以帮助!
更新
进行了更多更改,修复了一个错误。您可以在这里找到我的修改,而不是继续编辑这个答案:https ://bitbucket.org/ubiquitypress/logwatch