9

我需要将统计数据写入实时 Apache access_log 文件(我有另一个进程计算 access_log 文件中的特定行,该文件定期向另一个进程报告)。

目前,我只是通过在 php 中执行以下操作来强制进入 access_log 文件:

file("http://127.0.0.1/logme.php?stuff_that_I_can_watch_here");

logme.php 什么都不做,返回空并返回 200 成功。

上述技术的问题在于,对于 Apache 服务器的每个请求,都会产生另一个请求来写入日志 - 因此需要加倍的 Apache 服务器。

当服务器堆积起来时,对 Apache 服务器的简单且通常快速的本地调用需要 5 秒以上。

我可以直接写入 access_log 文件而不会引起问题,或者甚至有没有办法使用类似于 syslog() 或 error_log() 的 php 写入 apache_log 文件?

4

3 回答 3

9

您可以使用apache_note( http://php.net/apache_note ) 将值写入便笺,然后使用CustomLog( LogFormat) %{NOTE_NAME}n( http://httpd.apache.org/docs/2.2/mod/mod_log_config.html ) 记录新的钥匙。然后,解析访问日志的程序也可以读取新的日志记录参数。

于 2012-08-27T16:13:55.093 回答
2

直接写access_log可以吗

您可以直接写入 access_log,但不能这样做。
正在运行的 apache 可以产生多个进程,
并且使用 PHP 等较慢的进程锁定文件以进行写入只是进一步延迟了日志记录速度。

或者有没有一种简单的方法可以使用 php 实现相同的效果

不要使用 PHP,如果请求完全满足您的要求,请添加额外的自定义日志。
这是更合适的方式,并且此自定义日志应包含较少的行,例如不记录静态文件访问。这直接改进了以后对日志的解析。

于 2010-12-17T14:02:39.753 回答
1
<?php
  $h = fopen('/path/to/access_log', 'a');
  fwrite($h, 'Message');
  fclose($h);
?>

其他人已经对该设计发表了评论。Apache access_log 用于 Apache 记录访问,期间。

我在一个应用程序中使用了大约十几个自定义日志文件,用于所有不同的监控、性能分析和取证目的。每个目的一个日志文件使日志分析更容易。

于 2010-12-17T13:44:14.710 回答