使用php写入Apache access_日志文件

使用php写入Apache access_日志文件,php,apache,error-log,Php,Apache,Error Log,我需要将统计数据写入live Apache access_日志文件(我有另一个进程计算access_日志文件中的特定行,该文件定期向另一个进程报告) 目前,我只是通过在php中执行以下操作来强制进入access_日志文件: file("http://127.0.0.1/logme.php?stuff_that_I_can_watch_here"); php不执行任何操作,返回空值,成功率为200 上述技术的问题在于,对于Apache服务器的每一个请求,都会产生另一个请求来写入日志,从而使所需的

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

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

file("http://127.0.0.1/logme.php?stuff_that_I_can_watch_here");
php不执行任何操作,返回空值,成功率为200

上述技术的问题在于,对于Apache服务器的每一个请求,都会产生另一个请求来写入日志,从而使所需的Apache服务器增加一倍

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

我是否可以直接写入access_日志文件而不引起问题,或者甚至可以使用类似于syslog()或error_log()的php来写入apache_日志文件?


其他人已经对设计发表了评论。Apache访问日志用于Apache记录访问,句号

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

直接写入访问日志可以吗

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

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

不要使用PHP,如果请求完全满足您的要求,请添加一个PHP。

这是一种更合适的方式,这个自定义日志应该包含较少的行,比如不记录静态文件访问。这将直接改进以后对日志的解析。

您可以使用
apache_note
()将值写入注释,然后使用
CustomLog
LogFormat
%{note_NAME}n
)记录新键。然后,解析访问日志的程序也可以读取新的日志参数。

这听起来像是糟糕的设计。为什么要在访问日志中记录并非真正访问的内容?对于这些事情,使用专用的日志文件不是更好吗?最初,统计数据几乎是实时地从Apache日志文件中收集的。随着我们的项目的增长,需要更多的统计数据,并且是有条件的。例如,尽管页面加载会像往常一样将一个简单的条目放入access_日志中,但有时在某些情况下会发生一些事情,只有在这种情况下才需要记录。有一个进程“侦听”access_日志文件中的信号,并将此信息发送到外部服务器。有多个日志文件要处理可能会变得非常混乱。@Chris这在某种程度上是可能的-如果PHP作为Apache模块运行,例如,似乎可以将错误记录到
error\u log
中-但是使用单独的日志文件是完全不可能的吗?听起来那样会容易得多。(更新:啊,你在回答我的问题时扩展了你的评论)我想我解释情况是在把事情复杂化。问题是“直接写访问日志可以吗?或者有没有一种简单的方法可以使用php实现同样的效果?”这很公平。嗯,也许
virtual()?我不知道这些调用是否会被记录下来,尽管我们没有过滤特定的页面请求,而是根据具体情况插入额外的统计数据。例如,一个页面请求可能会导致我们需要查看多个内容。php中有一个函数,这有帮助吗?问题不是拆分apache日志,而是能够“添加”通过我们专有的侦听软件获取的access_日志文件中的内容。例如,单击“index.html”将导致访问日志获得另一行。但是在一些地方,我需要向日志文件写入更多信息,比如“dummy.php?user_is_chris”-因此一个请求会导致access_日志中出现两行。我们的“侦听”系统每60秒统计一次发送到外部服务器的动态端报告的统计数据。例如,我可以通过这种方式卷曲本地映像并传递参数表-但我的问题不是这样-我的问题是在请求中调用本地服务器会使打开的请求加倍。通过将附加信息直接写入访问日志,可以避免浪费等待的apache服务器处理程序。有时您只需执行必须执行的操作:
fwrite()
即可访问日志。
<?php
  $h = fopen('/path/to/access_log', 'a');
  fwrite($h, 'Message');
  fclose($h);
?>