【问题标题】:Configuring NLog with ServiceStack to not be NullDebugLogger使用 ServiceStack 将 NLog 配置为不是 NullDebugLogger
【发布时间】:2015-09-11 10:51:14
【问题描述】:

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

【问题讨论】:

    标签: servicestack nlog


    【解决方案1】:

    日志记录的工作方式非常简单,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 中不可见.

    【讨论】:

    • 谢谢 Mythz 我去看看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多