使用企业库进行日志记录的模式

时间:2010-07-29 13:54:48

标签: logging enterprise-library

在我们当前的项目中我们决定使用企业库进行日志记录,到目前为止我们只使用了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配置我可以在不触及应用程序的情况下为特定类转换info / warn 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行不是非常开发人员友好的,使用一些静态方法来解决整个解决方案会降低过滤的灵活性,那么使用日志记录的最佳方法是什么? 你找到了任何有意义的模式如何使用它?

感谢 阿尔米尔

2 个答案:

答案 0 :(得分:4)

您的问题涉及企业库的“问题”之一。当然,它只是工作(通常有一些配置头痛),但如果你想要一些结构的东西它不存在。此外,微软没有太多的指导。

这就是我要做的事情:

  • 我会在Logging Block中添加一个外观,让您可以控制 想要记录数据的方式。即如果您不希望开发人员创建自己的类别,请让您的外观进行枚举(您可以将其标记为Flags以允许多个类别)。

  • 我会删除优先级,因为考虑到你还有严重性和类别可以过滤,我认为它不会很快购买。

  • 您可能还想添加重载以支持Exceptions和ValidationResults(如果您使用的是验证应用程序块)。

  • 您可能希望拥有的另一个功能是将类名添加为类别以支持特定类的日志记录。您可以让开发人员传递类名,也可以通过反射确定它。我更喜欢传递它。

所以你可以这样做:

[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.

答案 1 :(得分: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);

说实话,我仍然需要遇到一个案例,其中Log4Net和Enterprise日志记录的所有过度复杂化实际上都是必需或可取的。

有关详细信息,请参阅我的个人资料(它是SixPack library的一部分)