entlib CustomTraceListener не решен - PullRequest
       41

entlib CustomTraceListener не решен

1 голос
/ 31 августа 2011

Я новичок в Enterprise Library (5, с дополнительным обновлением) и пытаюсь использовать мой собственный CustomTraceListener с блоком ведения журнала.

Ведение журнала работает с помощью входящего в комплект прослушивателя плоских файлов, но я не могу расширить его до моего пользовательского класса.

Журналы в FlatFileListener, но не в мой CustomListener:

    static UnityContainer _container;
    static LogWriter _writer;

    internal static void Inf(this string message)
    {
        if (_container == null)
        {
            _container = new UnityContainer();
            _container.AddNewExtension<EnterpriseLibraryCoreExtension>();
        }
        if (_writer == null && _container != null)
        {
            _writer = _container.Resolve<LogWriter>();
            LogEntry log = new LogEntry();
            log.Message = message;
            log.Categories.Add("Information");
            log.Severity = TraceEventType.Information;
            _writer.Write(log);
        }
    }

Мой CustomListener основан на Бычков :

namespace Test.Catch
{
    [ConfigurationElementType(typeof(CustomTraceListenerData))]
    public class LoggerCustom : CustomTraceListener
    {
        public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
        {
            if (data is LogEntry && this.Formatter != null)
            {
                this.WriteLine(this.Formatter.Format(data as LogEntry));
            } else
            {
                this.WriteLine(data.ToString());
            }
        }

        public override void Write(string message)
        {
            Trace.Write(message);
        }

        public override void WriteLine(string message)
        {
            Trace.WriteLine(message);
        }
    }
}

Сначала я попытался добавить customtracelistener с помощью редактора конфигурации, но редактор конфигурации не перечислил / не обнаружил никаких customtracelistener, которые, как я подозреваю, являются частью или всей проблемой?

Итак, вместо этого я добавил следующее, опять же, на основе bychkov :

app.config Руководство по добавлению слушателя

  <add listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.CustomTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  type="Test.Catch.LoggerCustom, Test.Catch" traceOutputOptions="None"
  name="Custom Trace Listener" initializeData="" formatter="Text Formatter Plain" />

Теперь, когда я вызываю Inf ("logme") с включенным выше дополнением app.config, в _container генерируется исключение .AddNewExtension (): Тип «Test.Catch.LoggerCustom, Test.Catch» не может быть разрешен.

Учитывая то, что я не понимаю основные механизмы, как я могу войти в систему с моим пользовательским слушателем?

  1. Нужно ли мне создавать собственные TraceListenerData, такие как решение Tavares ?

  2. Или мне нужно разобраться с UnityDefaultBehaviorExtension и связываться с ним, как описано в MacLeod ?

  3. Неверный существующий код?

  4. Или решение находится в другом месте?

Спасибо за ваш опыт.

1 Ответ

2 голосов
/ 31 августа 2011

Go grab Лаборатория расширяемости Entlib 5 .Есть целая глава по написанию пользовательских слушателей трассировки.Вы изучите базовые технологии, почему все работает так, как они работают, как они сочетаются друг с другом, и тогда вы сможете ответить на свои вопросы.

Что касается того, почему вышеприведенное не работаетпри использовании классов конфигурации CustomXXXData вашему провайдеру необходим конструктор, который принимает коллекцию NameValueCollection.У вас его нет, поэтому ваш код на самом деле неверен.Пройдите через лаборатории, вы узнаете это и многое другое.

...