質問

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

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

私はつまずきました これ これは、このようなクエリでnumberofrecords列を使用するように教えてくれます

Select NumberOfRecords from Win32_NTEventLogFile Where LogFileName = 'Application'

そして、それから最高のログとして返品値を使用します。

私の質問は、Windowsイベントログが円形のバッファーであると聞いたことがあります。つまり、ログがいっぱいになると、新しいログが最古のログであることです。これはnumberofRecordsに影響を与えますか?それが起こるかのように、イベントの「RecordNumber」プロパティは増加し続けますが、イベントログの実際のレコード数は変更されません(書かれたエントリごとに、1つはドロップされます)。

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

アップデート

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

これはWinapiによって可能ですが、Linuxからリモートで電話をかけています。シナリオでこれをどのように達成できるか知っている人はいますか?

ありがとう

役に立ちましたか?

解決

Logが円形でログをクリアでき、1つのエントリがあるかもしれないが、レコード番号は1000であるため、numberofRecordsは常に最大レコード番号とは限りません。

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

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

他のヒント

最新のレコードの記録的な数が必要ですが、それを取得するための迅速な方法はありません。一般的に、あなたは:

SELECT RecordNumber FROM Win32_NTLogEvent WHERE LogFile='Application'

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

だが!レコードの数を取得できます。

SELECT NumberOfRecords FROM Win32_NTEventlogFile WHERE LogfileName='Application'

これは非常に高速です。そして、選択を減らして、最新のレコードの検索をスピードアップします。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top