c# - entlib 无效的 TraceListenerData 类型

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

我为 Enterprise Library 5 Logging Block 创建了一个自定义监听器,配置编辑器可以识别它,但会抛出运行时配置异常:

尝试使用自定义记录器

    static IUnityContainer _container;
    static LogWriter _writer;
    static IServiceLocator _locator;

    public static void Inf(string message)
    {
        if (_container == null)
        {
            // Create the container
            _container = new UnityContainer();
            // Configurator will read Enterprise Library configuration
            // and set up the container
            var configurator = new UnityContainerConfigurator(_container);
            // Configuration source holds the new configuration we want to use
            // load this in your own code
            IConfigurationSource configSource = new SystemConfigurationSource(true);
            // Configure the container
            EnterpriseLibraryContainer.ConfigureContainer(configurator, configSource);
            // Wrap in ServiceLocator
            _locator = new UnityServiceLocator(_container);
        }
        if (_writer == null)
        {
            _writer = _locator.GetInstance<LogWriter>();
        }
        if (_writer != null && _container != null)
        {
            LogEntry log = new LogEntry();
            log.Message = message;
            log.Categories.Add("Information");
            log.Severity = TraceEventType.Information;
            _writer.Write(log);
        }
    }

dll中自带TraceListener

using System.Diagnostics;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;

namespace CustomLogger
{
    [ConfigurationElementType(typeof(LoggerCustomData))]
    public class LoggerCustom : TraceListener //CustomTraceListener
    {
        readonly ILogFormatter _formatter;

        public LoggerCustom()
            : this(string.Empty, null)
        {
        }

        public LoggerCustom(string name)
            : this(name, null)
        {
        }

        public LoggerCustom(string name, ILogFormatter formatter)
            : base(name)
        {
            this._formatter = formatter;
        }

        public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
        {
            if ((Filter == null) || Filter.ShouldTrace(eventCache, source, eventType, id, null, null, data, null))
            {
                if (data is LogEntry)
                {
                    if (_formatter != null)
                    {
                        WriteLine(_formatter.Format(data as LogEntry));
                    } else
                    {
                        base.TraceData(eventCache, source, eventType, id, data);
                    }
                } else
                {
                    base.TraceData(eventCache, source, eventType, id, data);
                }
            }
        }

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

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

dll 中的自定义 TraceListenerData

using System;
using System.Configuration;
using System.Diagnostics;
using System.Linq.Expressions;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ContainerModel;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Design;
using Microsoft.Practices.EnterpriseLibrary.Common.Properties;
using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;

namespace CustomLogger
{
    [ResourceDisplayName(typeof(Resources), "CustomLoggerDataDisplayName")]
    [ResourceDescription(typeof(Resources), "CustomLoggerDataDescription")]
    public class LoggerCustomData : TraceListenerData
    {
        private const string FormatterNameProperty = "formatter";

        public LoggerCustomData()
            : this("unnamed", null, TraceOptions.None)
        {
        }

        public LoggerCustomData(string name)
            : this(name, null, TraceOptions.None)
        {
        }

        public LoggerCustomData(string name, string formatterName)
            : this(name, formatterName, TraceOptions.None)
        {
        }

        protected LoggerCustomData(string name, string formatterName, TraceOptions traceOutputOptions)
            : base(name, typeof(LoggerCustom), traceOutputOptions, SourceLevels.All)
        {
            ListenerDataType = typeof(LoggerCustomData);
            Formatter = formatterName;
        }

        [ConfigurationProperty(FormatterNameProperty, IsRequired = false),
        Reference(typeof(NameTypeConfigurationElementCollection<FormatterData, CustomFormatterData>), typeof(FormatterData)),
        ResourceDisplayName(typeof(Resources), "CustomLoggerDataFormatterDisplayName"),
        ResourceDescription(typeof(Resources), "CustomLoggerDataFormatterDescription")]
        public string Formatter
        {
            get { return (string)base[FormatterNameProperty]; }
            set { base[FormatterNameProperty] = value; }
        }

        protected override Expression<Func<TraceListener>> GetCreationExpression()
        {
            return () =>
                new LoggerCustom(Name,
                    Container.ResolvedIfNotNull<ILogFormatter>(Formatter));
        }
    }
}

ConfEditor生成的app.config添加

  <add name="CustomLoggerDataDisplayName" type="CustomLogger.LoggerCustom, CustomLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
    listenerDataType="CustomLogger.LoggerCustomData, CustomLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
    traceOutputOptions="None" filter="All" formatter="Text Formatter Plain" />

.ConfigureContainer(configurator, configSource) 异常

配置 'listenerDataType="CustomLogger.LoggerCustomData, CustomLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"' 中的 TraceListenerData 类型无效。

为什么不起作用? :( :(

附注这篇文章是 entlib CustomTraceListener unresolved 的演变

最佳答案

在我的例子中,defaultCategory="Important"我已经在配置第一行中更改为 defaultCategory="",然后工作正常。

关于c# - entlib 无效的 TraceListenerData 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7282671/

相关文章:

c# - 有没有办法在 linq 查询中参数化方法?

c# - 如何在 LINQ 中执行嵌套的加入、添加和分组?

java - 如何打印 logback 内部错误和状态日志?

c# - ASP.NET 身份验证票过期问题

使用 cron-job 将 Python 输出到文本文件

Pythonlogging.getLogger 在 AWS Glue python shell 作业中不起作用

asp.net - 为什么不能在 Release模式下建立网站?

spring - 如何注册hibernate spring实体监听器

c# - 如果我移动 Migrations 文件夹,为什么 EF 6 会忽略应用的迁移?