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

zeb*_*bra 5 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");
Run Code Online (Sandbox Code Playgroud)

这将使我去申请后,并通过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);
Run Code Online (Sandbox Code Playgroud)

但是我必须根据一些带有拼写错误和类似字符串的字符串进行过滤,并且每个开发人员都会介绍他的类别标记,限制此问题的最佳方法是什么,构建消息的最佳实践是什么,另一方面是解决方案是对于单个日志消息需要10行的开发人员友好,对整个解决方案使用一些静态方法会降低过滤的灵活性,那么使用日志记录的最佳方法是什么?
你找到了任何有意义的模式如何使用它?

谢谢almir

Ran*_*ica 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);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样称呼它:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果参数仍然太多,那么您可以使用一个重载,它需要更少的参数并为其他值提供默认值。例如,如果您不关心 EventID,则将其默认为 0。