3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Python から Windows のイベントログに記録する

Last updated at Posted at 2022-12-08

前に調査したけど結局使わなかったネタの供養。

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」を確認すると、出力されていることがわかる。

image.png

(本当は「詳細」タブだけでなく「全般」タブのメッセージ欄にも出力したいのだが、Python から実現する方法が不明)

エラーが出る場合

イベントビューアーを見ると以下のようなエラーログが出ることがある。

ソース "test_app" からのイベント ID 0 の説明が見つかりません。このイベントを発生させるコンポーネントがローカル コンピューターにインストールされていないか、インストールが壊れています。ローカル コンピューターにコンポーネントをインストールするか、コンポーネントを修復してください。

イベントソースはあらかじめレジストリに登録しておく必要があるらしく、PowerShell で以下のコマンドを実行して登録すればエラーログは出なくなる。

New-EventLog -LogName Application -Source test_app

参考

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?