我是NLog的新手并且已经选择将它添加到我的ServiceStack(4.0.44)Web服务中,但是它没有像我预期的那样工作,因为我总是最终使用NullDebugLogger。
我有
Global.asax中
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
LogManager.LogFactory = New NLogFactory()
Dim appHost As New MyAppHost
appHost.Init()
End Sub
我还手动添加了一个NLog.config文件来登录调试器
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="true"
internalLogLevel="Trace" internalLogFile="c:\temp\nlog-internal.log" >
<targets>
<!-- log to the debugger -->
<target xsi:type="Debugger" name="debugger" layout="${logger}::${message}"/>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="debugger" />
</rules>
</nlog>
最后在我班上我有以下
public class MyClass
{
public static ILog Log;
public MyClass()
{
Log = LogManager.GetLogger(typeof(MyClass));
}
public void LogSomething()
{
Log.Debug("Starting to LogSomething");
}
}
当我调试时,我的类中的Log对象显示为ServiceStack.Logging.NullDebugLogger,我认为它是默认值,但我无法弄清楚如何将其更改为我可以使用的东西。我确定我错过了一些简单但却无法弄清楚它是什么的东西。我的Web服务是在一个不同的项目中(在同一个解决方案中),这就是我的Global.asax是VB而类是C#的原因。我也没有在web.config中引用NLog.config,但我认为Nlog无论如何都会选择它。
答案 0 :(得分:1)
日志记录的工作方式非常简单,LogManager.LogFactory只是设置一个静态属性,其中对LogManager.GetLogger(Type)
的所有后续调用将使用该具体工厂返回首选记录器实现。因此,只需在应用程序启动时发送一次,然后再调用LogManager.GetLogger()
。
LogManager.LogFactory默认为NullLogFactory
,但永远不会被ServiceStack设置,因此,如果NLogFactory
不是LogManager.GetLogger()
,那么它不能保留LogManager.GetLogger()
的唯一原因是在设置它的同一个AppDomain中检索,或者仅在调用LogManager.LogFactory = new NullLogFactory()
或某些代码将其还原回TabStore
后设置。
我的预感,因为您已经显示了C#和VB.NET代码,因为它没有在同一个Web应用程序中设置,即在App.NET中看不到您在VB.NET中设置的静态属性您的C#代码正在运行的地方。