Правильно используйте настройки ‹system.diagnostics› в файле конфигурации приложения

Недавно я создал службу Windows. Одна вещь, которую он добросовестно делает, - записывает все ошибки в журнал приложений. У меня есть следующий код, который делает это:

Dim appLog = New System.Diagnostics.EventLog With {.Source = "MyService"}
appLog.WriteEntry(message, EventLogEntryType.Error, transactionID)

В моем app.config также есть следующее:

<system.diagnostics>
    <sources>
      <source name="MyService" switchName="DefaultSwitch">
        <listeners>
          <!--<add name="FileLog"/>-->          
          <add name="EventLog"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="DefaultSwitch" value="Information" />
    </switches>
    <sharedListeners>
      <!--<add name="FileLog"
           type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
           initializeData="FileLogWriter"/>-->      
      <add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="MyService"/> 
    </sharedListeners>
  </system.diagnostics>

Я ожидал, что мой приведенный выше код должен работать даже без программной установки свойства Source EventLog, потому что я уже определил источник в файле конфигурации. Но если я удалю With {.Source = "MyService"}, то получу Exception, в котором говорится, что свойство Source должно быть установлено перед вызовом метода WriteEntry. Итак, какова цель содержимого XML конфигурации?


person Antony    schedule 15.10.2010    source источник


Ответы (1)


К счастью, я наткнулся на ответ, по крайней мере, частичный, работая над другим приложением. При использовании объекта My.Application.Log важны настройки в файле конфигурации. Например: My.Application.Log.WriteEntry(errMsg) будет записывать в файл или в средство просмотра событий в зависимости от настройки в app.config.

Таким образом, в этом случае класс EventLog не вызывается напрямую из кода. Это дает мне дополнительную гибкость для «горячей замены» формата журнала из средства просмотра событий в файл, например, без изменения какого-либо кода или перекомпиляции. Однако я заметил одну вещь: для свойства Name элемента <source> необходимо установить значение «DefaultSource». В противном случае события не регистрируются. Вероятно, есть способ изменить это, но я не видел в этом необходимости, поэтому не стал исследовать дальше. Надеюсь, это будет кому-нибудь полезно.

person Antony    schedule 03.11.2010