使用 NLog 获取 JSNLog 日志

Getting JSNLog to log with NLog

我目前正在尝试为我的 ASP.Net 应用程序实现一个类似于 this where Elmah is used to catch all of the .NET Uncaught Exceptions that happen and log them to a SQL Database, with NLog being used for the more lightweight Debug() and Info() calls that will also be logged to a SQL Server. In addition to this I wanted to add JSNLog 的日志系统,这样我就可以将我所有的 Javascript Debug/Info/Errors 等发送到 NLog也存储在 SQL 数据库中。

我已经通过 NuGet 包安装了 Elmah,并对我的 web.config

进行了必要的更改
<elmah>
  <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ErrorLog"/>
  <security allowRemoteAccess="false" />
</elmah>

<connectionStrings>
  <add
    name="ErrorLog"
    connectionString="ConnectionStringGoesHere"
    providerName="System.Data.SqlClient" />
</connectionStrings>

而且我可以确认 Elmah 正确地登录到我的 SQL 数据库。

我还安装了 NLogNLog.Config NuGet 包,并向 NLog.config 文件添加了两个节点

<targets>  
    <!-- database target -->
    <target name="database" 
            xsi:type="Database"
            connectionStringName="NLog"
            commandText="exec dbo.InsertLog
                            @level,
                            @callSite,
                            @type,
                            @message,
                            @stackTrace,
                            @innerException,
                            @additionalInfo">
            <parameter name="@level" layout="${level}" />
            <parameter name="@callSite" layout="${callsite}" />
            <parameter name="@type" layout="${exception:format=type}" />
            <parameter name="@message" layout="${exception:format=message}" />
            <parameter name="@stackTrace" layout="${exception:format=stackTrace}" />
            <parameter name="@innerException" 
                        layout="${exception:format=:innerFormat=ShortType,Message,Method:MaxInnerExceptionLevel=1:InnerExceptionSeparator=}" />
            <parameter name="@additionalInfo" layout="${message}" />
    </target>
</targets>

<rules>
    <!-- database logger -->
    <logger levels="Error,Warn,Fatal" name="databaseLogger" writeTo="database"/>
</rules>

这也在我的 .NET 应用程序中进行了测试,它正确地记录到 SQL 数据库。

现在进入 JSNLog。我已经安装了 JSNLog.NLog NuGet 包并按照安装说明将 <%= JSNLog.JavascriptLogging.Configure() %> 添加到我的 .ASPX 页面。

但是,如果我从我的 ASPX 页面调用 JL().info("Testing From JS");,或者即使我调用一个不存在的函数产生错误,我也看不到应该发送到存储在 NLog 中的日志我的 SQL 数据库。当我将它添加到我的控制台时,JSNLog 肯定安装正确:

看来 JSNLog 并没有将日志传递给 NLog?我在这个安装中遗漏了什么吗?

我是 JSNLog 的作者。我在 JSNLog github 问题页面上看到了同样的问题,我在其中写了一个答案。

因为这种情况(根据严重性记录到 2 个日志包)并不常见,所以我没有尝试解决这个问题。

不过我可以提供这些建议:

  • 编写一个 Common.Logging 适配器,根据严重性写入 NLog 和 Elmah,详见我在 github 问题页面上的回答。

  • 将所有内容记录到 NLog,并使用 NLog 目标将所有异常发送到 Elmah。在这种情况下,您将安装 JSNLog.NLog 以将客户端条目记录到 NLog: https://github.com/NLog/NLog.Elmah

  • 如果您使用 Elmah 的内置日志查看器,您可能需要考虑切换到 Serilog 和 Seq。这允许您将所有日志发送到一个日志包。 Seq 允许您定义过滤器,因此您可以创建仅显示严重错误的过滤器。

所以今天是作为开发人员的那些日子之一,您会为自己的愚蠢感到谦卑。事实证明,我的问题的隐藏答案很简单,就是您必须确保使用与您在 NLog.config.

中创建的 NLog 记录器完全相同的名称调用 JSNLog

例如,我的 NLog 记录器被称为 databaseLogger

<rules>
    <!-- database logger -->
    <logger levels="Error,Warn,Fatal" name="databaseLogger" writeTo="database"/>
</rules>

所以当我从 JSNLog 登录时,我需要确保调用

JL("databaseLogger").error("This is an error!");