C#でWindowsイベントログにデータを記録する方法

Windowsオペレーティングシステムは、問題が発生するたびにデータをWindowsイベントログに記録します。このデータは、Windowsイベントビューアツールを使用して表示できます。この記事では、C#でWindowsイベントログをプログラムで操作する方法について説明します。

この記事で提供されているコード例を使用するには、システムにVisual Studio2019がインストールされている必要があります。まだコピーをお持ちでない場合は、こちらからVisual Studio2019をダウンロードできます。

VisualStudioで.NETCoreコンソールアプリケーションプロジェクトを作成します

まず、VisualStudioで.NETCoreコンソールアプリケーションプロジェクトを作成しましょう。Visual Studio 2019がシステムにインストールされていると仮定して、以下に概説する手順に従って、VisualStudioで新しい.NETCoreコンソールアプリケーションプロジェクトを作成します。

  1. Visual StudioIDEを起動します。
  2. 「新しいプロジェクトの作成」をクリックします。
  3. 「新規プロジェクトの作成」ウィンドウで、表示されたテンプレートのリストから「コンソールアプリ(.NETCore)」を選択します。
  4. [次へ]をクリックします。
  5. 次に表示される[新しいプロジェクトの構成]ウィンドウで、新しいプロジェクトの名前と場所を指定します。
  6. [作成]をクリックします。

これにより、Visual Studio2019で新しい.NETCoreコンソールアプリケーションプロジェクトが作成されます。このプロジェクトを使用して、この記事の後続のセクションでWindowsイベントログを操作します。

EventLogNuGetパッケージをインストールします

.NET CoreアプリケーションでWindowsイベントログを操作できるようにするには、NuGetからMicrosoft.Extensions.Logging.EventLogパッケージをインストールする必要があります。これは、Visual Studio 2019 IDE内のNuGetパッケージマネージャーを使用するか、NuGetパッケージマネージャーコンソールで次のコマンドを実行することによって実行できます。

インストールパッケージMicrosoft.Extensions.Logging.EventLog

C#でEventLogクラスのインスタンスを作成します

EventLogクラスのインスタンスを作成し、Windowsイベントログにエントリを書き込むには、次のコードを使用できます。

EventLog eventLog = new EventLog();

eventLog.Source = "MyEventLogTarget";

eventLog.WriteEntry( "これはテストメッセージです。"、EventLogEntryType.Information);

C#でEventLogインスタンスに書き込む

アプリケーションからこのEventLogインスタンスにデータを記録する場合は、次のコードを使用できます。

string message = "これはテストメッセージです。";

using(EventLog eventLog = new EventLog( "Application"))

{{

    eventLog.Source = "アプリケーション";

    eventLog.WriteEntry(メッセージ、EventLogEntryType.Information);

}

C#でEventLogインスタンスをクリアします

EventLogインスタンスをクリアするには、次のコードを使用できます。

EventLog eventLog = new EventLog();

eventLog.Source = "MyEventLogSource";

eventLog.Clear();

次のコードスニペットを使用して、イベントログを削除できます。

if(EventLog.Exists( "MyEventLogTarget"))

{{

   EventLog.Delete( "MyEventLogTarget");

}

C#でEventLogエントリを読み取る

以下のコードスニペットを使用して、すべてのログエントリを読み取ることができます。

EventLog eventLog = new EventLog();

eventLog.Log = "MyEventLogTarget";

foreach(eventLog.EntriesのEventLogEntryエントリ)

{{ 

   //ここにカスタムコードを記述します

}

NLogを使用して、ログデータをC#のEventLogに書き込みます

次に、NLog.WindowsEventLogパッケージを利用します。このパッケージを使用すると、.NET Core環境から作業しながら、NLogを使用してログデータをEventLogに送信できます。

NLog.WindowsEventLogは、EventLogへの接続とASP.NETCoreからのEventLogの操作の複雑さをカプセル化します。通常どおりにNLogメソッドを呼び出す必要があります。

NLogを使用してデータをEventLogに記録するため、次のパッケージをプロジェクトに追加します。

インストールパッケージNLog.WindowsEventLog

C#でロギングインターフェイスを作成します

次のインターフェイスを作成して、ログを情報、警告、デバッグ、またはエラーとして保存します。

パブリックインターフェイスILogManager

    {{

        void LogInformation(string message);

        void LogWarning(string message);

        void LogDebug(string message);

        void LogError(string message);

    }

C#でNLogManagerクラスを実装する

次に、ILogManagerインターフェイスを拡張し、その各メソッドを実装するNLogManagerという名前のクラスを作成します。

パブリッククラスNLogManager:ILogManager

    {{

        プライベート静的NLog.ILoggerロガー=

LogManager.GetCurrentClassLogger();

        public void LogDebug(string message)

        {{

            新しいNotImplementedException();をスローします。

        }

        public void LogError(string message)

        {{

            logger.Error(message);

        }

        public void LogInformation(string message)

        {{

            新しいNotImplementedException();をスローします。

        }

        public void LogWarning(string message)

        {{

            新しいNotImplementedException();をスローします。

        }

    }

C#でLogErrorメソッドを実装する

簡単にするために、この例ではLogErrorメソッドを使用し、NLogManagerクラスの他のメソッドは実装されないことに注意してください。NLogを使用してデータをEventLogに記録する方法を理解しましょう。以下に示すように、NLogManagerクラスのLogErrorメソッドを変更します。

public void LogError(string message)

    {{

        ロガーロガー= LogManager.GetLogger( "EventLogTarget");

        var logEventInfo = new LogEventInfo(LogLevel.Error、

        logger.Name、メッセージ);

        logger.Log(logEventInfo);

    }

EventLogTargetは、EventLogのログターゲットの名前にすぎないことに注意してください。これは、構成ファイルnlog.configで定義する必要があります。LogEventInfoクラスはログイベントです。つまり、ログイベントを表します。そのコンストラクターに、ログレベル、ロガーの名前、およびログに記録するメッセージを渡す必要があります。

C#でEventLogにデータを記録するようにNLogを構成します

データをEventLogに記録するようにプログラムでNLogを構成するには、次のコードを使用できます。

var config = new NLog.Config.LoggingConfiguration();

var logEventLog = new NLog.Targets.EventLogTarget( "EventLogTarget");

config.AddRule(NLog.LogLevel.Info、NLog.LogLevel.Error、logEventLog);

NLog.LogManager.Configuration = config;

C#での完全なNLogManagerの例

NLogManagerクラスの完全なソースコードを参照用に以下に示します。

パブリッククラスNLogManager:ILogManager

    {{

        プライベート静的NLog.ILoggerロガー=

LogManager.GetCurrentClassLogger();

        public void LogDebug(string message)

        {{

            logger.Debug(message);

        }

public void LogError(string message)

        {{

ロガーロガー= LogManager.GetLogger( "EventLogTarget");

var logEventInfo = new LogEventInfo(LogLevel.Error、

logger.Name、メッセージ);

logger.Log(logEventInfo);

        }

        public void LogInformation(string message)

        {{

            logger.Info(メッセージ);

        }

        public void LogWarning(string message)

        {{

            logger.Warn(メッセージ);

        }

    }

コントローラでNLogManagerインスタンスを活用するには、以下に示すコードスニペットに示すように、ConfigureServicesメソッドにそのインスタンスを追加する必要があります。

services.AddSingleton();

Windowsイベントビューアを起動すると、下のスクリーンショットに示すように、そこに記録されたエラーメッセージが表示されます。

Windowsイベントログは通常、システムイベント、ネットワークトラフィック、およびセキュリティやパフォーマンスなどの関連データを記録するために使用されます。Windowsイベントログをログターゲットとして利用して、アプリケーションのデータを保存できます。アプリケーションがWindowsでのみ実行される場合、Windowsイベントログは、アプリケーションのイベントログデータを保存するための優れたオプションです。

C#でさらに多くのことを行う方法:

  • C#でArrayPoolとMemoryPoolを使用する方法
  • C#でBufferクラスを使用する方法
  • C#でHashSetを使用する方法
  • C#で名前付きパラメーターとオプションのパラメーターを使用する方法
  • BenchmarkDotNetを使用してC#コードをベンチマークする方法
  • C#で流暢なインターフェイスとメソッドチェーンを使用する方法
  • C#で静的メソッドを単体テストする方法
  • C#で神オブジェクトをリファクタリングする方法
  • C#でValueTaskを使用する方法
  • Cで不変性を使用する方法
  • C#でconst、readonly、staticを使用する方法
  • C#でデータ注釈を使用する方法
  • C#8でGUIDを操作する方法
  • C#で抽象クラスとインターフェイスを使用する場合
  • C#でAutoMapperを操作する方法
  • C#でラムダ式を使用する方法
  • C#でAction、Func、およびPredicateデリゲートを操作する方法
  • C#でデリゲートを操作する方法
  • C#で簡単なロガーを実装する方法
  • C#で属性を操作する方法
  • C#でlog4netを操作する方法
  • C#でリポジトリデザインパターンを実装する方法
  • C#でリフレクションを操作する方法
  • C#でfilesystemwatcherを操作する方法
  • C#でレイジー初期化を実行する方法
  • C#でMSMQを操作する方法
  • C#で拡張メソッドを操作する方法
  • C#でラムダ式を使用する方法
  • C#でvolatileキーワードを使用する場合
  • C#でyieldキーワードを使用する方法
  • C#でポリモーフィズムを実装する方法
  • C#で独自のタスクスケジューラを構築する方法
  • C#でRabbitMQを操作する方法
  • C#でタプルを操作する方法
  • C#での仮想メソッドと抽象メソッドの調査
  • C#でDapperORMを使用する方法
  • C#でフライウェイトデザインパターンを使用する方法