私はnginxログのローテーションを達成したいと思います:
最善の方法は、PostgreSQLのようなものです。つまり、log_filename構成変数でstrftime-style%Y-%m-%dを指定できます。これにより、ログオン日(または時刻)の変更が自動的に変更されます。
Apacheからの別のアプローチ-パイプを介してログをrotatelogsプログラムに送信します。
私が検索できた限り、そのようなアプローチは存在しません。私にできることは、daterotオプションでlogrotateを使用することだけですが、独自の欠点があり、PostgreSQLの| rotatelogsまたはlog_filenameのように機能するものを使用したいと思います。
謙虚な名前付きパイプが味方であるか敵であるかについて世界は分かれていますが、それはおそらく問題に対する最も簡単な解決策です。 (事前にパイプを作成する必要があるという点で)いくつかの欠点がありますが、cronの必要がなくなり、選択したロギングパイプフィルターを使用できるようになります。
access.log
でcronologを使用する例を次に示します。
/var/log/nginx
に保持するつもりなので、パイプもそこに配置します。名前はあなた次第です。私は.fifo
を追加します。これはaccess.log
なので、私は/var/log/nginx/access.log.fifo
にいます。ログファイルの名前付きパイプを作成します。
mkfifo /var/log/nginx/access.log.fifo
作成したパイプでログをポイントするようにnginx.conf
を構成します。
access_log /var/log/nginx/access.log.fifo;
Init.dスクリプトを変更して、パイプをリッスンするログローテーターを起動しますbeforeサーバーを起動します。
LOGS="/var/log/nginx"
pkill -f "/usr/sbin/cronolog --symlink $LOGS/access.log"
( cat $LOGS/access.log.fifo | /usr/sbin/cronolog --symlink $LOGS/access.log "$LOGS/%Y/%m/%d/access.log" ) &
rotatelogs
を使用する場合は、cronolog
にも同様のコマンドラインを使用します。構文については、ドキュメントを参照してください。
ディストリビューションにstart-stop-daemon
がある場合、理論的にはプラットフォームに関する特別な知識があり、pkill
を処理するため、代わりにそれを使用する必要があります。コマンドをスクリプトでラップし、--exec
でstart-stop-daemon
からinit.d/nginx
として渡すだけです。
これは、単純なbashスクリプトとcronを使用して実現できます。
#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
mv /var/log/nginx/access.log /var/log/nginx/nginx.access.log.$DATE
mv /var/log/nginx/error.log /var/log/nginx/nginx_error.log.$DATE
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
gzip /var/log/nginx/access.log.$DATE
gzip /var/log/nginx/error.log.$DATE
Crontabなどの設定の詳細については、こちらをご覧ください: Cronを介したNginxログファイルの回転
ログ行がプログラムによって表示される現在のシステム時間ではなく、ログに記録された日付に基づいて一般的なログを分割する単純なプログラム、datelogを作成しました。これは、cronologや別のログスプリッターが既に行っていることとまったく同じである場合とそうでない場合がありますが、他のユーザーが何をしているかを調べるよりも、自分で作成する方が迅速でした。
ログに記録されたリクエストで年と月を使用して、ログされたデータから計算されたYYYYMMを含むファイルまたはパイプに行が書き込まれます。はい、これは一般的なログ形式に多少特有です。最初の[は日付を区切るものと見なされます。 IPv6アドレスに注意してください。 :)
ログ分析の場合、各ログには実際にはそれぞれの月のリクエストのみが含まれていることが重要です。正しい分析結果を得るためには、理想的には各ログが完全である必要があります。ログスプリッター内の現在の時刻に基づいてファイル名を決定するだけでは不十分です。23:59:59から始まる遅い要求は、間違った月のログファイルに記録されるためです。
これは、nginxが起動する前に存在することが確認されている名前付きのfifoを介してnginxで使用します。エラー検出とバッファ出力の間にはプログラムのトレードオフがあることに注意してください。現在、パフォーマンス上の理由から、datelogはバッファ出力を優先しています。ログデータを失わないように、特にシェルパイプを使用する場合は、設定が実際に機能することを確認してください。 。
ソースコード: http://stuge.se/datelog.c
フィードバックや、もちろんパッチを送ってください!
私は本当にあなたの質問を理解していません。nginxは組み込みのログローテーションをサポートしていないため、次のようなものを使用する必要があります
mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)
/etc/cron.daily(もちろん、上記のファイル名をフルパス名で修飾する必要があります)のどこかに配置するか、Apache2ユーティリティをインストールして、rotatelogにアクセスします。