2015-09-11 63 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