获取LogWriter类型的实例时发生激活错误,密钥为""?

11

我有一个asp.net网站。我添加了对Microsoft.Practices.EnterpriseLibrary.Logging.dll的引用。

在web.config文件中,我定义如下。

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
  </configSections>
  <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
    <listeners>
      <add name="Rolling Flat File Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging"
        listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging"
        fileName="C:\Temp\RollingFlatFile.log" footer="----------------------------------------"
        formatter="Text Formatter" header="----------------------------------------"
        rollFileExistsBehavior="Increment" rollInterval="None" rollSizeKB="20"
        timeStampPattern="yyyy-MM-dd" maxArchivedFiles="3" traceOutputOptions="None"
        filter="All" />
      </listeners>
    <formatters>
      <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
        template="Timestamp: {timestamp(local)}{tab}Message: {message}{tab}Category: {category}{tab}Priority: {priority}{tab}EventId: {eventid}{tab}ActivityId: {property(ActivityId)}{tab}Severity: {severity}{tab}Title:{title}{tab}"
        name="Brief Format Text" />
      <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
        template="Timestamp: {timestamp}{tab}Message: {message}{tab}Category: {category}{tab}Priority: {priority}{tab}EventId: {eventid}{tab}Severity: {severity}{tab}Title: {title}{tab}Activity ID: {property(ActivityId)}{tab}Machine: {localMachine}{tab}App Domain: {localAppDomain}{tab}ProcessId: {localProcessId}{tab}Process Name: {localProcessName}{tab}Thread Name: {threadName}{tab}Win32 ThreadId:{win32ThreadId}{tab}Extended Properties: {dictionary({key} - {value}{tab})}"
        name="Text Formatter" />
    </formatters>
    <logFilters>
      <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.PriorityFilter, Microsoft.Practices.EnterpriseLibrary.Logging"
        minimumPriority="2" maximumPriority="99" name="Priority Filter" />
      <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.LogEnabledFilter, Microsoft.Practices.EnterpriseLibrary.Logging"
        enabled="true" name="LogEnabled Filter" />
      <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.CategoryFilter, Microsoft.Practices.EnterpriseLibrary.Logging"
        categoryFilterMode="AllowAllExceptDenied" name="Category Filter">
        <categoryFilters>
          <add name="BlockedByFilter" />
        </categoryFilters>
      </add>
    </logFilters>
    <categorySources>
      <add switchValue="All" name="Important">
        <listeners>
          <add name="Formatted EventLog TraceListener" />
          <add name="Rolling Flat File Trace Listener" />
        </listeners>
      </add>
    </categorySources>
    <specialSources>
      <allEvents switchValue="All" name="All Events" />
      <notProcessed switchValue="All" name="Unprocessed Category">
        <listeners>
          <add name="UnprocessedFlatFile" />
        </listeners>
      </notProcessed>
      <errors switchValue="All" name="Logging Errors &amp; Warnings">
        <listeners>
          <add name="Formatted EventLog TraceListener" />
        </listeners>
      </errors>
    </specialSources>
  </loggingConfiguration>
</configuration>

当我运行代码时,在下面的位置发生异常。

defaultWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
//Activation error occured while trying to get instance of type LogWriter, key ""

如何解决这个问题?


你在 web.config 中添加的是全部 Enterprise Library Logging 所需内容吗?你可能还需要引用以下程序集:Microsoft.Practices.Unity.dll、Microsoft.Practices.Unity.Interception.dll、Microsoft.Practices.ServiceLocation.dll 和 Microsoft.Practices.EnterpriseLibrary.Common.dll。 - MLF
@MLF:我已将它们全部添加为参考。 - James123
可能是重复的问题,与https://dev59.com/eXE85IYBdhLWcg3wMAfc相同。 - Michael Freidgeim
3个回答

13

您的完整配置引用了未定义的跟踪侦听器。这会导致Enterprise Library运行时在尝试解析这些引用时抛出运行时异常。

我已经注释掉了未使用的侦听器(并将默认类别更改为Important),现在它可以正常工作:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
    </configSections>
    <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
      defaultCategory="Important" logWarningsWhenNoCategoriesMatch="true">
        <listeners>
            <add name="Rolling Flat File Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging"
              listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging"
              fileName="C:\Temp\RollingFlatFile.log" footer="----------------------------------------"
              formatter="Text Formatter" header="----------------------------------------"
              rollFileExistsBehavior="Increment" rollInterval="None" rollSizeKB="20"
              timeStampPattern="yyyy-MM-dd" maxArchivedFiles="3" traceOutputOptions="None"
              filter="All" />
        </listeners>
        <formatters>
            <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
              template="Timestamp: {timestamp(local)}{tab}Message: {message}{tab}Category: {category}{tab}Priority: {priority}{tab}EventId: {eventid}{tab}ActivityId: {property(ActivityId)}{tab}Severity: {severity}{tab}Title:{title}{tab}"
              name="Brief Format Text" />
            <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
              template="Timestamp: {timestamp}{tab}Message: {message}{tab}Category: {category}{tab}Priority: {priority}{tab}EventId: {eventid}{tab}Severity: {severity}{tab}Title: {title}{tab}Activity ID: {property(ActivityId)}{tab}Machine: {localMachine}{tab}App Domain: {localAppDomain}{tab}ProcessId: {localProcessId}{tab}Process Name: {localProcessName}{tab}Thread Name: {threadName}{tab}Win32 ThreadId:{win32ThreadId}{tab}Extended Properties: {dictionary({key} - {value}{tab})}"
              name="Text Formatter" />
        </formatters>
        <logFilters>
            <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.PriorityFilter, Microsoft.Practices.EnterpriseLibrary.Logging"
              minimumPriority="2" maximumPriority="99" name="Priority Filter" />
            <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.LogEnabledFilter, Microsoft.Practices.EnterpriseLibrary.Logging"
              enabled="true" name="LogEnabled Filter" />
            <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.CategoryFilter, Microsoft.Practices.EnterpriseLibrary.Logging"
              categoryFilterMode="AllowAllExceptDenied" name="Category Filter">
                <categoryFilters>
                    <add name="BlockedByFilter" />
                </categoryFilters>
            </add>
        </logFilters>
        <categorySources>
            <add switchValue="All" name="Important">
                <listeners>
                    <!--<add name="Formatted EventLog TraceListener" />-->
                    <add name="Rolling Flat File Trace Listener" />
                </listeners>
            </add>
        </categorySources>
        <specialSources>
            <allEvents switchValue="All" name="All Events" />
            <notProcessed switchValue="All" name="Unprocessed Category">
                <listeners>
                    <!--<add name="UnprocessedFlatFile" />-->
                </listeners>
            </notProcessed>
            <errors switchValue="All" name="Logging Errors &amp; Warnings">
                <listeners>
                    <!--<add name="Formatted EventLog TraceListener" />-->
                </listeners>
            </errors>
        </specialSources>
    </loggingConfiguration>
</configuration>

线索在于内部异常。在InnerException.Message的末尾,它说:

Resolving System.Diagnostics.TraceListener,Formatted EventLog TraceListener

上述配置在app.config中。然后Program.cs包含:

class Program
{
    static void Main(string[] args)
    {
        LogWriter logWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
        logWriter.Write("Test");
     }
}

依赖项无法解析,类型 = "Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter",名称 = "(none)"。 发生异常,正在解析时。 异常为:InvalidOperationException - 无法构造类型 LogWriter。 您必须配置容器以提供此值。

在异常发生时,容器为:正在解析 Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter,(none)
- James123

8

编辑说明:在EL 6.0下,不再依赖Unity。在最后一次编辑时(2013年8月),Unity 3是当前产品。Unit 3.0

以下关于EL的App.config编辑器的提示仍然有用。也显示了从el5到el6的一些代码更改。

这是我澄清el5.0错误的尝试 错误示例

解析依赖项失败,类型= "Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter",名称= "(none)"。异常发生于:正在解析时。异常是: InvalidOperationException无法构造类型LogWriter。 您必须配置容器以提供此值。

执行摘要: Unity无法看到库或Unity找不到app.config条目,使用的库的app config条目不完整,或存在某些定位问题。 注意所有这些要点。

Enterprise Library 6下载站点 下载vsix文件

Microsoft.Practices.EnterpriseLibrary.ConfigConsoleV6.vsix

您可以使用此文件正确编辑app.config。

仍然使用nuget安装包,但需要上述下载才能正确编辑app.config。

PM > Install-Package EnterpriseLibrary.Logging
PM> Install-Package EnterpriseLibrary.Common
Pm> Install-Package Unity         
PM> Install-Package EnterpriseLibrary.ExceptionHandling

您可能对其他一些ENT库感兴趣。 http://nuget.org/packages?q=entlib

using System;  
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Unity;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.Unity;
using Microsoft.Practices.Unity;  // << SEPARATE since EL6 , unity 3 has own install.

public class abc
{
    /// <summary>
    /// Unity Container with key dependencies registered
    /// </summary>
    public static UnityContainer UC { get; private set; }

    private static IUnityContainer _IUContainer;// not sure if this is needed

    public static LogWriter LogWtr;
    public static ExceptionManager ExcMgr;

    /// <summary>
    /// Controller Bootstrap to manage as singleton via static properties and therefore ONLY 1 Unity Container
    /// </summary>
    static bootstrap()
    {
        UC = new UnityContainer(); // one container per work process. managing and resolving dependencies

        //  DO NO DO THIS WITH NEW VERSION OF Enterprise LIBRARY this was v5, v6 does not need this
        // now we tell unity about the container manager inside EntLib.
        // we dont want 2 containers, so we tell UNity look after EntLib as well please
        //  UC.AddNewExtension<EnterpriseLibraryCoreExtension>();

        //No need to add The extensions individually.
        //no longer required and indeed Library documents this as obselete
        //    UC.AddNewExtension<LoggingBlockExtension>();** 
        //================ END OF OLD V5 approach  ========================

        LogWtr = UC.Resolve<LogWriter>();
        ExcMgr = UC.Resolve<ExceptionManager>();

        // other initializations here
    }
}

使用下载的VSIX配置控制台,右键单击app.config文件。

EntLib Config Console

APP.CONFIG文件应该有一个包含正在使用的ENtLibraries的部分。您需要确保运行项目的app.config web配置中已添加条目,当您使用企业库控制台配置日志记录或异常处理时,才会添加这些条目。

 <configSections>
<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />

如果能够对“踩”投票进行评论就好了。如果您觉得有什么不对的地方,我会考虑改进。能否解释一下原因? - phil soady
1
与下降的投票无关,但对更新的一些评论:EntLib6不再使用Unity,因此您在EntLib6中永远不会看到此问题中的错误 - 您将看到不同类型的错误。 :) 此外,在安装日志记录或异常处理程序包(例如)时,您无需包括Common,因为它是一个依赖项,将自动安装。 - Randy Levy
很好的观点Tuzo。EL6中的统一性是轻量级的,而不是用于IOC的常规UNITY库。我会更新帖子以反映这一点。感谢您的反馈。 - phil soady

1
这对我有用,使用EL 6.0而不使用Unity

从web.config文件中初始化Logger,在Global.asax -> Application_Start中进行

var configSource = ConfigurationSourceFactory.Create();
Logger.SetLogWriter(new LogWriterFactory(configSource).Create());

在MVC控制器上使用记录器。
Logger.Write("Hello", "General");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接