我不知道内置的方式自动执行此操作。但是,如果您查看Castle的git存储库中的TraceLogger,则可以看到它们已经基本上包装并扩展了TraceSource以支持“hierarichal”命名。
https://github.com/castleproject/Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs
我会在这里复制的代码,但它可能不是正确的,只是削减和有代码粘贴到SO。
我可以解释如何在课堂上提出的意见可能对你的工作(没有你不必使用城堡)
从本质上说,在你的客户端代码(即要登录的东西),你会创建一个实例你的“记录器”(而不是TraceSource)。作为记录器的输入,例如,您可以提供完全限定的类名称。在构造函数内部,使用输入名称来尝试解析TraceSource。如果有一个使用该名称配置的TraceSource,请使用该TraceSource来完成这项工作。如果不是,请删除完全限定名称的最右侧部分。尝试使用该名称解析TraceSource。如果使用该名称配置了TraceSource,请使用它。等等。如果您没有找到任何TraceSources,则不要记录您的“记录器”中的任何内容。您可以添加识别已使用通配符名称(“”)配置的TraceSource的功能。如果您从未使用名称裁剪技术找到TraceSource,并且如果存在“”TraceSource,则使用“*”TraceSource作为后备。
所以,你可能有这样的事情:
class MyTraceSource
{
private TraceSource ts;
public MyTraceSource(string name)
{
ResolveTraceSource(name);
}
private void ResolveTraceSource(string name)
{
//Check for a configured TraceSource from most qualified name (as input) to least qualified ("").
//Assume name like this: Namespace1:Namespace2:Class
//Try to resolve:
// TraceSource("Namespace1.Namespace2.Class");
// TraceSource("Namespace1.Namespace2");
// TraceSource("Namespace1");
//If you still haven't found one, try to resolve
// TraceSource("*");
}
//Implement either TraceSource API, or whatever API you prefer for logging.
}
其实我已经做了这样的事情我自己为原型的部分(即我们结束了不使用)和它的工作相当不错模仿的方式您可以在log4net和NLog中指定记录器。
祝你好运!
谢谢你的回答太棒了。我已经做了几乎像你所建议的一样。我给记录员完整的课程名称,并试图解决大会。然后我使用程序集名称作为日志源。 (所以我的所有装配都有不同的来源)。但我从来没有想过要制作自己的通配符来源。此外,我认为你的解决方式有更多的灵活性,并且可能更快。感谢它不会让我很难实现这一点,非常有用! – 2013-03-30 11:14:36