【问题标题】:Prism 4 ILoggerFacade for Log4Net?用于 Log4Net 的 Prism 4 ILoggerFacade?
【发布时间】:2011-01-24 19:31:13
【问题描述】:

我正在从 Prism 2.1 转换到 Prism 4,我需要为 Log4Net 编写一个 ILoggerFacade 类。我来自 Prism 2.1 的旧代码不再有效。有没有人愿意分享 ILoggerFacade 类的示例代码?感谢您的帮助。

【问题讨论】:

    标签: log4net prism prism-4


    【解决方案1】:

    我想通了。与 Prism 2 非常相似。首先,创建一个实现 ILoggerFacade 的自定义记录器类。这是我的课:

    using log4net;
    using Microsoft.Practices.Prism.Logging;
    
    namespace FsNoteMaster3
    {
        class Log4NetLogger : ILoggerFacade
        {
            #region Fields
    
            // Member variables
            private readonly ILog m_Logger = LogManager.GetLogger(typeof(Log4NetLogger)); 
    
            #endregion
    
            #region ILoggerFacade Members
    
            /// <summary>
            /// Writes a log message.
            /// </summary>
            /// <param name="message">The message to write.</param>
            /// <param name="category">The message category.</param>
            /// <param name="priority">Not used by Log4Net; pass Priority.None.</param>
            public void Log(string message, Category category, Priority priority)
            {
                switch (category)
                {
                    case Category.Debug:
                        m_Logger.Debug(message);
                        break;
                    case Category.Warn:
                        m_Logger.Warn(message);
                        break;
                    case Category.Exception:
                        m_Logger.Error(message);
                        break;
                    case Category.Info:
                        m_Logger.Info(message);
                        break;
                }
            }
    
            #endregion
        }
    }
    

    然后,在 Prism 4 Bootstrapper 类中,为返回自定义记录器类的新实例的 CreateLogger() 方法添加覆盖:

    protected override Microsoft.Practices.Prism.Logging.ILoggerFacade CreateLogger()
    {
        return new Log4NetLogger();
    }
    

    请注意,在自定义记录器类中,ILog 是 Log4Net 接口,LogManager 是 Log4Net 对象。

    从您自己的代码写入自定义记录器(Prism 负责自己的日志条目)与在 Prism 2.1 中略有不同。您可以直接从 IoC 容器解析记录器,也可以使用 ServiceLocator。 ServiceLocator 具有与容器无关的优势,这意味着底层容器并不重要。以下是使用 ServiceLocator 解析记录器的示例:

    var logger = (Log4NetLogger)ServiceLocator.Current.GetInstance(typeof(ILoggerFacade));
    logger.Log("App.OnStartup() completed", Category.Info ,Priority.None);
    

    ServiceLocator 要求宿主项目具有对 Microsoft.Practices.ServiceLocation.dll 的引用和匹配的 using 语句。

    【讨论】:

    • 谢谢,但你为什么要把它投给Log4NetLogger?如果日志记录解决方案发生变化,那么所有记录器实例必须再次转换为另一种类型或删除转换代码!
    • 确实,你为什么要投?这意味着您需要对定义 Log4NetLogger 的程序集的引用,这违背了整个目的......
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 2023-03-04
    • 1970-01-01
    • 2011-06-29
    • 2011-09-25
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多