2011-05-18 136 views
4

我们使用Enterprise Library 4.1进行日志记录(和异常处理/加密)。企业库日志记录 - 如何在运行时获取配置的日志记录级别?

有谁知道在运行时确定配置的日志记录级别的好方法吗?我写了一个LogUtility类来进行记录电话,和我叫它按照本例:

LogUtility.LogVerbose(
    string.Format("Processing event {0}", currentEvent.EventIDImported), 
    MethodBase.GetCurrentMethod().Name, 
    this.GetType().Name 
); 

据我所知,它不会真正得到记录到文件,除非日志记录级别设置为在我的情况下,在app.config中是适当的级别。但是我并不真正想要方法参数,即方法和类型名称,并且在某些情况下记录实际字符串,除非绝对必要,否则将被评估。

这似乎是一个有效的关注?我们的应用程序可以有数千万次的迭代和记录点。如果可能的话,我想根据配置的日志级别设置一个标志,并在上面进行方法调用之前检查该标志。

编辑 - 我想就上面的例子来说,我可以在每次调用时硬编码方法和类型名称。但是我仍然想知道是否有确定水平的方法。

+1

这的确是一个值得关注的问题。 – 2011-05-18 10:57:56

回答

2

我真的不希望的方法 参数,即方法和类型 名称,在某些情况下,实际的 字符串被记录,除非绝对必要,否则将被评估为 。

基于上述我想你应该看看ShouldLog方法LogWriter。它可以让你确定是否将基于当前配置记录一个LogEntry,并且可以(希望)避免创建不需要的对象。

从企业库4.1 Walkthrough: Checking Filter Status Before Constructing Log Messages借用代码:

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一个静态属性称为ShouldLogVerboseIsVerboseEnabled和财产的内部使用“正确”构造的LogEntry(用于您的应用程序)来确定是否将记录消息。例如

if (LogUtility.IsVerboseEnabled) 
{ 
    LogUtility.LogVerbose(
     string.Format("Processing event {0}", currentEvent.EventIDImported), 
     MethodBase.GetCurrentMethod().Name, 
     this.GetType().Name 
    ); 
} 
+0

感谢您指点我正确的方向;这正是我所期待的。我打算把你所描述的创建一个静态属性,但不知道如何获得布尔值 - “ShouldLog”就是我所追求的。 – StephenH 2011-05-19 09:12:04