2010-07-29 74 views
5

对我们当前的项目我们决定使用企业库进行登录,到目前为止我们只使用了log4net,但我找不到任何建议如何真正灵活地使用这个库,我的意思是在log4net的,这将是这样:使用企业库登录的模式

//define this in MyClass 
private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); 
//and than in the methods you can call it like this 
log.Info("info message"); 

这将使我去申请后,并通过chainging配置我可以把信息/警告特定类levelels无需触摸应用。

日志库的唯一样本基本上是这样的:

LogEntry logEntry = new LogEntry(); 
logEntry.EventId = 100; 
logEntry.Priority = 2; 
logEntry.Message = "Informational message"; 
logEntry.Categories.Add("Trace"); 
logEntry.Categories.Add("UI Events"); 
Logger.Write(logEntry); 

但比我注定会基于一些字符串有错别字和类似于过滤器,每一个开发者介绍他类别的记号,是什么限制这个最好的方法是什么,关于构造消息的最佳实践是在解决方案的另一端,对于单条日志消息需要10行的开发人员来说是不友好的,对于整个解决方案使用一些静态方法会降低过滤的灵活性,那么什么是使用日志记录的最佳方式?
你有没有发现任何有意义的模式如何使用它?

感谢 阿尔米尔

回答

4

上的企业图书馆的“问题”一个你的问题的一面。当然,它只是起作用(通常有一些配置头痛),但如果你想要一些结构的东西,它不在那里。另外,微软没有太多的指导。

这里是我会做:

  • 我想一个门面添加到日志程序块,可以让你控制你如何希望记录的数据。即如果您不希望开发人员创建自己的类别,请让您的外观采用枚举(您可以将其标记为允许多个类别的标志)。

  • 我会摆脱优先,因为我不认为它购买非常多,因为你也有严重性和类别过滤。

  • 您还可能想要添加重载以支持异常和验证结果(如果您使用验证应用程序块)。

  • 您可能想要的另一个功能是将类名称添加为类别以支持特定类的日志记录。您可以让开发人员通过课程名称,也可以通过反思来确定。我更喜欢通过它在

所以你可以做这样的事情:

[Flags] 
public enum EventDataTypeCategory 
{  
    None = 0x0, 
    Failure = 0x1, 
    Error = 0x2 , 
    Warning = 0x4, 
    Information = 0x8, 
    Debug = 0x10, 
    Trace = 0x20, 
    UIEvents = 0x40, 
    DataAccess = 0x80 
} 

public static void LogMessage(string message, string className, int eventId, 
    EventDataTypeCategory categories) 
{ 
    // Create LogEntry 
    LogEntry logEntry = new LogEntry(...); 

    // Add all categories 
    foreach (EventDataTypeCategory enumValue in System.Enum.GetValues(typeof(EventDataTypeCategory))) 
    { 
     if ((enumValue & categories) == enumValue) 
     { 
      logEntry.Categories.Add(enumValue.ToString()); 
     } 
    } 

    if (className != null) 
    { 
     logEntry.Categories.Add(className); 
    } 

    ... 

    Logger.Write(logEntry); 
} 

然后,你可以这样调用它:

public class MyClass 
{ 
    private static readonly string ClassName = typeof(MyClass).FullName; 

    public void DoSomething() 
    { 
     MyLogger.LogMessage("I'm going to DoSomething now!", 
      ClassName, 
      1001, 
      EventDataTypeCategory.Trace | EventDataTypeCategory.UIEvents); 
    } 
} 

如果这仍然是参数太多,然后您可以拥有一个占用较少参数的重载,并为其他值提供默认值。例如如果您不关心EventID,则默认为0.

0

没有真正回答你的问题,但我结束了创建我自己的日志记录系统。

你所要做的唯一事情是:

Log.Instance.Add("This is a message"); 

所有其它更复杂的用途是通过不同的方法或重载完成的,例如:

Log.Instance.AddFormat("My favourite number is {0}", 42); 

或者

Log.Instance.Add("This is an important message", LogLevel.Critical); 

老实说,我还是要遇到一个情况,其中所有Lo的过分复杂g4Net和企业日志实际上是必要的或可取的。

欲了解更多信息,请参阅我的个人资料(它是SixPack library的一部分)