Вопрос по configuration, .net, trace-listener, exception-handling, trace – Как определить пользовательский TraceListener в app.config

63

Я реализовал пользовательский слушатель трассировки (полученный изTextWriteTraceListener) и теперь я хотел бы настроить свое приложение, чтобы использовать его вместо стандартногоTextWriteTraceListener.

Сначала я добавил по умолчаниюTextWriteTraceListener для того, чтобы убедиться, что он работает нормально, и он работает. Вот мой app.config:

<configuration>
    <system.diagnostics>
        <trace autoflush="true" indentsize="4">
            <listeners>
                <add name="TextListener"  type="System.Diagnostics.TextWriterTraceListener" initializeData="trace.log" />
            <remove name="Default" />
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>

Теперь мой слушатель трассировки определен вMyApp.Utils пространство имен, и оно называетсяFormattedTextWriterTraceListener, Поэтому я изменил тип в конфиге выше, чтобыMyApp.Utils.FormattedTextWriterTraceListener и в настоящее время это выглядит так:

<configuration>
    <system.diagnostics>
        <trace autoflush="true" indentsize="4">
            <listeners>
                <add name="MyTextListener" type="MyApp.Utils.FormattedTextWriterTraceListener" initializeData="trace.log" />
            <remove name="Default" />
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>

Однако теперь, когда я пытаюсь записать что-то, я получаюConfigurationErrorsException с сообщением:

Couldn't find type for class MyApp.Utils.FormattedTextWriterTraceListener.

Кто-нибудь знает, как я могу настроить этот пользовательский прослушиватель в конфигурации и если это вообще возможно?

Ваш Ответ

2   ответа
4

и на всякий случай это кому-нибудь поможет ...

Я знал, что мой тип существует, поэтому я написал следующее:

Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof("yourclassname"));
Type myClassType = assembly.GetType("yournamespace.yourclassname");

В моем случае myClassType.AssemblyQualifiedName содержал нужную мне строку в файле app.config в атрибуте type.

Например:

enter image description here

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information,ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="CircularTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="CircularTraceListener" type="Microsoft.Samples.ServiceModel.CircularTraceListener, CircularTraceListener, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
           initializeData="C:\MyWebService\APILog\CircularTracing-service.svclog" maxFileSizeKB="1000" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>
79

<configuration>
    <system.diagnostics>
        <trace autoflush="true" indentsize="4">
            <listeners>
                <add name="TextListener" 
                    type="MyApp.Utils.FormattedTextWriterTraceListener, MyApp"
                    initializeData="trace.log" />
            <remove name="Default" />
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>
Я отредактировал пост, попробуй так уточнить
Название сборкиMyApp и я добавил это, чтобы ввести аргумент RaYell
Для меня это было то, что я забыл переопределить несколько базовых конструкторов. Имейте в виду, что в intellisense 4 из базовых конструкторов отображаются - есть еще два, когда вы нажимаете стрелки вниз, которые можно легко пропустить.
Это дает другое сообщение (тот же тип исключения) `Не удалось создать MyApp.Utils.FormattedTextWriterTraceListener, MyApp. RaYell
теперь он находит тип, но не может создать экземпляр, может быть, есть исключение в конструкторе или других вызываемых методах, попробуйте установить точку останова в конструкторе и отладить

Похожие вопросы