5

我正在使用 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);
            }
        }
    }
}
4

2 回答 2

5

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

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

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

于 2012-12-26T17:21:56.560 回答
5

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

这是 Logger.Write 所做的:

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

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

创建和引用企业库对象

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

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

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

另一种方法可能是将拦截与ExceptionCallhandler一起使用。

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

于 2012-12-30T07:11:18.743 回答