Go で記述されているいくつかのログ ファイルを解析しようとしていますが、変更を確認しながらファイルを何度も読み直さずにこれを行う方法がわかりません。
EOF まで読み込んで、次の行が書き込まれるまで待って、再び EOF まで読み込めるようにしたいですtail -f
。
Go で記述されているいくつかのログ ファイルを解析しようとしていますが、変更を確認しながらファイルを何度も読み直さずにこれを行う方法がわかりません。
EOF まで読み込んで、次の行が書き込まれるまで待って、再び EOF まで読み込めるようにしたいですtail -f
。
これを正確に行うために、Goパッケージ(github.com/hpcloud/tail )を作成しました。
t, err := tail.TailFile("/var/log/nginx.log", tail.Config{Follow: true})
for line := range t.Lines {
fmt.Println(line.Text)
}
..。
kostixの答えを引用する:
実際には、ファイルは切り捨てられたり、置き換えられたり、名前が変更されたりする可能性があります(logrotateなどのツールが実行することになっているため)。
ファイルが切り捨てられた場合、そのファイルは自動的に再度開かれます。名前が変更されたファイルの再オープンをサポートするために(ログローテーションなどのため)、Config.ReOpenを設定できます。
t, err := tail.TailFile("/var/log/nginx.log", tail.Config{
Follow: true,
ReOpen: true})
for line := range t.Lines {
fmt.Println(line.Text)
}
Config.ReOpen
tail -F
(大文字のF)に類似しています:
-F The -F option implies the -f option, but tail will also check to see if the file being followed has been
renamed or rotated. The file is closed and reopened when tail detects that the filename being read from
has a new inode number. The -F option is ignored if reading from standard input rather than a file.
ファイルの変更を監視する (OS 固有のサブシステムを使用してこれを行う) か、定期的にポーリングして変更時間 (およびサイズ) が変更されたかどうかを確認する必要があります。いずれの場合も、データの別のチャンクを読み取った後、ファイル オフセットを記憶し、変更を検出した後に別のチャンクを読み取る前にそれを復元します。
ただし、これは紙の上でのみ簡単に見えることに注意してください。実際には、ファイルが切り捨てられたり、置き換えられたり、名前が変更されたりする可能性があります (これは、ツールのようなものlogrotate
で行う必要があるためです)。
この問題の詳細については、この質問を参照してください。
私もこれを行うことに興味がありますが、(まだ) 取り組む時間がありませんでした。私が思いついたアプローチの 1 つは、「尾」に力仕事を任せることです。ツールをプラットフォーム固有にする可能性がありますが、それで問題ない場合があります。基本的な考え方は、「os/exec」パッケージのCmdを使用してファイルを追跡することです。「tail --retry --follow=name prog.log」と同等のプロセスをフォークし、Cmd オブジェクトの Stdout リーダーを使用してその Stdout をリッスンできます。
単なるスケッチで申し訳ありませんが、参考になるかもしれません。