web-dev-qa-db-ja.com

Windowsログファイルへの例外の書き込み

例外をキャッチして、Windowsログファイルに記録します。 Windowsログを開いて書き込む方法を教えてください。

35
Gold

System.Diagnostics.EventLog.WriteEntry 関数を使用して、イベントログにエントリを書き込むことができます。

System.Diagnostics.EventLog.WriteEntry("MyEventSource", exception.StackTrace,                  
                                       System.Diagnostics.EventLogEntryType.Warning);

イベントログを読み取るには、 System.Diagnostics.EventLog.GetEventLogs 関数を使用できます。

//here's how you get the event logs
var eventLogs = System.Diagnostics.EventLog.GetEventLogs();

foreach(var eventLog in eventLogs)
{    
    //here's how you get the event log entries
    foreach(var logEntry in eventLog.Entries)
    {
        //do something with the entry
    }    
}
36
Doctor Jones

Enterprise Library の使用も検討できます。初めは複雑に見えますが、1〜2時間のプレイで成果が得られます。構成はapp.configに保存されるため、再コンパイルせずに変更できます。これは、異なる構成のテストサーバーとライブサーバーに同じコードを配置している場合に非常に便利です。コードをロードしなくても多くのことができます。

良い点の1つは、例外が自動的にログに記録されるように例外ポリシーを定義できることです。ここにあなたが使用するかもしれないいくつかのコードがあります(私はEntLib 4.1を使用しています):

    try
    {
        //This would be where your exception might be thrown.  I'm doing it on
        //purpose so you can see it work
        throw new ArgumentNullException("param1");
    }
    catch (Exception ex)
    {
        if (ExceptionPolicy.HandleException(ex, "ExPol1")) throw;
    }

キャッチブロックの行は、ExPol1で定義されている場合に例外を再スローします。 ExPol1が再スロー用に構成されている場合、ExceptionPolicy.HandleExceptionはtrueを返します。そうでない場合は、falseを返します。

残りは構成で定義します。 XMLはかなり恐ろしいように見えますが(常にそうであるとは限りません)、エンタープライズライブラリ構成エディターを使用して作成します。完全を期すために提供しています。

LoggingConfigurationセクションで、このファイルは

  • ログ:ローリングテキストログファイル(組み込みのWindowsイベントログ、SQLテーブル、電子メール、msmqなどを使用できます)。
  • ログへのパラメーターの書き込み方法を制御するテキストフォーマッター(1行にすべてを書き込むように構成することもあれば、複数行に分散することもあります)。
  • 単一のカテゴリ「一般」
  • config/entlibのエラーをトラップし、それらも報告する特別なソース。これを行うことを強くお勧めします。

ExceptionHandlingセクションでは、

  • 単一のポリシー:「ExPo1」。これは、タイプArgumentNullExceptionsを処理し、NoneのpostHandlingActionを指定します(つまり、再スローしないでください)。
  • generalカテゴリー(上記で定義)にログを記録するハンドラー

この例では行いませんが、ポリシーを使用して例外を別のタイプに置き換えることもできます。

   <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </configSections>
      <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
        defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
        <listeners>
          <add fileName="rolling.log" footer="" formatter="Text Formatter"
            header="" rollFileExistsBehavior="Overwrite" rollInterval="None"
            rollSizeKB="500" timeStampPattern="yyyy-MM-dd" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            name="Rolling Flat File Trace Listener" />
        </listeners>
        <formatters>
          <add template="Timestamp: {timestamp}; Message: {message}; Category: {category}; Priority: {priority}; EventId: {eventid}; Severity: {severity}; Title:{title}; Machine: {machine}; Application Domain: {appDomain}; Process Id: {processId}; Process Name: {processName}; Win32 Thread Id: {win32ThreadId}; Thread Name: {threadName}; &#xD;&#xA;     Extended Properties: {dictionary({key} - {value})}"
            type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            name="Text Formatter" />
        </formatters>
        <categorySources>
          <add switchValue="All" name="General">
            <listeners>
              <add name="Rolling Flat File Trace Listener" />
            </listeners>
          </add>
        </categorySources>
        <specialSources>
          <allEvents switchValue="All" name="All Events" />
          <notProcessed switchValue="All" name="Unprocessed Category" />
          <errors switchValue="All" name="Logging Errors &amp; Warnings">
            <listeners>
              <add name="Rolling Flat File Trace Listener" />
            </listeners>
          </errors>
        </specialSources>
      </loggingConfiguration>
      <exceptionHandling>
        <exceptionPolicies>
          <add name="ExPol1">
            <exceptionTypes>
              <add type="System.ArgumentNullException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                postHandlingAction="None" name="ArgumentNullException">
                <exceptionHandlers>
                  <add logCategory="General" eventId="100" severity="Error" title="Enterprise Library Exception Handling"
                    formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                    priority="0" useDefaultLogger="false" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                    name="Logging Handler" />
                </exceptionHandlers>
              </add>
            </exceptionTypes>
          </add>
        </exceptionPolicies>
      </exceptionHandling>
    </configuration>
10
serialhobbyist

イベントログへの書き込みに関する簡単な答えを次に示します。 http://support.Microsoft.com/kb/307024

より良い答えは、 log4net のようなものを使用することです。

6
Jon Galloway

Windowsはイベントログを使用してアクティビティを追跡します。 System.Diagnostics.Trace クラス:

var traceSwitch = new TraceSwitch("MySwitch", "");
var exception = new Exception("Exception message");

if (traceSwitch.TraceError)
{
    Trace.TraceError(exception);
}

また、app.configを使用して、ロガーに書き込み場所を指示できます。

<system.diagnostics>
    <switches>
        <add name="MySwitch" value="Verbose" />
    </switches>
    <trace autoflush="true">
        <listeners>
            <add name="EventLogger"
                 type="System.Diagnostics.EventLogTraceListener"
                 initializeData="NameOfYourApplication" />
        </listeners>
    </trace>
 </system.diagnostics>
6
Darin Dimitrov

これらの記事では、発生する可能性のある例外を自動的に記録する方法を説明しています。

VB.NET: http://visualbasic.about.com/od/usingvbnet/a/logging.htm

C#: プロジェクトをC#に変換するときにApplicationEvents.vbの関数を書き込む場所

0
CrazyTim