进入Apache日志请求时(而不是完成时)


9

我正在尝试诊断一个奇怪的服务器崩溃问题(服务器响应ping,但在重新启动之前将不接受SSH连接。0%CPU),重新启动服务器可使一切恢复正常。我想让我的Apache访问日志(或其他一些日志)包含崩溃发生时已经提出的所有请求,但是不幸的是Apache直到完成后才记录请求。这意味着,如果请求使服务器崩溃,则该请求将永远不会完成,因此不会显示在日志中。

有什么方法可以配置Apache以创建一个在请求到达时写入日志文件?


还要查看您的DNS配置,DNS服务器损坏或挂起可能会导致SSH出现各种问题,并且无法登录。
肖恩·金博尔

Answers:


15

我认为您需要法医记录,请参阅以下链接:http : //httpd.apache.org/docs/current/mod/mod_log_forensic.html

片段:

取证日志格式:

每个请求被记录两次。第一次是在进一步处理之前(即,在收到标头之后)。在发生正常日志记录的同时,在请求处理之后写入第二个日志条目。

为了识别每个请求,分配了唯一的请求ID。可以使用%{forensic-id} n格式字符串在正常传输日志中交叉记录此取证ID。如果您使用的是mod_unique_id,则将使用其生成的ID。

第一行记录取证ID,请求行和所有接收到的标头,以竖线字符(|)分隔。样例行如下所示(全部一行):

+ yQtJf8CoAB4AAFNXBIEAAAAA | GET /manual/de/images/down.gif HTTP / 1.1 |主机:localhost%3a8080 |用户代理:Mozilla / 5.0(X11; U; Linux i686; en-US; rv%3a1.6)Gecko / 20040216 Firefox / 0.8 | Accept:image / png等...

开头的加号表示这是此请求的第一条日志行。第二行只包含一个减号和ID:

-yQtJf8CoAB4AAFNXBIEAAAAA

check_forensic脚本将日志文件的名称作为其参数。它查找那些+/- ID对,并在请求未完成时进行投诉。


这就是我一直在寻找的东西,但是看起来好像我不能定期清除此日志(每小时rm /var/log/apache2/forensic.log),否则取证日志就会中断,直到重新启动apache。有想法吗?
Ben Dilts

当然,如果您拥有任何Apache日志,就会发生这种情况。尝试使用logrotate或环境中存在的任何等效项定期(时间或大小)滚动日志。如果不是,则不删除它,而是尝试移动文件,然后触摸/var/log/apache2/forensic.log(尽管查看权限)
sandroid

2

Sandroid的答案很适合您的问题,但是您也应该真正考虑运行网络数据包捕获。如果您有足够的资源,则可以在交换机内镜像端口并使用另一台运行WireShark的计算机来记录所有IP流量可能会有所帮助。如果某些事情导致服务器无法正常响应非HTTP服务,则可能是在坏数据将其发送给Apache之前,它已经取消了IP堆栈。

如果可以确保运行捕获的计算机与其他计算机具有不同的网络硬件和/或驱动程序。会以一个的价格崩溃两个。;-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.