2013-11-15 2 views
3

Я получаю исключение при настройке logwriter для компонента регистрации Enterprise Library 6.0. При первом входе в журнал это удается. Но для последовательных вызовов он генерирует исключение: The LogWriter is already set. Я попытался с проверкой, не является ли Logger.Writer нулевым. Но это не удается в первом случае, за исключением того, что я должен установить автора, используя Logger.SetLogWriter.ошибка в entlib 6 экземпляр logger

Вот мой код:

if (Logger.Writer == null) // fails on first call 
{ 
    IConfigurationSource configurationSource = ConfigurationSourceFactory.Create(); 
    LogWriterFactory logWriterFactory = new LogWriterFactory(configurationSource); 
    Logger.SetLogWriter(logWriterFactory.Create()); // fails on subsequent calls. 
} 

ответ

0

Вы проверили, что не существует какой-либо установка LogWriter в вашем web.config (если это asp.net) или app.config (если это консоль или окна приложения .)

Пожалуйста, также как использовать LogWriter (Microsoft.Practices.EnterpriseLibrary.Logging.dll) в этой теме

How to set and use more than one formatter for a trace listener in EntLib log app block

0

в ухе lier, мы использовали

var logWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>(); 

ПредприятиеLibraryContainer возвращает тот же экземпляр.

Но с EL 6.0, LibraryContainer отбрасывается. Однако Logger, похоже, поддерживает только один сценарий с однократной инициализацией.

Я решил это с помощью статической переменной, чтобы проверить, инициализирован ли сценарий или нет. В качестве альтернативы это можно сделать с помощью одноточечного или статического объекта.

1

ответ использовать статическую переменную для того, чтобы получить только один экземпляр LogWriter

сделать это следующим образом:

public class BaseController : Controller 
{ 
    private static ExceptionManager _exceptionManager; 
    private static LogWriter _logWriter; 

    public ExceptionManager ExceptionManager 
    { 
     get 
     { 
      IUnityContainer container = new UnityContainer(); 
      try 
      { 
       if (_exceptionManager == null) 
       { 
        IConfigurationSource configurationSource = ConfigurationSourceFactory.Create(); 
        ExceptionPolicyFactory exceptionFactory = new ExceptionPolicyFactory(configurationSource); 

        if (configurationSource.GetSection(LoggingSettings.SectionName) != null) 
        { 
         LogWriterFactory logWriterFactory = new LogWriterFactory(configurationSource); 
         Logger.SetLogWriter(logWriterFactory.Create()); 

        } 

        container.RegisterInstance<ExceptionManager>(exceptionFactory.CreateManager()); 
        _exceptionManager = container.Resolve<ExceptionManager>(); 
        return _exceptionManager; 
       } 
       else 
       { 
        return _exceptionManager; 
       } 
      } 
      finally 
      { 
       ((IDisposable)container).Dispose(); 
      } 

     } 
     set 
     { 
      _exceptionManager = value; 
     } 
    } 

    /// <summary> 
    /// Used to log entries in the log file 
    /// </summary> 
    public LogWriter LogWriter 
    { 
     get 
     { 
      IUnityContainer container = new UnityContainer(); 
      try 
      { 
       if (_logWriter == null) 
       { 
        IConfigurationSource configurationSource = ConfigurationSourceFactory.Create(); 
        LogWriterFactory logWriterFactory = new LogWriterFactory(configurationSource); 
        Logger.SetLogWriter(logWriterFactory.Create()); 
        // Singleton 
        container.RegisterInstance<LogWriter>(logWriterFactory.Create()); 
        _logWriter = container.Resolve<LogWriter>(); 
        return _logWriter; 
       } 
       else 
        return _logWriter; 
      } 
      finally 
      { 
       ((IDisposable)container).Dispose(); 
      } 
     } 
     set 
     { 
      _logWriter = value; 
     } 
    } 


    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Thread.CurrentThread.CurrentUICulture = new CultureInfo("es"); 
     Thread.CurrentThread.CurrentCulture = new CultureInfo("es"); 

     if (Session.Count == 0) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } }); 
     } 

    } 

    protected override void OnException(ExceptionContext filterContext) 
    { 
     this.ExceptionManager.HandleException(filterContext.Exception, "AllExceptionsPolicy"); 

     //Show basic Error view 
     filterContext.ExceptionHandled = true; 

     //Clear any data in the model as it wont be needed 
     ViewData.Model = null; 

     //Show basic Error view 
     View("Error").ExecuteResult(this.ControllerContext); 

    } 

} 
+0

работал в моей ситуации ... используя 'IoC', а также, с' Замок Windsor'. Наличие 'private static LogWriter' и свойство' LogWriter' интерфейса разрешили его. – user919426

4

Попробуйте это:

IConfigurationSource configurationSource = ConfigurationSourceFactory.Create(); 
LogWriterFactory logWriterFactory = new LogWriterFactory(configurationSource); 
Logger.SetLogWriter(logWriterFactory.Create(), false); 
+0

Не забудьте добавить ссылку на 'System.Configuration' в свой проект :) (там живет' LogWriterFactory') – async

0
Logger.SetLogWriter(logWriterFactory.Create(), false); 

по умолчанию throwIfSet флаг установлен на true и будет генерировать исключение, если журнал w riter уже установлен.

2

Я также столкнулся с той же проблемой при использовании версии 6.0. Я решил это, создав свой собственный статический класс журнала и инициализируя SetLogWriter() в конструкторе. Ниже приведен код:

using System; 
using ms = Microsoft.Practices.EnterpriseLibrary.Logging; 
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; 

namespace LoggingService 
{ 
    public static class Logger 
    { 
     static Logger() 
     { 
      try 
      { 
       IConfigurationSource configurationSource = ConfigurationSourceFactory.Create(); 
       ms.LogWriterFactory logWriterFactory = new ms.LogWriterFactory(configurationSource); 
       ms.Logger.SetLogWriter(new ms.LogWriterFactory().Create()); 
      } 
      catch (Exception) 
      { 
      } 
     } 
     /// <summary> 
     /// Writes exception details to the log using Enterprise Library 
     /// </summary> 
     /// <param name="ex"></param> 
     public static void Log(Exception ex) 
     { 
// can be changed as per your requirement for the event/priority and the category 
      ms.Logger.Write(ex, "ErrorsWarnings", 1, 1, System.Diagnostics.TraceEventType.Error); 
     } 
     /// <summary> 
     /// Writes Information message to the log using Enterprise Library 
     /// </summary> 
     /// <param name="infoMsg"></param> 
     public static void Log(string infoMsg) 
     { 
      ms.Logger.Write(infoMsg); 
     } 
    } 
} 

И просто использовали как

Logger.Log(ex); 
//or 
Logger.Log("Your message"); 
Смежные вопросы