分两种环境:Linux(logrotate 官方方案,推荐)、Windows 计划任务自动删旧日志。
实现效果:按天生成日志、自动压缩、自动删除 N 天前旧日志,每个虚拟主机日志独立。
一、Linux 环境(最标准、生产必用)
1. 先给虚拟主机配置按天切割日志
在每个站点
<VirtualHost> 里写:apache
<VirtualHost *:80>
ServerName site1.com
DocumentRoot /var/www/site1
# 按天生成日志,带年月日
ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/site1-error-%Y%m%d.log 86400 480"
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/site1-access-%Y%m%d.log 86400 480" combined
</VirtualHost>
86400 = 按天切割。2. 配置 logrotate 自动清理 + 压缩
新建配置文件:
bash
运行
vim /etc/logrotate.d/apache_vhost
写入下面配置(直接复制可用):
conf
# 匹配所有站点日志
/var/log/httpd/site1-*.log /var/log/httpd/site2-*.log {
daily
rotate 15
compress
delaycompress
missingok
notifempty
create 644 apache apache
postrotate
systemctl reload httpd > /dev/null 2>&1
endscript
}
参数解释(重点)
daily:每天轮转rotate 15:只保留最近 15 天日志,超过自动删除compress:旧日志自动 gzip 压缩delaycompress:隔一天再压缩,避免占用missingok:日志不存在也不报错notifempty:空日志不轮转postrotate:轮转后平滑重启 Apache,不中断业务
3. 测试并生效
bash
运行
# 模拟测试
logrotate -d /etc/logrotate.d/apache_vhost
# 手动强制执行
logrotate -f /etc/logrotate.d/apache_vhost
系统每天会自动执行,自动切割、压缩、清理过期日志。
二、Windows XAMPP 环境自动清理日志
1. 第一步:虚拟主机按天切割日志
apache
<VirtualHost *:80>
ServerName site1.com
DocumentRoot "D:/xampp/htdocs/site1"
ErrorLog "|D:/xampp/apache/bin/rotatelogs.exe D:/xampp/apache/logs/site1-error-%Y%m%d.log 86400"
CustomLog "|D:/xampp/apache/bin/rotatelogs.exe D:/xampp/apache/logs/site1-access-%Y%m%d.log 86400" combined
</VirtualHost>
2. 写自动清理批处理 .bat
新建
ClearApacheLog.bat:bat
@echo off
rem 设置日志目录
set logDir=D:\xampp\apache\logs
rem 删除 7 天前 .log 日志
forfiles /p %logDir% /s /m *.log /d -7 /c "cmd /c del /f @path"
rem 删除 7 天前 .gz 压缩日志(如果有)
forfiles /p %logDir% /s /m *.gz /d -7 /c "cmd /c del /f @path"
/d -7代表保留最近 7 天,改成 15 就是保留 15 天。
3. 设置 Windows 计划任务
- 搜索「任务计划程序」
- 创建基本任务:每天凌晨 2:00 执行
- 启动程序:选择你写的
ClearApacheLog.bat - 完成 → 每天自动清理旧日志
三、核心总结
- Linux:用
rotatelogs按天切割 +logrotate自动压缩、自动删 N 天前日志,稳定无人工干预。 - Windows:rotatelogs 按天命名 + 批处理 forfiles + 计划任务,定时删除过期日志。
- 每个虚拟主机单独日志文件,互不影响,清理规则统一管控。