WAMP的日志日志分两套系统,Apache一套,记录MySQL一套,日志PHP自己还有一套。记录很多人用了几年WAMP,日志从来没打开过日志文件,记录出了问题就到处搜“WAMP报500错误怎么办”——日志里其实写得清清楚楚。日志
默认安装路径下,Apache日志放在 C:\wamp64\logs\apache_error.log 和 access.log。日志error.log是记录你要重点盯的,PHP的日志致命错误、语法错误、记录内存溢出,日志都会经由Apache的记录error handler写到这里。access.log记录每个请求的日志来源IP、时间、请求路径、状态码,排查404和403的时候用得上。
我遇到过一个典型案例:本地站点所有页面返回500,浏览器什么有用信息都不给。打开error.log,一行 PHP Fatal error: Allowed memory size of 134217728 bytes exhausted 直接定位问题——某个循环里递归调用了自身。没有日志的话,这种问题靠猜能猜一下午。
WAMP默认不开启MySQL的查询日志和慢查询日志。想开的话,找到 my.ini(在 wamp64\bin\mysql\mysql8.x.x\ 目录下),在 [mysqld] 段落下加几行:
general-log = 1 general-log-file = "C:/wamp64/logs/mysql_general.log" slow-query-log = 1 slow-query-log-file = "C:/wamp64/logs/mysql_slow.log" long-query-time = 2
long-query-time = 2 意思是超过2秒的查询记入慢日志。本地开发设2秒够了,生产环境一般设0.5秒甚至更低。改完重启MySQL服务才生效。general log 会记录所有SQL语句,调试阶段有用,但日志膨胀极快,一个稍复杂的页面刷几次就能产生几MB。
PHP的错误输出行为由 php.ini 控制。WAMP环境下,开发时通常开启 display_errors = On,错误直接显示在页面上。但有些错误(比如在header已经发送之后才触发的warning)不会显示,只会写日志。确认 log_errors = On 以及 error_log 的路径指向。WAMP默认会把PHP错误写到Apache的error.log里,所以多数情况下你不需要单独配PHP日志文件。
有个细节:PHP 8对未定义变量的处理比PHP 7严格得多。以前 $foo['bar'] 在 $foo 未定义时只给个notice,PHP 8直接抛warning,日志量暴增。升级PHP版本后如果发现error.log突然变大,多半是这个原因。
WAMP不带日志轮转。error.log和access.log会一直追加。跑几个月不清理,几百MB很正常。我自己的做法是写个简单的bat脚本,每周把日志按日期重命名归档,超过30天的删掉。丢在计划任务里跑,省心。
@echo off set LOGDIR=C:\wamp64\logs set DATE=%date:~0,4%%date:~5,2%%date:~8,2% move "%LOGDIR%\apache_error.log" "%LOGDIR%\archive\error_%DATE%.log" move "%LOGDIR%\access.log" "%LOGDIR%\archive\access_%DATE%.log" forfiles /p "%LOGDIR%\archive" /m *.log /d -30 /c "cmd /c del @path"
MySQL日志如果开了general log,建议只在需要时开,用完就关。慢查询日志可以长期开着,体积增长慢,信息密度高。
Apache的 LogLevel 默认是 warn,够用了。调到 debug 会产生海量噪音,除非你在排查mod_rewrite的具体匹配过程,否则别碰。MySQL的慢查询阈值也别设成0,不然等于开了general log,写日志的IO开销反而拖慢查询。
日志这东西,平时不觉得有用,出事的时候就是救命稻草。花十分钟配好,比出问题后花两小时瞎猜划算得多。