0

Log Unifier プログラムを作成しています。つまり、ログを生成するシステムがあります: my.log、my.log.1、my.log.2、my.log.3...

各反復で、特定のファイルから読み取った行数を保存して、次の反復でその場所から読み続けることができるようにします。

問題は、ファイルがいっぱいになると、ローリングすることです: 最後のログが削除されます... my.log.2 は my.log.3 になります my.log.1 は my.log.2 になります my.log は my.log になります.1 と新しい my.log が作成されます

もちろん、inode を使用してそれらを追跡することもできます。inode はファイルとほぼ 1 対 1 で対応しています。

私が「ほとんど」と言ったのは、次のシナリオを恐れているからです: 2 回の繰り返しの間に、いくつかのファイルが削除され (たとえば、ロギングが非常に高速であるとしましょう)、新しいファイルが作成され、いくつかのファイルの inode が削除されたばかりです。問題は、これらのファイルを古いファイルと間違えて、0 行ではなく (たとえば) 500 行目から読み取りを開始することです。

だから私はこれを解決する方法を見つけたいと思っています-ここに私が考えたいくつかの方向があります-あなたが私を助けるのを助けるかもしれません:

  1. i ノード以外の別の 1 対 1 対応。

  2. ファイルをマークする機能。chmod +x を使用してファイルを既存のファイルとしてマークすること、およびこれらのアクセス許可を持たない新しいファイルの場合-それらが新しいことはわかります-しかし、誰かが手動でアクセス許可を変更した場合、それは私のプログラムを混乱させるでしょう. 他にマークする方法があれば。

  3. ファイルが削除されたときに削除されるファイルへのソフトリンクを作成することを考えました。これにより、どのファイルが削除されたかを知ることができます。

  4. 「作成日」を取得する方法

  5. タイムスタンプ、atime、ctime、mtime を何らかの巧妙な方法で使用するなど、頭に浮かぶアイデアはすべて良いものです。どのファイルが新しいか、または 1 対 1 のファイルを作成するアイデアを知ることができる限り、ファイルへの対応。

ありがとうございました

4

1 に答える 1

1

いくつかの代替案を考えることができます:

  • POSIX 拡張属性を使用して、プログラムが操作に使用できる各ログ ファイルに関するメタデータを格納します。

  • my.log古いログ ファイルの内容は、アーカイブされた後、つまりmy.log.1. 各ファイルのハッシュ (例: SHA-256) を生成して、ファイルを一意に識別することができます。

  • すべての適切なログ形式では、各エントリにタイムスタンプが埋め込まれています。識別目的で、ファイル内の最初のエントリのタイムスタンプ (またはエントリ自体全体) を使用できます。通常、ログ ファイルは定期的にローリングされます。これにより、ファイルごとに異なる開始タイムスタンプが保証されます。

于 2012-08-24T18:02:39.770 に答える