使用 ServiceStack 配置 NLog 使其不是 NullDebugLogger

Configuring NLog with ServiceStack to not be NullDebugLogger

我是 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>

最后在我的 class 中有以下内容

public class MyClass
    {
        public static ILog Log;

        public MyClass()
            {
                Log = LogManager.GetLogger(typeof(MyClass));
             }

        public void LogSomething()
            {
                Log.Debug("Starting to LogSomething");
             }
      }

当我调试时,class 中的日志对象显示为 ServiceStack.Logging.NullDebugLogger,我认为这是默认设置,但我不知道如何将其更改为我可以使用的内容。我确定我遗漏了一些简单的东西,但无法弄清楚它是什么。我的 Web 服务在不同的项目中(在同一个解决方案中),这就是为什么我的 Global.asax 是 VB 而 class 是 C# 的原因。我在 web.config 中也没有提到 NLog.config 但我认为 Nlog 无论如何都会选择它。

日志记录的工作方式非常简单,LogManager.LogFactory 只需设置一个静态 属性,其中对 LogManager.GetLogger(Type) 的所有后续调用都将使用该具体工厂来 return 首选记录器实现。因此,它只需要在对 LogManager.GetLogger() 的任何调用之前在应用程序启动时发送一次。

LogManager.LogFactory 默认为 NullLogFactory 但永远不会被 ServiceStack 设置,所以它不会保留 NLogFactory 的唯一原因是如果 LogManager.GetLogger() 不是在设置它的同一个 AppDomain 中检索,或者它仅在调用 LogManager.GetLogger() 之后设置,或者您的某些代码将其恢复为 LogManager.LogFactory = new NullLogFactory().

自从您展示了 C# 和 VB.NET 代码以来,我的直觉是它们没有在同一个 Web 应用程序中设置,即您在 VB.NET 中设置的静态 属性 不是在您的 C# 代码为 运行.

的 AppDomain 中可见