0

我目前正在尝试为我的 ASP.Net 应用程序实现一个与此类似的日志记录系统,其中 Elmah 用于捕获发生的所有 .NET 未捕获异常并将它们记录到 SQL 数据库中,而 NLog 用于更轻量级的调试() 和 Info() 调用也将记录到 SQL Server。除此之外,我还想添加JSNLog,以便我可以将我所有的 Javascript 调试/信息/错误等发送到 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.ConfigNuGet 包,并在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.NLogNuGet 包并添加<%= JSNLog.JavascriptLogging.Configure() %>到我的 .ASPX 页面。

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

所以看起来 JSNLog 没有将日志传递到 NLog 上?我在这个安装中有什么遗漏的吗?

4

2 回答 2

2

所以今天是作为开发人员的日子之一,你会为自己的愚蠢感到谦卑。事实证明,我的问题的隐藏答案很简单,就是您必须确保调用 JSNLog 时使用的名称与您在 NLog.config 中创建的 NLog 记录器的名称完全相同。

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

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

所以当我从 JSNLog 登录时,我需要确保我打电话

JL("databaseLogger").error("This is an error!");
于 2017-10-06T10:32:11.643 回答
2

我是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 允许您定义过滤器,因此您可以创建仅显示严重错误的过滤器。

于 2017-09-30T09:11:01.737 回答