その時々

その時々で違うんです。特に決まっていないんです。

Pythonでイベントログ(イベント ビューア)を取得する

PythonWindowsのイベントログ(Applicationやシステムログ)を取得できないか調べていたところ、やり方がわかりましたのでメモしておきます。

win32拡張モジュールを使用します。

win32evtlogとwin32evtlogutilの2つ。

サンプルとしてはこんな感じです。

import win32evtlog

import win32evtlogutil

computer = "MyHost"

logType = "Application"

h = win32evtlog.OpenEventLog(computer, logType)

objects = win32evtlog.ReadEventLog(h, win32evtlog.EVENTLOG_BACKWARDS_READ|
win32evtlog.EVENTLOG_SEQUENTIAL_READ, 0)

while objects:

    for object in objects:

        msg = win32evtlogutil.SafeFormatMessage(object, logType).encode("mbcs")

        if (object.EventType==1):

            # エラーのみ表示

            print msg

        objects = win32evtlog.ReadEventLog(h, win32evtlog.EVENTLOG_BACKWARDS_READ|
win32evtlog.EVENTLOG_SEQUENTIAL_READ, 0)   

print '完了'
Python Win32拡張モジュールのマニュアルは以下のフォルダ内にあります。
C:\Python25\Lib\site-packages
PyWin32.chmというファイルです。

その中のヘルプにある
ReadEventLogの引数ですが、

[object,...] = ReadEventLog(handle, flags , offset )

handle  イベントログのハンドル
flags   取得フラグ
offset  読み取り操作を開始するログエントリのレコード番号

この中で分かりにくいのが取得フラグです。
次の2つを指定しなくてはいけません。
[読み取り方法]
EVENTLOG_SEEK_READ      offsetの位置から取得
EVENTLOG_SEQUENTIAL_READ 同じハンドルを指定した ReadEventLog 関数の
                    前回の呼び出しの続きから読み取り操作を行います。


[読み取り順]
EVENTLOG_FORWARDS_READ  日付の古い方から順
EVENTLOG_BACKWARDS_READ 日付の新しい方から順

ループさせ、同じハンドルを呼んでいくと順次取得していきます。

目次:Pythonメモ