Logger和LogWriter之间的区别

时间:2012-12-21 13:44:01

标签: logging customization enterprise-library-5 tracelistener

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

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

以下是Logger.Write的作用:

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

Writer是LogWriter的一个实例。提供Logger.Write()是为了与以前版本的Enterprise Library向后兼容;首选方法是使用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

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