使用 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 中可见
我是 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 中可见