xampp默认不切割日志,须用绝对路径调用rotatelogs.exe(如"c:/xampp/apache/bin/rotatelogs.exe -l logs/access-%y-%m-%d.log 86400")并启用mod_log_config模块;virtualhost内可为各站点单独配置日志路径,旧日志需用powershell脚本定期清理。

XAMPP 默认不切割日志,必须用 rotatelogs.exe 手动接管日志输出,否则所有访问和错误都堆在单个文件里,查问题时卡顿、备份困难、磁盘容易爆满。
Windows 下 XAMPP 的 rotatelogs.exe 路径和调用方式
XAMPP 自带 rotatelogs.exe,位置固定在 xampp\apache\bin\rotatelogs.exe,不能用相对路径(比如 bin/rotatelogs.exe 在某些 Apache 版本下会失败),必须写绝对路径或确保 Apache 启动时工作目录正确。
- 推荐写法:用
%APACHE_HOME%环境变量或硬编码全路径,例如"|C:/xampp/apache/bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400" - 不要写成
"|bin/rotatelogs.exe ..."—— XAMPP 2023+ 版本中该写法常报Invalid argument或直接忽略轮转 -
-l参数必须加,否则日志文件名里的%Y%m%d会按 GMT 时间生成,导致“当天日志实际出现在明天文件里” - 如果 Apache 启动报错
Cannot load mod_log_config.so,说明mod_log_config没启用,需在httpd.conf中取消注释:LoadModule log_config_module modules/mod_log_config.so
VirtualHost 里怎么配才能让每个站点单独切日志
直接在 <virtualhost></virtualhost> 块内覆盖 ErrorLog 和 CustomLog,而不是只改主配置。这样不同域名的日志不会混在一起,也方便后续按站清理。
ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键
- 每个站点建议建独立子目录,例如:
logs/site-a/error-%Y-%m-%d.log和logs/site-a/access-%Y-%m-%d.log - 路径要存在,Apache 不会自动创建父目录;缺失时日志会静默丢失,无报错提示
- 示例配置片段:
CustomLog "|C:/xampp/apache/bin/rotatelogs.exe -l logs/site-a/access-%Y-%m-%d.log 86400" combined ErrorLog "|C:/xampp/apache/bin/rotatelogs.exe -l logs/site-a/error-%Y-%m-%d.log 86400"
注意:这里没加 +480 偏移量——-l 已隐含使用本地时区,再加偏移反而会导致时间错乱。
如何保留最近 30 天日志并自动删除旧文件
rotatelogs.exe 本身不支持自动清理,必须靠外部脚本补位。Windows 下最可靠的是用 PowerShell 定时任务,而不是依赖批处理(.bat 对 Unicode 和空格路径支持差)。
- 新建
cleanup-logs.ps1,内容如下:
Get-ChildItem "C:\xampp\apache\logs\*" -Include "*-*.log" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item -Force
- 用 Windows 任务计划程序设置每天凌晨 2 点运行该脚本(注意勾选“不管用户是否登录都要运行”,并配置最高权限)
- 别用
forfiles命令——它对中文路径、带连字符的文件名(如error-2026-03-15.log)识别不稳定 - 如果日志目录里有非轮转产生的文件(如
error_log原始文件),脚本要加-Exclude过滤,避免误删
真正麻烦的不是配轮转,而是轮转后没人管旧文件。很多线上事故就源于某天磁盘突然写满,一查发现是三年前的 access-2023-04-01.log 还躺在那里——rotatelogs 只管生,不管养。










