【问题标题】:Writing to Apache access_log file with php使用 php 写入 Apache access_log 文件
【发布时间】:2011-05-27 02:57:39
【问题描述】:

我需要将统计数据写入实时 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 文件?

【问题讨论】:

  • 这闻起来是糟糕的设计。为什么要在访问日志中记录不是真正访问的内容?为这些事情使用专用日志文件不是更好吗?
  • 最初的统计数据是从 Apache 日志文件中近乎实时地收集的。随着我们项目的增长,需要更多的统计数据,并且是有条件的。例如,虽然页面加载会像往常一样在 access_log 中放置一个简单的条目,但有时在某些情况下会发生一些事情,只有这样才需要记录。有一个进程“监听”access_log 文件中的信号,并将此信息发送到外部服务器。处理多个日志文件可能会变得非常混乱。
  • @Chris 这可能以某种方式可能 - 如果 PHP 作为 Apache 模块运行,则似乎可以将错误记录到 error_log 例如 - 但使用的是完全不使用的单独日志文件问题?听起来这样会容易得多。 (更新:啊,你扩展了你的评论回答我的问题)
  • 我想我通过解释情况使事情复杂化了。问题真的是“直接写入 access_log 是否可以 - 或者有没有一种简单的方法可以使用 php 达到相同的效果”?
  • 很公平。嗯,也许virtual() 可能比显式请求更快? php.net/manual/en/function.virtual.php 我不知道这些电话是否会被记录

标签: php apache error-log


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    直接写access_log可以吗

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

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

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

    【讨论】:

    • 我们不会过滤特定的页面请求,而是根据情况插入额外的统计信息。 IE。一个页面请求可能会导致我们需要查看多个内容。
    • php中有一个apache_note函数,有帮助吗?
    【解决方案3】:
    <?php
      $h = fopen('/path/to/access_log', 'a');
      fwrite($h, 'Message');
      fclose($h);
    ?>
    

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

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

    【讨论】:

    • 问题不在于拆分 apache 日志,而是能够“添加”通过我们专有的监听软件获取的 access_log 文件。
    • 例如点击“index.html”会导致access_log得到另一行。但在某些情况下,我需要将更多信息写入日志文件,例如“dummy.php?user_is_chris” - 因此一个请求会导致 access_log 中出现两行。我们的“监听”系统每 60 秒统计一次向外部服务器发送的动态报告的统计数据。
    • 例如,我可以 CURL 本地图像并以这种方式传递参数 - 但我的问题不是这个 - 我的问题是在请求中调用本地服务器会使打开的请求加倍。通过将附加信息直接写入 access_log,它可以防止浪费等待的 apache 服务器处理程序。
    • 有时你只需要做你必须做的事情:fwrite() to access_log。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2011-03-24
    • 2017-04-08
    相关资源
    最近更新 更多