Ошибка активации произошла при попытке получить экземпляр типа LogWriter, ключ ""?
У меня есть сайт asp.net. Я добавил ссылку на Microsoft.Practices.EnterpriseLibrary.Logging.dll
на сайт.
в файле web.cofig, который я определил, как показано ниже.
<?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 & 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 ""
Как разрешить это?
Ответы
Ответ 1
В вашей полной конфигурации ссылки отслеживаются прослушиватели, которые не определены. Это приводит к тому, что среда выполнения 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 & Warnings">
<listeners>
<!--<add name="Formatted EventLog TraceListener" />-->
</listeners>
</errors>
</specialSources>
</loggingConfiguration>
</configuration>
Ключ во внутреннем исключении. В конце InnerException.Message
он говорит:
Устранение System.Diagnostics.TraceListener, форматированный EventLog TraceListener
Вышеуказанная конфигурация находится в app.config. Затем Program.cs содержит:
class Program
{
static void Main(string[] args)
{
LogWriter logWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
logWriter.Write("Test");
}
}
Ответ 2
EDIT: в EL 6.0 больше нет зависимости Unity
Во время последнего редактирования (AUG 2013) Unity 3 был текущим продуктом.
Unit 3.0
Некоторые из советов, приведенных ниже в редакторе App.config для EL, по-прежнему полезны.
Также показаны некоторые изменения кода для el5 до el6.
Вот моя попытка прояснить. ошибка el5.0
Пример ошибки
Сбой разрешения зависимостей, type = "Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter", name = "(никто)". Исключение произошло во время: при разрешении. Исключение составляет: InvalidOperationException Тип LogWriter не может быть сконструирован. Вы должны настроить контейнер для подачи этого значения.
Резюме:
Unity не может видеть, что библиотеки или единство не могут найти записи 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 для запущенного проекта
Записи добавляются, когда вы используете консоль библиотеки предприятия для настройки ведения журнала или обработки исключений.
<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" />
Ответ 3
Это сработало для меня, с EL 6.0 и не используя Unity
Init Logger из файла web.config, в Global.asax → Application_Start
var configSource = ConfigurationSourceFactory.Create();
Logger.SetLogWriter(new LogWriterFactory(configSource).Create());
Использовать регистратор на контроллере MVC
Logger.Write("Hello", "General");