Go for it!

モーターサイクルと自転車とキャンプの日々。

python twistedでログの切り替え

とあるシステムの監視プログラムをpython + twistedで実装したのですが、ログローテーションではまりました…。

以下のような要件、前提条件があります。

  • ログローテーション時にtwistedプロセスを止めちゃダメ
  • なるべく既存プログラムに変更を加えない

でもって、ここ数日で試したこと。

  • logrotateでtwisted殺してローテーション
  • logrotateでcopytruncate使ってログクリア
  • FileLogObserverを使ってDailyLogFileを生成

■logrotateでtwisted殺してローテーション logrotateのprerotate, postrotateでtwisted殺す→ローテーション→twisted開始というのが堅実そう。こんなのを試した。

/some/where/log {
    weekly
    rotate 5
    missingok
    create
    compress
    delaycompress
    prerotate
        kill `cat /some/where/healthcheck.pid` &> /dev/null
    endscript        
    postrotate
        /some/where/healthcheck_start.sh &> /dev/null
    endscript
}

が、twistedは監視プロセスそのものなので、応答しないと周辺システムがフェイルオーバ動作を開始してしまう。

よって却下。

■logrotateでcopytruncate使ってログクリア logrotateのcopytruncateオプションって初めて知ったのだけど、カレントログをコピーして中身を消去する、という動作をする。

copytruncate Truncate the original log file in place after creating a copy, instead of moving the old log file and optionally creating a new one, It can be used when some program can not be told to close its logfile and thus might continue writing (appending) to the previous log file forever. Note that there is a very small time slice between copying the file and truncating it, so some logging data might be lost. When this option is used, the create option will have no effect, as the old log file stays in place.

これならいけるかも、と思い設定してみた。こんなの。

/some/where/log {
    weekly
    copytruncate
    rotate 5
    missingok
    compress
    delaycompress
}

実行してみると、一瞬0バイトになったあと、元の大きなサイズに戻る(消す前の状態に戻る)。なんだよこれ(笑)。

twistedがログファイルを掴みっぱなしになっていると考えてHUPシグナルを送るようにしたら、HUP送った瞬間にtwisted死んだ…。

追求する時間もないのでこれもダメ。

■FileLogObserverを使ってDailyLogFileを生成 twistedのDailyLogFileクラスを使ってログ出力をした。日付が変わるとログファイルが切り替わる動作を期待したのだが、システム時刻を変更しても切り替わらず。こちらも追求する時間が無いのでダメ。


ぐーぐる先生に「twisted」、「ログ」と伺ったところうる星やつらさんに辿り着いた。有用そうな情報があったので見てみるが、twisted本体のログ出力周りに手を突っ込まないとダメそう。

上手い方法が見つからなくてちょっと焦っているところですが、syslogに出力して逃げる方法を試験中です。

[ad#text_wide]