追記
- 調べれば調べるほどlogrotateを使うほかない感じだった。
- ngx_http_log_merge_loc_conf とかそのあたりをいじればいいのだろうけどそこまでする?
前提1 環境
環境 | /etc/redhat-release | nginx | 補足 |
---|---|---|---|
Vagrant | CentOS Linux release 7.1.1503 (Core) | nginx-1.8.0-1.el7.ngx.x86_64 | https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box |
前提2 なんでしたのか
以下事由により、logrotateなしにaccess.log-YYYYMMDDを得たかった。
- Apache運用時に利用していたrotatelogsと同じ挙動を得たかった
- logrotateが個人的に嫌いだった
- Cronに頼りたくない
端的に言うとデフォルトのlogrotate設定ファイルが /etc/logrotate.d/nginx という形で /etc/nginx/から遠いところ(別文脈)で管理される のが気に食わない
参考URL
serverディレクティブに以下if文を追加
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
set $min $5;
}
access_log を以下のように記述
末尾のフォーマット指定は本旨でないのでこの場合無視してよい
なお数分のうちにテストしやすいように YYYY-mm-dd-HHMM としている
access_log /var/log/nginx/access.log-$year-$month-$day-$hour$min ltsv;
yum版nginxの場合、以下が必要だった
以下コマンドを発行しないとerror.logにエラーがでる1
指定のオーナ:グループの根拠は $ id nginx
の出力による
sudo chown nginx:nginx /var/log/nginx
nginx restart
sudo systemctl restart nginx.service
以下のように生成される
アクセスし続けることで1分ごとに新規ログファイルが作成されることがわかる
[root@localhost nginx]# ls -lha /var/log/nginx/
total 24K
drwxr-xr-x 2 nginx nginx 105 Oct 18 14:24 .
drwxr-xr-x. 8 root root 4.0K Oct 18 11:16 ..
-rw-r--r-- 1 root root 0 Oct 18 14:22 access.log
-rw-r--r-- 1 nginx nginx 5.5K Oct 18 14:23 access.log-2015-10-18-1423
-rw-r--r-- 1 nginx nginx 5.2K Oct 18 14:24 access.log-2015-10-18-1424
-rw-r--r-- 1 root root 2.2K Oct 18 14:23 error.log
注意点
- もしもこのまま運用しようという場合には、/etc/logrotate.d/nginx を処理してlogrotate対象外とすること
懸念点
- error_log に同様の指定をしても error.log-$year-$month-$day-$hour$min というまんまイカしたログファイル名になる
- error_log もYYYYMMDDしたかったらlogrotateするしかないのかこれ?
- 必ず access.log は生成される
- access.logとerror.logというファイル名は固定値なのかしら
-
2015/10/18 14:37:29 [crit] 19178#0: *1 open() "/var/log/nginx/access.log-2015-10-18-1437" failed (13: Permission denied) while logging request, client: 192.168.1.11, server: example.com, request: "GET / HTTP/1.1", host: "192.168.1.123" ↩