企业库日志记录 - 如何在运行时获取配置的日志记录级别?

5
我们正在使用企业库4.1进行日志记录(以及异常处理/加密)。
有人知道在运行时确定配置的日志记录级别的好方法吗?我编写了一个LogUtility类来进行日志记录调用,并按照此示例进行调用:
LogUtility.LogVerbose(
    string.Format("Processing event {0}", currentEvent.EventIDImported), 
    MethodBase.GetCurrentMethod().Name, 
    this.GetType().Name
);

我知道,除非在我的情况下在app.config中设置适当的日志记录级别,否则它实际上不会被记录到文件中。但是,我不希望方法参数(即方法和类型名称以及有时记录的实际字符串)在绝对必要之前被评估。
这是否看起来像一个有效的问题?我们的应用程序可能有数千万个迭代和日志点。如果可能的话,我想基于配置的日志级别设置一个标志,并在进行以上方法调用之前检查该标志。
编辑-我想,在上面的示例中,我可以在每个调用上硬编码方法和类型名称。但我仍然想知道是否有确定级别的方法。

2
那确实是一个合理的担忧。 - Daniel Hilgarth
2个回答

2

2
“我不是真的想要方法参数,即方法和类型名称,有时甚至不想要被记录的实际字符串,除非绝对必要。”
基于上述内容,我认为您应该查看“LogWriter”的ShouldLog方法。它将根据当前配置让您确定是否将记录LogEntry,并且您可以(希望)避免创建不需要的对象。
借鉴企业库4.1 检查过滤器状态以在构造日志消息之前的代码:
LogEntry logEntry = new LogEntry();
logEntry.Priority = 2;
logEntry.Categories.Add("Trace");
logEntry.Categories.Add("UI Events");

if (Logger.ShouldLog(logEntry))
{
  // Perform operations (possibly expensive) to gather additional information 
  // for the event to be logged. 
}
else
{
  // Event will not be logged. Your application can avoid the performance
  // penalty of collecting information for an event that will not be
  // logged.
}

由于您正在使用自己的LogUtility类,您可能希望在LogUtility上创建一个静态属性,称为ShouldLogVerbose或IsVerboseEnabled,并在该属性内部使用“正确构造”的LogEntry(适用于您的应用程序)来确定是否记录消息。 例如:
if (LogUtility.IsVerboseEnabled)
{
    LogUtility.LogVerbose(
        string.Format("Processing event {0}", currentEvent.EventIDImported), 
        MethodBase.GetCurrentMethod().Name, 
        this.GetType().Name
    );
}

谢谢你指引我正确的方向,这正是我所需要的。我本来想按照你所描述的创建一个静态属性,但不确定如何获取布尔值 - "ShouldLog" 就是我需要的。 - StephenH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接