読者です 読者をやめる 読者になる 読者になる

httpdをreloadしてログを切り替える際、ロギングに漏れが出るか

表題の内容を試したが、結果やはり漏れは出なそう。
そもそもは、logrotate時の動作が知りたかった。設定はデフォルトだと以下のような感じ。
$ less /etc/logrotate.d/httpd
/var/log/httpd/*log {
daily
rotate 30
missingok
notifempty
sharedscripts
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}

これを見て、reloadしたときにログに漏れが出ないのかがふと気になった。本当はapacheのreloadがどういった挙動をするか調べるべきだが、軽く調べてわからなかったため、手っ取り早く実証することにした。
手順としては連番の公開ファイルを作成し、順番にアクセスしている途中でアクセスログをリネーム(mv /var/log/httpd/access_log var/log/httpd/access_log.1)→httpdのリロード(sudo /etce/init.d/httpd reload)を行う。

アクセスするシェルは以下。
#!/bin/bash
for i in `seq 1 100000`
do
curl http://localhost/index$i.html
done

アクセスした結果は以下。
access_log.1(リネームした旧ファイル)
127.0.0.1 - - [19/Jun/2014:08:04:24 +0900] "GET /index10.html HTTP/1.1" 200 14 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
127.0.0.1 - - [19/Jun/2014:08:04:24 +0900] "GET /index11.html HTTP/1.1" 200 14 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
(中略)
127.0.0.1 - - [19/Jun/2014:08:05:42 +0900] "GET /index10972.html HTTP/1.1" 200 14 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
127.0.0.1 - - [19/Jun/2014:08:05:42 +0900] "GET /index10973.html HTTP/1.1" 200 14 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

access_log(reloadで生成された新ファイル)
127.0.0.1 - - [19/Jun/2014:08:05:42 +0900] "GET /index10974.html HTTP/1.1" 200 14 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
127.0.0.1 - - [19/Jun/2014:08:05:42 +0900] "GET /index10975.html HTTP/1.1" 200 14 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"


当然の結果だけど、安心した。