如何阻止Apache访问日志输出到PHP容器的stdout
我来帮你梳理下这个问题的原因和解决办法,你遇到的情况其实很常见——那些看起来像Apache访问日志的条目,其实大概率是PHP-FPM自己在记录访问日志,并且默认输出到了容器的stdout,所以才会出现在PHP容器的日志里。
第一步:确认日志来源
先验证这个猜测,你可以进入PHP容器,找到PHP-FPM的配置文件(路径取决于你用的PHP镜像:官方PHP镜像一般在/usr/local/etc/php-fpm.d/www.conf;Debian/Ubuntu系镜像可能在/etc/php/<你的PHP版本>/fpm/pool.d/www.conf)。
打开配置文件,查找这两项:
access.log:PHP-FPM的访问日志路径,默认可能是/proc/self/fd/1(这是容器的标准输出,直接对应Docker日志)access.format:如果它的格式和Apache的combined日志格式类似,那就能实锤是PHP-FPM在输出这些日志了。比如默认格式可能是这样:access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
第二步:修改PHP-FPM配置,停止输出到stdout
找到配置后,你有几个实用的选择:
选项1:把PHP-FPM访问日志写到文件(保留日志但不占stdout)
把access.log的路径改成容器内的一个文件,比如:access.log = /var/log/php-fpm/access.log注意要确保容器内的
/var/log/php-fpm目录存在,你可以在Dockerfile里加一行RUN mkdir -p /var/log/php-fpm来提前创建。选项2:直接关闭PHP-FPM的访问日志(生产环境如果不需要的话)
把access.log设置为none,或者直接注释掉这行:access.log = none这样PHP-FPM就不会再记录访问日志,自然也不会输出到stdout了。
选项3:用日志轮转管理文件日志(可选)
如果需要保留日志又怕文件过大,可以在容器里配置logrotate工具,定期轮转PHP-FPM的日志文件。
第三步:验证配置是否生效
修改完配置后,先在容器里执行php-fpm -t检查配置有没有语法错误,没问题的话执行php-fpm -s reload重载配置,或者直接重启PHP容器。之后再看docker-compose logs <你的PHP容器名>,那些烦人的访问日志条目应该就消失了,而Apache的访问日志依然会正常写入你配置的/var/log/my_domain/.../access.log文件。
为什么修改Apache的LogLevel没用?
因为LogLevel控制的是Apache错误日志的输出级别,而你看到的那些日志根本不是Apache输出的——是PHP-FPM自己的访问日志。Apache已经通过CustomLog把访问日志写到你指定的文件里了,和PHP容器的日志完全是两回事~
备注:内容来源于stack exchange,提问作者Rohit

