【问题标题】:Getting JSNLog to log with NLog让 JSNLog 使用 NLog 进行日志记录
【发布时间】:2017-09-29 08:47:24
【问题描述】:

我目前正在尝试为我的 ASP.Net 应用程序实现一个类似于this 的日志记录系统,其中 Elmah 用于捕获所有发生的 .NET 未捕获异常并将它们记录到 SQL 数据库,使用 NLog对于也将记录到 SQL Server 的更轻量级的 Debug() 和 Info() 调用。除此之外,我还想添加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.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 包并将&lt;%= JSNLog.JavascriptLogging.Configure() %&gt; 添加到我的.ASPX 页面。

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

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

【问题讨论】:

    标签: c# asp.net nlog jsnlog


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的评论,然后我可能会考虑编写一个 Common.Logging 适配器。老实说,我只是真正使用 Elmah 来捕获我的代码中可能发生的未捕获异常,因为它开箱即用地支持这一点。
    • 这听起来像是一个奇怪的问题,但您最近测试过 JSNLog.Nlog NuGet 包吗?我决定删除所有 Elmah/NLog/JSNLog NuGet 包,并分别使用 Elmah 和 NLog 测试 JSNLog。如果我安装 Elmah NuGet 包并将其配置为记录到 SQL 数据库,然后安装 JSNLog.Elmah 包,我可以将 JS 错误记录到我的 SQL 数据库。但是,如果我全新安装 NLog,将其设置为记录到我的 SQL 数据库,然后安装 JSNLog.NLog 包,它不会记录到我的 SQL 数据库。也许 JSNLog.NLog 包有问题?
    • @ConorWatson 所有 JSNLog 包在发布前都会自动进行测试,包括 JSNLog.NLog。这使用所有包的最新版本,包括 Common.Logging NLog 适配器。最后一次发布是一个月前。如果您发现某些东西停止工作并且可以重现它,请在github.com/mperdeck/jsnlog/issues 报告
    • 我只是个白痴,并意识到我在 JSNLog 调用中缺少 NLog 目标名称,请参阅下面的答案。
    【解决方案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!");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多