4

我在使用类名过滤器配置 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>();

还有什么我必须指定的才能使它与类规则一起使用吗?

4

3 回答 3

2

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

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

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

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

于 2013-08-28T19:22:02.817 回答
2

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

<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

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

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

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

于 2013-08-28T20:24:52.007 回答
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接口,您可以使用它创建自己的ILoggers。

于 2013-08-28T20:01:48.557 回答