【问题标题】:entlib CustomTraceListener unresolvedentlib CustomTraceListener 未解决
【发布时间】:2011-11-07 18:22:38
【问题描述】:

我是 Enterprise Library 的新手(5,带有可选更新),并且正在尝试将我自己的 CustomTraceListener 与 Logging Block 一起使用。

日志记录与提供的平面文件侦听器一起工作,但我似乎无法将其扩展到我的自定义类。

记录到 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 基于bychkov:

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

  2. 或者我是否需要了解和混淆 UnityDefaultBehaviorExtension,如 MacLeod 所详述?

  3. 现有代码错了吗?

  4. 或者解决方案在别处?

感谢您的专业知识。

【问题讨论】:

    标签: c# logging dependency-injection enterprise-library


    【解决方案1】:

    去抢the Entlib 5 extensibility labs。有一整章是关于编写自定义跟踪侦听器的。您将了解底层技术、为什么事情会以它们的方式工作、它们如何组合在一起,然后您将能够回答自己的问题。

    至于为什么上述不起作用:当使用 CustomXXXData 配置类时,您的提供者需要一个带有 NameValueCollection 的构造函数。你没有,所以你的代码实际上是错误的。通过实验室工作,您将学到更多知识。

    【讨论】:

    • 回想起来,我建议也咨询Creating a Custom Provider,因为可扩展性实验室似乎不是针对最新的 entlib 版本编写的,例如我只有在扩展 TraceListener 而不是 CustomTraceListener (并添加 base:name 调用)时才能使扩展工作。不过,msdn 文章是针对异常块编写的,因此 this logging specific code 也可能有用。
    • 请注意,扩展实验室仍然非常有助于了解正在发生的事情!
    • 扩展性实验室是针对 entlib 5 编写的。我知道,我写了几个练习。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2021-02-06
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多