2015-09-11 73 views
0

我是NLog的新手,已经选择将它添加到我的ServiceStack(4.0.44)Web服务中,但它不能正常工作,因为我总是以NullDebugLogger结束。配置带有ServiceStack的NLog不是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

日志工作的方式非常简单,LogManager.LogFactory只是设置一个静态属性,其中所有后续调用LogManager.GetLogger(Type)将使用该具体工厂来返回首选日志记录实现。因此只需在应用程序启动时发送一次,然后再致电LogManager.GetLogger()

LogManager.LogFactory默认为NullLogFactory,但从来没有得到由ServiceStack设置,那么为什么它不会保留的唯一原因NLogFactory是,如果LogManager.GetLogger()未在它被设置在同一AppDomain中检索到,或者它只是被设置在调用LogManager.GetLogger()之后,或者您的某些代码正在将其恢复为LogManager.LogFactory = new NullLogFactory()

因为你已经显示C#和VB.NET代码,我的预感是它没有被设置在同一个Web应用程序中,也就是说你在VB.NET中设置的静态属性在你的C#代码所在的AppDomain中是不可见的运行。

+0

谢谢Mythz我会看看那个 – Steve