CentOS 上 Apache 日志“不全”是常见问题,通常不是 Apache 本身丢了日志,而是配置、轮转、权限或路径导致的。下面按最常见原因逐一说明,并给出排查方法。
很多人在看 /var/log/httpd/access_log,但实际站点用的是:
CustomLog排查:
grep -R "CustomLog" /etc/httpd/
grep -R "ErrorLog" /etc/httpd/
如果你有多个 VirtualHost,可能只有某一个写了日志。
例如:
<VirtualHost *:80>
ServerName a.com
# 没写 CustomLog → 不记录
</VirtualHost>
解决: 每个 vhost 显式写:
CustomLog logs/a_access_log combined
ErrorLog logs/a_error_log
CentOS 默认启用 logrotate:
/etc/logrotate.d/httpd
现象:
access_log-20260101.gz确认:
ls -lh /var/log/httpd/
常见于:
检查权限:
ls -Z /var/log/httpd/
ps aux | grep httpd
SELinux 常见问题:
setenforce 0 # 临时测试
若恢复,则需:
semanage fcontext -a -t httpd_log_t "/new/log/path(/.*)?"
restorecon -Rv /new/log/path
默认:
LogLevel warn
想看更多:
LogLevel debug
如果前面有:
Apache 只看到代理 IP,很多请求根本没进来。
Apache 可能缓冲日志,不是实时写入。
关闭缓冲:
CustomLog logs/access_log combined
(不要用 rotatelogs 的某些参数)
# 1. 实际配置
httpd -S
# 2. 日志路径
grep -R "Log" /etc/httpd/conf*
# 3. 文件情况
ls -lh /var/log/httpd/
# 4. SELinux
getenforce
# 5. 实时观察
tail -f /var/log/httpd/access_log
你可以直接贴一段配置,我帮你逐行看。