Apache 日志默认不分割及使用 Cronolog 进行日志分割与回滚

默认情况下,Apache 不会自动分割日志文件。随着时间的推移,日志文件会逐渐增大,占用大量的磁盘空间。未分割的日志不仅难以管理,还不利于日志分析和统计。因此,定期对日志文件进行分割和压缩是非常重要的操作,尤其是在高并发访问的服务器中。

本文将介绍如何使用 Cronolog 工具对 Apache 日志进行分割与回滚,并提供详细的配置和操作步骤。

1. Apache 日志分割的重要性

长时间不清理 Apache 日志可能会占满磁盘空间,并导致系统性能下降。一个不断增大的日志文件不仅占用宝贵的存储资源,也会给日志分析带来挑战。因此,分割日志文件可以使每个日志文件更加便于管理和分析。

尽管大多数服务(如 Apache、Nginx 等)的日志文件默认不分割,但我们可以使用工具来实现自动分割。

2. 什么是 Cronolog?

Cronolog 是一个简单的过滤工具,用于按日期或其他时间间隔分割日志文件。它可以将 Apache 等服务器的日志按天、月或其他指定的时间段进行分割,从而生成更易于管理的日志文件集。Cronolog 还可以用于分割其他服务的日志,如 Nginx 和 Lighttpd。

Cronolog 的工作原理是从标准输入读取日志记录,并将这些记录写入到由日期和时间动态生成的日志文件中。

Cronolog 的使用场景:

  • 与 Apache 配合使用:按天、月或指定时间间隔分割日志。

  • 兼容其他服务:可以配置来分割其他服务(如 Nginx、Lighttpd)的日志。

3. 如何安装 Cronolog

虽然 Cronolog 的官网已经停止维护,但在大多数 Linux 发行版中,Cronolog 依然可以通过包管理器直接安装。以下是使用 yum 安装 Cronolog 的步骤(适用于 CentOS):

yum -y install cronolog

安装完成后,即可在 Apache 中使用 Cronolog 进行日志分割。

4. 配置 Apache 虚拟主机的日志分割

在 Apache 的虚拟主机配置文件中,可以通过修改 ErrorLogCustomLog 指令来配置 Cronolog 分割日志。

以下是一个虚拟主机配置示例,假设配置文件位于 /app/server/httpd/conf/vhosts/test.com.conf

<VirtualHost *:80>
    DocumentRoot /app/www/test.com
    ServerName test.com
    <Directory "/app/www/test.com">
        Options -Indexes FollowSymLinks
        DirectoryIndex index.php index.html
        AllowOverride all
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog "|/usr/sbin/cronolog /app/server/httpd/logs/test.com-error_%Y%m%d.log"
    CustomLog "|/usr/sbin/cronolog /app/server/httpd/logs/test.com_%Y%m%d.log" combined
</VirtualHost>

配置解析:

  • ErrorLogCustomLog 使用管道符 | 调用 Cronolog 并将日志写入带有日期格式的日志文件中。%Y%m%d 是时间格式,会将日志文件名格式化为 test.com_20240918.log

  • 通过这种配置,每天都会生成一个新的日志文件,日志文件名会根据日期进行自动分割。

5. 检查配置是否正确

在配置完成后,可以通过以下命令检查 Apache 配置文件是否正确:

/app/server/httpd/bin/apachectl -t

输出应为 Syntax OK,表示配置文件没有语法错误。接下来,需重启 Apache 服务使配置生效:

service httpd stop
ps -ef | grep httpd  # 确保所有进程已经停止service httpd start

提示:建议在进行系统级操作时仔细检查每一步,确保无误后再继续操作。

6. 检查 Cronolog 运行情况

您可以通过以下命令检查 Cronolog 是否已经成功运行:

ps -ef | grep cronolog

输出示例:

root  22512  ... /usr/sbin/cronolog /app/server/httpd/logs/test.com-error_%Y%m%d.log
root  22513  ... /usr/sbin/cronolog /app/server/httpd/logs/test.com_%Y%m%d.log

此时,Cronolog 应该已经开始分割日志,新的日志文件将根据配置生成。

7. 日志的定期压缩与清理

即使日志文件被按日期分割,如果服务器的访问量非常大,日志文件的体积可能依然较大。为了进一步优化磁盘使用,可以创建一个简单的 shell 脚本来定期压缩和清理日志文件。

以下是一个示例脚本,日志文件会在 5 天后自动转移并压缩:

#!/bin/bash

log_dir='/app/server/httpd/logs'
days='5'
log_bak_dir='/app/server/httpd/logs/bak'

# 将超过5天的日志文件转移到备份目录
find ${log_dir} -name "*.log" -type f -mtime +${days} | grep -v 'bak' | xargs -I '{}' mv '{}' ${log_bak_dir}

# 压缩备份目录中的日志文件
cd ${log_bak_dir}
for i in `ls -1 ${log_bak_dir}`
do
 gzip $i
done

脚本说明:

  • find 命令用于查找日志目录中超过 5 天的日志文件,并将其移动到备份目录。

  • gzip 命令用于压缩移动到备份目录的日志文件,以节省磁盘空间。

8. 使用默认的 Apache Cronolog 配置

你还可以在全局 Apache 配置文件 /app/server/httpd/conf/httpd.conf 中设置 ErrorLogCustomLog 来使用 Cronolog。例如:

ErrorLog "|/usr/sbin/cronolog /app/server/httpd/logs/error_log"
CustomLog "|/usr/sbin/cronolog /app/server/httpd/logs/access_log" common

请确保使用完整的日志文件路径,因为 Apache 全局配置中的日志路径不能使用相对路径。

9. Cronolog 中的时间格式说明

Cronolog 使用 strftime 函数来格式化日志文件名。常见的格式说明如下:

  • %Y:四位年份(如 2024)

  • %m:月份(01-12)

  • %d:日期(01-31)

  • %H:小时(00-23)

例如,%Y%m%d 会生成类似 20240918 的日志文件名。


通过使用 Cronolog,您可以有效地管理 Apache 日志文件,定期分割和压缩日志文件,不仅提升了日志管理的效率,也节省了宝贵的磁盘空间。如果您希望进一步优化或调整配置,欢迎随时与我联系!

微信微博FacebookXRedditPinterestEmailLinkedInStumbleUponWhatsAppvKontakte