NLog类过滤器无法正常工作

时间:2013-08-28 19:16:19

标签: c# castle-windsor nlog

我无法使用类名过滤器配置NLog。

<rules>
    <logger name="My.NameSpace.MyController" minlevel="Debug" writeTo="file" />
  </rules>

如果我指定一个完全限定的类名,它不会记录,但如果我指定name="*"

它确实有效

我正在使用Castle Windsor来设置它:

 Container.AddFacility<LoggingFacility>(f => f.UseNLog("NLog.config"));

在MyController类中进行此调用

Logger = MvcApplication.Container.Resolve<ILogger>();

我还需要指定其他任何内容才能使其与类规则一起使用吗?

3 个答案:

答案 0 :(得分:1)

我相信Castle Windsor用您在config中设置的代理和记录器名称替换您的类与实际实例类型不匹配。

您可以明确设置日志名称,如

Logger = LogManager.GetLogger("My.NameSpace.MyController").

额外提示:在许多情况下,使用控制反转解析记录器不会带来很多好处,您可以避免这样做,否则您应该在Castle Windsor中调整记录器注册。

答案 1 :(得分:1)

如果您直接从容器中请求ILogger(例如Logger = MvcApplication.Container.Resolve<ILogger>();),Windsor将始终为您提供名为ILogger的默认Default

配置ToLog时,您可以使用LoggingFacility方法更改此默认名称:

container.AddFacility<LoggingFacility>(f => f.UseNLog("NLog.config")
                                             .ToLog("MyDefaultname"));

如果您想拥有“当前类记录器”而不是默认值,那么您需要让Windsor注入ILogger而不是手动解析它。

所以如果你使用构造函数注入:

public MyController
{
    private ILogger logger;

    public MyController(ILogger logger)
    {
         this.logger = logger;
    }
}

或财产注入:

public MyController
{
    public ILogger Logger { get; set; }
}

Windsor将使用正确的ILogger名称为您创建My.NameSpace.MyController

如果您需要对记录器名称进行更精细的控制,您可以依赖/解析Castle.Core.Logging.ILoggerFactory界面,您可以使用它创建自己的ILogger

答案 2 :(得分:0)

如果给定命名空间下的所有类都使用相同的目标,您可以像这样配置规则:

<rules>
    <logger name="MyApp.Controllers.*" minlevel="Debug" writeTo="fileTarget1" />
    <logger name="MyApp.AnotherNamespace.*" minlevel="Debug" writeTo="fileTarget2" />
    <logger name="*" minlevel="Error" writeTo="fileTarget3" />
</rules>

如果您在每个控制器(GetType().FullName下)中使用MyApp.Controllers命名记录器,则上述配置会将调试级别(及以上)条目写入fileTarget1,并且错误级别(及以上)fileTarget1fileTarget3

Bottomline,当您不知道(或关心)将使用给定日志记录规则的类型的确切名称时,*通配符非常有用,因此在您的情况下,这适用于所有类在My.NameSpace下:

<logger name="My.NameSpace.*" minlevel="Debug" writeTo="file" />

这适用于Ninject,但就IoC而言,它只是注入了另一个依赖项,容器不知道它是一个日志助手。因此,如果Castle正在生成代理并且您只需要1个目标,那么您可以使用Castle.*作为过滤器。