2012-02-20 12 views
4

OKこれは簡単な質問のようですが、私はここから回答を見つけることができませんでしたので、誰かが同様の問題に遭遇したかもしれないことを祈って投稿しています。node.jsの(変更中の)ログファイルに従う方法

ウェブサーバーファイル(/var/log/lighttpd/error.log、具体的には、Linus G ThielI figured out how to follow symlinksのおかげで)を指すシンボリックリンクを監視する必要があります。私はそれを監視するためにfs.fileWatchを設定することができますが、私はまた、error.logファイルも、ログデーモンの設定が何であれ、特定の時刻に回転したことを指摘する必要があります。その場合、fs.fileWatchの動作が停止します。また、私は、子プロセスを生成し、ログのローテーションによって引き起こされる問題を回避するためにノードから

tail -F ./symlink_to_error.log 

を実行することができます知っているが、私はネイティブのノード機能を使用することを好みます。誰もがこれについていくつかの光を当てることができますか?

[EDIT]

実際に実際のログファイルを監視し、ログファイルを回転させてしまった場合でも、問題なく動作します。問題は実際にはシンボリックリンクによって引き起こされます。私がシンボリックリンクを監視している理由は、サイズが一定の限界に達すると実際のログファイル名が変更されるためです。 /var/log/lighttpd/error.logは一例として与えられたものです。私はログファイルの名前を変更する方法を制御することはできませんが、symlinkを更新する毎分symlinkを更新するcrontabがあります。

[EDIT 2012年2月28日]私はそれが非常に働くように私が働いているというログ監視プロジェクトで

tail -F ./symlink_to_error.log 

(産卵経由)は、以下の方法を使用しています実際に

watchFile()ほど効率的ではありませんが、信頼できるイベントです。

答えて

0

シンボリックリンクおよび/またはそのターゲットファイルを監視することに加えて、ターゲットログファイルと "change"イベントが含まれるディレクトリを監視して、ログファイルが別の名前に転記されているかどうかを確認します。新しいログウォッチャーが新しいログファイルに設定されている場合。

fs.watchFile(logDir, function(curr, prev) { 
    if (curr.nlink != prev.nlink) { 
    // The number of links in the directory has changed, now 
    // see if there is a new log file and start watching it. 
    } 
}); 
+0

回答ありがとうございました。しかし、動作していないようです。私はまたsymlinkをソフトから(私の質問で指摘しておくべきである)ハードに変更しようとしました(あなたの解決策ではハードリンクの数を比較しているからです)。私は2つのプランBについて考えている: 1)スケジュールされた間隔でsymlink上でfs.readlinkを呼び出し、そのコールバック内でrealfileを見る 2)ノードプロセスにユーザ信号(例えばSIGUSR1)トラップを設定し、シンボリックリンクが更新されると、シンボリックリンクが変更されたときにそのシグナルが発生します。ノードプロセスがそのシグナルを受け取ると、fs.readlinkを再度実行して変更を反映させます。 – ricochen

関連する問題