如何配置Microsoft Enterprise Library Logging Application Block来处理任何日志类别?

4
我正在尝试使用.NET通用基础结构库(Common.Logging)与Enterprise Library 4.1的Logging Application Block。根据文档,这是支持的。
我遇到的问题是当我尝试记录一些东西时,就像这样(在此示例中,我在一个ASP.NET MVC应用程序中):
public ActionResult Index()
{
    ViewBag.Message = "Welcome to ASP.NET MVC!";

    ILog log = LogManager.GetCurrentClassLogger();
    log.Info("Hello world!");

    return View();
}

我没有收到日志信息,而是在我的事件日志中收到了一个错误:

消息:没有显式映射类别“TestApp.Controllers.HomeController”。

嗯,在Common.Logging中似乎没有任何选项可以设置默认类别,我也无法弄清楚如何配置LoggingConfiguration以接受任何未定义的类别。

这是我的LoggingConfiguration的一部分:

<loggingConfiguration name="Logging Application Block" tracingEnabled="true"
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
...
  <categorySources>
    <add switchValue="All" name="General">
      <listeners>
        <add name="Formatted EventLog TraceListener" />
        <add name="Email TraceListener" />
      </listeners>
    </add>
  </categorySources>
  <specialSources>
    <allEvents switchValue="All" name="All Events" />
    <notProcessed switchValue="All" name="Unprocessed Category" />
    <errors switchValue="All" name="Logging Errors &amp; Warnings">
      <listeners>
        <add name="Formatted EventLog TraceListener" />
      </listeners>
    </errors>
  </specialSources>
</loggingConfiguration>

我尝试将logWarningsWhenNoCategoriesMatch设置为false,但这只是让警告静音了,而没有使日志记录工作。
我还尝试去掉<notProcessed switchValue="All" .../>特殊源,但这似乎也没有任何效果。
有人知道有什么方法可以让它工作吗?谢谢!
2个回答

5
'notProcessed'这个特殊源可以匹配任何不符合类别源的条目-因此您可以使用它来捕获它们。 这里有更多信息:https://entlib.codeplex.com/discussions/215189
<notProcessed switchValue="All" name="Unprocessed Category"/>
    <listeners>
        <add name="Rolling Flat File Trace Listener Unprocessed"/>
    </listeners>
</notProcessed>

1
这是我找到的解决方案,因为我不必修改源代码。谢谢! - Calvin

3
当您调用 LogManager.GetCurrentClassLogger() 时,Common.Logging 将使用调用类的类型作为类别:
public static ILog GetCurrentClassLogger()
{
    StackFrame frame = new StackFrame(1, false);
    return Adapter.GetLogger(frame.GetMethod().DeclaringType);
}

如果您想使用这种方法(虽然不建议过度使用,因为它会检查 StackFrame),那么是的,您需要为每个您从中记录日志的类创建一个类别。这将重新创建一种类似于 Log4Net 中使用的分层记录器。但是,这种方法并不理想,因为它不可维护。
您应该能够通过使用 LogManager.GetLogger(string name) 重载而不是 GetCurrentClassLogger 来避免这种情况。看起来传递的名称将用作 Enterprise Library 中记录日志的类别。因此,您可以将类别名称定义为常量,并将其传递给 GetLogger 方法,使整个应用程序使用一个 Enterprise Library 类别。

@Tuxo - 太棒了!我没有意识到 GetLogger 会以这种方式工作 - 我的 假设 (哎呀)是 GetLogger 会返回与给定类型匹配的记录器,有点像 ServiceLocator 模式。现在对我来说,命名更有意义了。谢谢!!! - Pandincus
@Pandincus - 有一个GetLogger重载函数可以接受一个Type参数,这可能是你想要的。 - Randy Levy

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