Подтвердить что ты не робот

Запись исключений из файла журнала Windows

Я хотел бы воспользоваться моими исключениями и зарегистрировать их в файле журнала Windows. Как мне открыть и записать в журнал Windows?

4b9b3361

Ответ 1

Вы можете использовать функцию System.Diagnostics.EventLog.WriteEntry для записи записей в журнал событий.

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

Для чтения журналов событий вы можете использовать функцию System.Diagnostics.EventLog.GetEventLogs.

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

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

Ответ 2

Вы также можете рассмотреть возможность использования Enterprise Library. Сложно начинать, но час или два игры окупится. Config хранится в app.config, поэтому вы можете изменить его без перекомпиляции - это может быть очень удобно, если у вас есть тот же код, который находится на тестовых и живых серверах с другой конфигурацией. Вы можете делать довольно много без загрузки кода.

Хорошо, что вы можете определить политики исключения, чтобы исключения автоматически регистрировались. Вот какой код вы можете использовать (я использую 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;
    }

Строка в блоке catch будет отменять исключение, если EXPol1 определяет его. Если ExPol1 настроен для повторного броска, ExceptionPolicy.HandleException вернет true. Если нет, он возвращает false.

Вы определяете остальные в config. XML выглядит довольно ужасно (не всегда), но вы создаете его с помощью редактора конфигурации корпоративной библиотеки. Я просто поставляю его для полноты.

В разделе loggingConfiguration этот файл определяет

  • журнал: скользящий текстовый файл журнала (вы можете использовать встроенные журналы событий Windows, таблицы sql, email, msmq и другие),
  • текстовый форматировщик, который определяет, как параметры записываются в журнал (иногда я настраиваю это, чтобы писать все в одну строку, другие раз распространялись на многие),
  • одна категория "Общие"
  • Специальный источник, который задерживает любые ошибки в config/entlib и сообщает о них. Я настоятельно рекомендую вам сделать это.

В разделе exceptionHandling он определяет

  • единая политика: "ExPo1", которая обрабатывает тип ArgumentNullExceptions и указывает postHandlingAction из None (т.е. не ревертировать).
  • обработчик, который входит в общую категорию (определенную выше)

Я не делаю этого в этом примере, но вы также можете заменить исключение другим типом, используя политику.

   <?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>

Ответ 3

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>

Ответ 4

Вот простой ответ на запись в журнал событий: http://support.microsoft.com/kb/307024

Лучший ответ - использовать что-то вроде log4net, которое будет обрабатывать это для вас.