Activation error occured while trying to get instance of type LogWriter, key “”?

后端 未结 3 2092
無奈伤痛
無奈伤痛 2021-02-20 06:45

I have asp.net web site. I added reference of Microsoft.Practices.EnterpriseLibrary.Logging.dll to the site.

in web.cofig file, I defined like below.

相关标签:
3条回答
  • 2021-02-20 07:09

    EDIT: Under EL 6.0 there is no longer a dependency Unity no longer At the time of last edit (AUG 2013) Unity 3 was the current product. Unit 3.0

    Some of the tips below around the App.config editor for EL is still useful. Some code changes for el5 to el6 are also shown.

    Here is my attempt to clarify. the el5.0 error The error example

    Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter", name = "(none)". Exception occurred while: while resolving. Exception is: InvalidOperationException The type LogWriter cannot be constructed. You must configure the container to supply this value.

    The Executive summary: Unity can not see the libraries or unity cant find the app.config entries , the app config entries are incomplete for the library being used, or there are some targeting issues. Pay attention to all of these points.

    Enterprise Library 6 download site Down load the vsix file

    Microsoft.Practices.EnterpriseLibrary.ConfigConsoleV6.vsix

    you use this to edit the app.config properly.

    Still use nuget to install packages, BUT you need the above download to edit the app.config properly

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

    There are a few more ENT Libraries you may be interested in. 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
        }
    }
    

    Use the config console downloaded ie the VSIX. right click on app.config .

    EntLib Config Console

    The APP.CONFIG file should have a section with the ENtLibraries in use. You need to make sure the app.config web config of the running project has The entries are added when you use the Enterprise library console to configure Logging or exception handling.

     <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" />
    
    0 讨论(0)
  • 2021-02-20 07:28

    This worked for me, with EL 6.0 and not using Unity

    Init Logger from web.config file, on Global.asax -> Application_Start

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

    Use logger on MVC controller

    Logger.Write("Hello", "General");
    
    0 讨论(0)
  • 2021-02-20 07:32

    Your full config references trace listeners that are not defined. This is causing the Enterprise Library runtime to throw a runtime exception when it tries to resolve those references.

    I commented out the unused listeners (and changed the default category to Important) and it is working:

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

    The clue is in the inner exception. At the end of the InnerException.Message it says:

    Resolving System.Diagnostics.TraceListener,Formatted EventLog TraceListener

    The above config is in app.config. Then Program.cs contains:

    class Program
    {
        static void Main(string[] args)
        {
            LogWriter logWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
            logWriter.Write("Test");
         }
    }
    
    0 讨论(0)
提交回复
热议问题