必须为每个VirtualHost单独配置CustomLog和ErrorLog的绝对路径,使用带域名前缀的日志名、%v字段日志格式、独立轮转机制,并确保HTTPS虚拟主机也配置独立ErrorLog。
Apache虚拟主机日志路径必须用
和
单独声明
每个
块里不显式写日志指令,Apache就默认复用主配置的
和
,所有站点日志混在一起,查500错误时根本分不清是哪个域名出的问题。
必须为每个虚拟主机单独配日志路径,且路径要写绝对路径(相对路径会相对于
,容易误判)。
和
指令必须放在对应
块内部,不能只在全局配置里定义一次
路径推荐用
这类带域名前缀的命名,避免重名或权限冲突
目录得提前建好,Apache不会自动创建父目录;比如设了
,就得先
确保 Apache 进程用户(通常是
或
)对日志目录有写权限,否则启动报
日志格式别直接用
,加个
字段更准确定位虚拟主机
默认
日志格式不记录请求进来的
头,而一个IP跑多个HTTPS站点时,
才是区分流量的关键。光靠IP和端口看不出是哪个域名触发的异常。
定义新日志格式:在
或
里加一行
在虚拟主机里用这个格式:
是实际匹配到的
或
,比
更可靠(后者可能被客户端篡改)
或
必须按虚拟主机粒度切分,否则日志轮转会出错
如果所有虚拟主机共用一个日志文件,
切分后,Apache 还在往旧文件句柄写,新日志就丢了;用
也一样,每个
得配独立的管道进程。
用
:写成
用
:每个日志文件单独配一个
,里面指定
,并带
别图省事把一堆日志路径塞进同一个
配置块——Apache 不支持单次 reload 刷新多个日志文件句柄
HTTPS虚拟主机要额外确认
不影响日志路径生效
有些人在
里漏掉
,以为HTTP和HTTPS能共用一个错误日志。实际上,SSL握手失败、证书过期这些错误只会记到该
自己的
里,主配置的
完全收不到。
必须有独立的
,且路径不能和
的重复(否则两个进程抢写同一文件)
证书相关错误(如
)只出现在对应 HTTPS 虚拟主机的
中
如果用了 SNI,但客户端太老不支持,连接直接断开,这种连 access 日志都不会记——得靠
里的
行定位
日志路径、格式字段、轮转机制、HTTPS隔离这四点只要漏一个,故障分析时就会卡在“到底是谁的日志”上。尤其注意
在
块里不是可选项。
CustomLogErrorLogCustomLogErrorLogServerRootCustomLogErrorLog/var/log/apache2/example.com-access.log/var/log/apache2/site-a/error.logmkdir -p /var/log/apache2/site-awww-dataapachePermission denied: could not open error log filecombined%vcombinedHostHosthttpd.confapache2.confLogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vcombinedCustomLog /var/log/apache2/example.com-access.log vcombined%vServerNameServerAlias%{Host}irotatelogslogrotatelogrotaterotatelogsCustomLogrotatelogsCustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/example.com-access.%Y%m%d.log 86400" vcombinedlogrotate/etc/logrotate.d/apache-example.comcreate 644 www-data www-datapostrotate ... reload ... endscriptlogrotateSSLEngine onErrorLogErrorLogErrorLogErrorLog*:80SSL Library Error: error:140AD009:SSL routines:SSL_CTX_use_certificate_chain_file:PEM libErrorLogErrorLogSSL handshake failedErrorLog*:443