【问题标题】:Difference Between Logger and LogWriterLogger 和 LogWriter 的区别
【发布时间】:2012-12-09 02:25:00
【问题描述】:

我正在使用 Microsoft Enterprise Library 5.0 Logging 块,我想知道 LogWriter 和 Logger 类之间的区别。我有一些自定义跟踪侦听器,我已构建用于我的日志记录,我想知道使用 Logger 与 LogWriter 是否会产生任何影响。

来自 MSDN http://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.logging.logwriter.aspx

要将日志消息写入默认配置,请使用 Logger 外观。如果您需要使用自定义配置写入日志消息,请仅创建 LogWriter 的实例。

示例代码#1:

namespace ExampleOne
{
    using System;
    using System.Diagnostics;
    using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
    using Microsoft.Practices.EnterpriseLibrary.Logging;

    public class Program
    {
        private static LogWriter logger = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();

        public static void Main(string[] args)
        {
            try
            {
                throw new Exception("My test exception message");
            }
            catch (Exception ex)
            {
                LogEntry logEntry = new LogEntry();
                logEntry.Message = "Error: " + ex.ToString();
                logEntry.Categories.Add("General");
                logEntry.Severity = TraceEventType.Error;
                logger.Write(logEntry);
            }
        }
    }
}

示例代码#2:

namespace ExampleTwo    
{
    using System;
    using System.Diagnostics;
    using Microsoft.Practices.EnterpriseLibrary.Logging;

    public class Program
    {        
        public static void Main(string[] args)
        {
            try
            {
                throw new Exception("My test exception message");
            }
            catch (Exception ex)
            {
                LogEntry logEntry = new LogEntry();
                logEntry.Message = "Error: " + ex.ToString();
                logEntry.Categories.Add("General");
                logEntry.Severity = TraceEventType.Error;
                Logger.Write(logEntry);
            }
        }
    }
}

【问题讨论】:

  • 您在寻找什么样的效果(性能等)?我建议对 LogEntry 的构造函数进行反编译,因为这会告诉你在使用它之前底层 LogWriter 会发生什么。
  • 我真的不是在寻找任何效果。我只是想知道一种与另一种相比是否是正确的使用方法。

标签: logging customization enterprise-library-5 tracelistener


【解决方案1】:

获取当前实例的版本是成为更好版本的一部分,因为它更容易使用依赖注入,因此在记录器写入数据库或发送电子邮件或以其他方式与一些大型交互的情况下更容易进行单元测试具有与被测代码无关的行为的外部组件。

另一方面,如果目标是鼓励您的团队进行日志记录,那么以最少的设置进行日志记录是更好的选择,但配置将由配置文件驱动,您需要单独的配置文件用于测试和生产.

此外,在现实生活中的组织中,您不能总是期望操作人员是 Web 配置(或者在这种情况下是 Ent Lib 配置)超级忍者,有时您需要提供打开日志记录和关闭日志记录的 UI,或者否则会更改行为(例如将错误发送到不同的邮件列表/用户列表),这将需要动态配置。当通过 UI 更改日志记录行为只是一项普通事务时,我曾在组织中工作,但更改如此之多,以至于 web.config 的一个角色采取了上帝的frickin行为和更改控制委员会。

【讨论】:

  • 谢谢。我们只是想促进/鼓励团队登录。我想我会走使用通用 Logger.Write() 方法的路线,而不是在我们想要登录的每个类中实例化/获取记录器的当前实例。
【解决方案2】:

使用静态Logger.Write()门面和使用LogWriter的Write方法没有区别。

这是 Logger.Write 的作用:

public static void Write(LogEntry log)
{
    Writer.Write(log);
}

其中 Writer 是 LogWriter 的一个实例。提供 Logger.Write() 是为了向后兼容企业库的先前版本;首选方法是使用 LogWriter 实例,主要是因为增强了可测试性。

来自Creating and Referencing Enterprise Library Objects

作为默认方法的传统静态外观和工厂 在 5.0 之前的 Enterprise Library 版本中, 可用,并且出于向后的目的继续得到支持 兼容性。但是,新代码应使用服务定位器 直接访问容器的方法或技术,如 在本主题的前面部分中进行了描述。

根据发布的异常日志记录示例,您可能需要考虑将异常处理块与日志记录一起使用,这样开发人员甚至不必记录日志——只需处理异常即可。您也许可以使用 Process 方法来包装调用,以便在被调用的方法中不需要代码:

ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
em.Process( () => MethodThatMightThrow(), "My Logging Exception Policy"); 

另一种方法可能是使用拦截和ExceptionCallhandler

这两种方法虽然从设计角度来看略有限制,但可以让开发人员完全隐藏异常日志记录,以便他们可以专注于编写应用程序而不是样板日志记录代码。

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 2023-03-31
    • 2015-10-30
    • 2017-09-04
    • 1970-01-01
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多