最佳的Apache日志文件轮转方法

70

我有一个Apache服务器,它有一个访问日志文件,大小已经超过了600MB。这使得搜索或解析该文件非常困难。
有哪些适用于Apache的软件或模块可以每天复制一份访问文件,以使其更易管理?


7
幸运的是,我面对的文件大小是2.4 GB :( - Bobby Jack
你可以说明一下你是否真的在寻找一个Apache模块,或者是依赖于所使用的操作系统,比如logrotate或cron(已经在答案中提到)。这可以帮助回答这个 - 在我看来 - 简单的问题。 - Kariem
1
这里有14GB的数据!记录了一年多的条目。 - Liam
我不关心日志,只希望它们不会无限增长:在WIN上,我使用以下代码来设置最大为7个15MB的日志文件。CustomLog "|bin/rotatelogs.exe -l logs/access.%A.log 15M" common - Tilo
划掉之前的话,根据Bug 51081 https://issues.apache.org/bugzilla/show_bug.cgi?id=51081,rotatelogs将不会覆盖。 - Tilo
这里有23 GB的数据,存储在一台旧服务器上...这应该是一个内置功能。 - Micha Mazaheri
7个回答

50

你看过logrotate吗?这可能是最简单、最广泛可用和最易于理解的方法。它高度可配置,可能可以满足你90%的需求。


16
像Brian的回答那样提供一个用法示例会非常有帮助。谢谢。 - Ryall
1
logrotate 的缺点是,在进程重新启动之前,日志文件将继续写入旧的文件名。 - MarkHu

28

我非常喜欢Cronolog。只需安装它,然后将您的日志通过管道传递。对于每日日志轮换,可以这样实现:

ErrorLog  "|/usr/bin/cronolog /path/to/logs/%Y-%m-%d/error.log"
CustomLog "|/usr/bin/cronolog /path/to/logs/%Y-%m-%d/access.log" combined

非常方便,一旦安装后,比logrotate更易于使用(根据我的经验)。


2
当我使用cronolog时,遇到了一些问题,当日志文件达到2GB的数据时。此时就不再记录日志,直到我删除/重命名该文件为止,Apache也会停滞不前。自从使用logrotate以来,一切都很好 :) - maxgalbu

13

实际的Windows命令非常难在网上找到,具体命令如下:

The actual command for Windows, which is quite difficult to find online is:

CustomLog '|" "*Apache-Path/bin/rotatelogs.exe" 
    "**Apache-Path*/logs/backup/internet_access_%d-%m-%y.log" 86400' combined

“internet_access”比特位是您选择的文件名,86400是一天中的秒数。 您需要将Apache-Path更改为已安装Apache的相关目录。


与其试图在路径周围添加引号,我最终缩短了它们,例如 "c:/Progra~1/..."。此外,虽然花了一些时间,但我最终意识到路径中需要正斜杠。 - Pedro
1
不要在路径中使用反斜杠,它不起作用!或者,您可以使用[mod_log_rotate](http://www.sitebuddy.com/mod_log_rotate) 。使用此模块还可以避免Windows下的cmd.exe问题。 - s106mo
1
我在 Apache2.4(Windows 8)上实现日志轮换时遇到了一些问题。但是通过以下方式解决了这个问题。在 httpd.conf 文件中添加以下行: ServerRoot "c:/Apache24" # Apache 安装路径#CustomLog "|bin/rotatelogs logs/access.log.%Y-%m-%d 86400" common

上述代码无法工作,但当添加 .exe 后缀时却可以。

CustomLog "|bin/rotatelogs.exe logs/access.log.%Y-%m-%d 86400" common
- user292049
请注意,除非您添加“-L basename”选项,否则“-n 4”“循环日志”选项可能无法按预期工作。 - MarkHu
@alimack,你能否提供配置rotatelog的确切命令?因为我在尝试启动Apache服务器时遇到了“无法打开日志错误”。 - Dharani Dharan
显示剩余2条评论

11

logrotate

logrotate可能是最好的解决方案。使用文件/etc/logrotate.conf更改所有日志的设置。您可以将weekly更改为daily,以便每天轮换日志。此外,您可能希望添加compress以压缩存档。如果您不关心旧日志,则可以将rotate 4设置为较低的数字。


1
我很感兴趣 - 这个和Apache提供的 'rotatelogs' 有什么区别?为什么Apache手册没有提到logrotate(但是它确实提到了cronolog)? - Bobby Jack
2
只是一种假设:这可能是因为并非所有 Apache 运行的系统都可用 logrotate。我只在 Linux 安装中使用过它,在其中它用于滚动所有系统日志,当然包括 Apache 的日志文件。 - Kariem

3

CustomLog "|bin/rotatelogs /var/logs/logfile 5M" common

这个配置会在日志文件大小达到5兆字节时将其轮转。

ErrorLog "|bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M" 

这是重定向Apache日志的最佳方式。无需使用httpd编译mod。

2
有没有一些 rotatelogs 的选项可以删除旧文件或覆盖它们? - Tobia
@Tobia,你找到删除旧文件的解决方案了吗? - surya
1
我不得不切换到索引日志名称(rotatelogs.exe -n 3 filepath 1M),而不是使用日期日志名称。 - Tobia
使用 rotatelogs -t ... 100M ,我发现每次日志文件都会被覆盖,而不是追加。有没有办法让 rotatelogs 追加到已存在的日志文件中? - not2savvy

1

在Windows操作系统中,可以使用rotatelog.exe或cronolog.exe。它们通常用于http.conf文件中的管道命令。 Mod_log_rotate是Apache的附加模块,仅用于访问日志轮换。 而Logrotate则仅适用于Unix操作系统。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接