我可以让Apache只logging一个请求样本吗?

我的Apache日志文件越来越大,我正在寻找方法,使他们更易于pipe理。

我知道我可以使用条件日志logging来只logging对特定types文件的访问,但是似乎更有意义的是logging随机样本的请求,这样我仍然可以知道发生了什么,而不必logging每一个单一的要求。

有没有类似的东西?

我在Ubuntu的8.04与Apache 2,并使用cronolog进行日志旋转。

我可以想到三个选项来减less日志文件的大小。

  1. 使日志更小,我gzipping他们。 AFAIK这是一个syslogd选项。
  2. 只logging可能有用的东西。 最简洁的方法是根据完整的URL(这样您保留意外的黑客攻击),消除你知道没用的请求(如图像,CSS,JS等)。
  3. 使Apache只loggingstream量的一个子集。

一个可能的方法是你提到的有条件的日志logging。 现在有条件的日志logging使用SetEnvIf Apachefunction。 SetEnvIf状态的实际语法规范:

SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ... 

那么如何使用这个来创build一个只匹配Remote_Addr的“偶数”(或“奇数”)IP地址的expression式呢? 甚至可以通过进一步限制IP范围来进一步削减。

当然你也可以在这里看看你的问题的原因:什么使日志文件“太大”和“难以pipe理”? 他们为你提供什么信息?

为什么不更频繁地旋转日志? 如果每周轮换给你太多的日志,每天都转动它们。 如果每一天,每小时转动一次。 这个解决scheme的问题是在日志分析器,如webalizer:他们需要相应的configuration。

我更喜欢logging一切,因为当你遇到问题时,你永远不会有太多的信息。 而与实际的磁盘价格,我没有容量的问题。

您可以通过LogFormat指令来控制日志格式。

如果卷是问题考虑http://www.mrunix.net/webalizer/你可以运行一个cron作业,并产生良好的graphics。 我认为它甚至看起来已经被logrorate压缩的旧日志里面。

假设日志文件中有错误信息的随机分布,你可以在日志中每20行打印一次

 perl -ne 'print unless (0 != $. % 20)' logfile.txt