我无法使用类名过滤器配置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>();
我还需要指定其他任何内容才能使其与类规则一起使用吗?
答案 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
,并且错误级别(及以上)fileTarget1
和fileTarget3
。
Bottomline,当您不知道(或关心)将使用给定日志记录规则的类型的确切名称时,*
通配符非常有用,因此在您的情况下,这适用于所有类在My.NameSpace
下:
<logger name="My.NameSpace.*" minlevel="Debug" writeTo="file" />
这适用于Ninject,但就IoC而言,它只是注入了另一个依赖项,容器不知道它是一个日志助手。因此,如果Castle正在生成代理并且您只需要1个目标,那么您可以使用Castle.*
作为过滤器。