使用ServiceStack配置NLog不是NullDebugLogger

时间:2015-09-11 10:51:15

标签: servicestack nlog

我是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无论如何都会选择它。

1 个答案:

答案 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#代码正在运行的地方。