前に調査したけど結局使わなかったネタの供養。
Windows Server 上で Python スクリプトを定期実行する際のログを Windows イベントログとして書き出す方法について。
実装
※ pywin32
のインストールが必要
from win32evtlog import OpenEventLog, ReportEvent, EVENTLOG_INFORMATION_TYPE, EVENTLOG_WARNING_TYPE, EVENTLOG_ERROR_TYPE
class WindowsEventLogger:
def __init__(self, name: str):
self.handle = OpenEventLog(None, name)
def log(self, message: str, *, type: int, category=0, event_id=0, user_sid=None, raw_data=None):
return ReportEvent(self.handle, type, category, event_id, user_sid, [message], raw_data)
def info(self, message: str, **kwargs):
return self.log(message, type=EVENTLOG_INFORMATION_TYPE, **kwargs)
def warning(self, message: str, **kwargs):
return self.log(message, type=EVENTLOG_WARNING_TYPE, **kwargs)
def error(self, message: str, **kwargs):
return self.log(message, type=EVENTLOG_ERROR_TYPE, **kwargs)
使い方
from traceback import format_exc
logger = WindowsEventLogger("test_app")
try:
# ... 処理 ...
logger.info("success!")
except:
logger.error(format_exc())
イベントログの確認
イベントビューアーから「Windows ログ」>「Application」を確認すると、出力されていることがわかる。
(本当は「詳細」タブだけでなく「全般」タブのメッセージ欄にも出力したいのだが、Python から実現する方法が不明)
エラーが出る場合
イベントビューアーを見ると以下のようなエラーログが出ることがある。
ソース "test_app" からのイベント ID 0 の説明が見つかりません。このイベントを発生させるコンポーネントがローカル コンピューターにインストールされていないか、インストールが壊れています。ローカル コンピューターにコンポーネントをインストールするか、コンポーネントを修復してください。
イベントソースはあらかじめレジストリに登録しておく必要があるらしく、PowerShell で以下のコマンドを実行して登録すればエラーログは出なくなる。
New-EventLog -LogName Application -Source test_app