2

Zenoss wmi-clientパッケージを介して、LinuxからWindowsログを収集するアプリケーションを作成しました。

WQLを使用してイベントログを照会し、戻り値を解析します。私の問題は、ログで最新のエントリを見つけようとしていることです。

私はこれに遭遇しました。これは、このようなクエリでNumberOfRecords列を使用するように指示します。

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

そして、そこからの戻り値を最高のログとして使用します。

私の質問は、Windowsイベントログは循環バッファであると聞いています。つまり、ログがいっぱいになると、最も古いログが新しいログで上書きされます。これはNumberOfRecordsに影響を与えますか?それが発生した場合、イベントの "RecordNumber"プロパティは増加し続けますが、イベントログの実際のレコード数は変更されません(書き込まれるすべてのエントリについて、1つが削除されます)。 )。

誰かがこれが実際にどのように機能するか(NumberOfRecordsが最大のRecordNumberであるか、ログ内のイベントの実際の数であるか)について洞察を投げかけ、おそらく解決策を提案できますか?

アップデート

したがって、イベントログはリングバッファであるため、NumberOfRecordsはそれ自体では機能しないことがわかりました。MSソリューションは、最も古いレコードを取得し、それをNumberOfRecordsに追加して、実際の最新のレコードを取得することです。

これはWinAPIを介して可能ですが、私はLinuxからリモートで呼び出しています。私のシナリオでこれをどのように達成できるか誰かが知っていますか?

ありがとう

4

2 に答える 2

1

NumberOfRecordsは、ログが循環していて、ログをクリアでき、エントリが1つある場合でも、レコード番号が1000であるため、常に最大レコード数になるとは限りません。

win apiを使用してこれを行う方法は、最も古いレコード番号を取得し、ログ内のレコード数を追加して最大レコード数を取得することです。Win32_NTEventLogFileに使用する最も古いレコード番号フィールドがあるようには見えません。

ログを照会するたびに最新のレコードを取得しようとしていますか?Win32_NTLogEventをクエリするときにTimeGeneratedを使用して、すべてを>NOWで取得できます。そのリストを繰り返して、最大レコード数を見つけることができます。

于 2010-10-07T13:34:30.607 に答える
0

最新のレコードのRecordNumberが必要ですが、それをすばやく取得する方法はありません。一般的に、次のことを行う必要があります。

SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application'

そして、結果から最大RecordNumberを見つけます。ただし、ログファイルのサイズが大きい場合、これには数十秒または数分かかることがあります...非常に遅いです。

だが!あなたはレコードの数を得ることができます:

SELECT NumberOfRecords FROM Win32_NTEventlogFile WHERE LogfileName='Application'

これは非常に高速です。次に、選択を減らして、最新のレコードの検索を高速化します。

SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application' AND RecordNumber>='_number_of_records_'

この<=の実行時間は一般的な場合よりも。

于 2014-12-23T13:51:16.113 に答える