web-dev-qa-db-ja.com

Nginxログを適切にローテーションする方法

私はnginxログのローテーションを達成したいと思います:

  1. 追加のソフトウェアがなくても機能します(つまり、「logrotate」がない場合に最適です)
  2. 日付に基づいた名前でローテーションされたファイルを作成します

最善の方法は、PostgreSQLのようなものです。つまり、log_filename構成変数でstrftime-style%Y-%m-%dを指定できます。これにより、ログオン日(または時刻)の変更が自動的に変更されます。

Apacheからの別のアプローチ-パイプを介してログをrotatelogsプログラムに送信します。

私が検索できた限り、そのようなアプローチは存在しません。私にできることは、daterotオプションでlogrotateを使用することだけですが、独自の欠点があり、PostgreSQLの| rotatelogsまたはlog_filenameのように機能するものを使用したいと思います。

12
user13185

謙虚な名前付きパイプが味方であるか敵であるかについて世界は分かれていますが、それはおそらく問題に対する最も簡単な解決策です。 (事前にパイプを作成する必要があるという点で)いくつかの欠点がありますが、cronの必要がなくなり、選択したロギングパイプフィルターを使用できるようになります。

access.logでcronologを使用する例を次に示します。

  1. 名前付きパイプのパスを選択します。ログを/var/log/nginxに保持するつもりなので、パイプもそこに配置します。名前はあなた次第です。私は.fifoを追加します。これはaccess.logなので、私は/var/log/nginx/access.log.fifoにいます。
  2. ファイルが存在する場合は削除します。
  3. ログファイルの名前付きパイプを作成します。

    mkfifo /var/log/nginx/access.log.fifo
    
  4. 作成したパイプでログをポイントするようにnginx.confを構成します。

    access_log /var/log/nginx/access.log.fifo;
    
  5. 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を処理するため、代わりにそれを使用する必要があります。コマンドをスクリプトでラップし、--execstart-stop-daemonからinit.d/nginxとして渡すだけです。

7
dsc

これは、単純な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ログファイルの回転

1
John Collins

ログ行がプログラムによって表示される現在のシステム時間ではなく、ログに記録された日付に基づいて一般的なログを分割する単純なプログラム、datelogを作成しました。これは、cronologや別のログスプリッターが既に行っていることとまったく同じである場合とそうでない場合がありますが、他のユーザーが何をしているかを調べるよりも、自分で作成する方が迅速でした。

ログに記録されたリクエストで年と月を使用して、ログされたデータから計算されたYYYYMMを含むファイルまたはパイプに行が書き込まれます。はい、これは一般的なログ形式に多少特有です。最初の[は日付を区切るものと見なされます。 IPv6アドレスに注意してください。 :)

ログ分析の場合、各ログには実際にはそれぞれの月のリクエストのみが含まれていることが重要です。正しい分析結果を得るためには、理想的には各ログが完全である必要があります。ログスプリッター内の現在の時刻に基づいてファイル名を決定するだけでは不十分です。23:59:59から始まる遅い要求は、間違った月のログファイルに記録されるためです。

これは、nginxが起動する前に存在することが確認されている名前付きのfifoを介してnginxで使用します。エラー検出とバッファ出力の間にはプログラムのトレードオフがあることに注意してください。現在、パフォーマンス上の理由から、datelogはバッファ出力を優先しています。ログデータを失わないように、特にシェルパイプを使用する場合は、設定が実際に機能することを確認してください。 。

ソースコード: http://stuge.se/datelog.c

フィードバックや、もちろんパッチを送ってください!

1
stuge

私は本当にあなたの質問を理解していません。nginxは組み込みのログローテーションをサポートしていないため、次のようなものを使用する必要があります

mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)

/etc/cron.daily(もちろん、上記のファイル名をフルパス名で修飾する必要があります)のどこかに配置するか、Apache2ユーティリティをインストールして、rotatelogにアクセスします。

0
Stefan Förster