我不知道自动执行此操作的内置方法。但是,如果您查看 Castle 的 git 存储库中的 TraceLogger,您会发现它们本质上已经包装和扩展了 TraceSource 以支持“分层”命名。
https://github.com/castleproject/Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs
我会在这里复制代码,但将代码剪切并粘贴到 SO 中可能不合适。
我可以解释课堂上提出的想法如何适用于您(无需使用 Castle)
本质上,在您的客户端代码(想要记录内容)中,您将创建一个“记录器”实例(而不是 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 中指定记录器的方式。
祝你好运!