让JSNLog使用NLog

时间:2017-09-29 08:47:25

标签: c# asp.net nlog jsnlog

我目前正在尝试为我的ASP.Net应用程序实现类似于this的日志系统,其中Elmah用于捕获所有发生的.NET未捕获异常,并使用NLog将其记录到SQL数据库用于更轻量级的Debug()和Info()调用,这些调用也将记录到SQL Server。除此之外,我想添加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肯定是正确安装的: enter image description here

所以似乎JSNLog没有将日志传递给NLog?在这个装置中有没有我错过的东西?

2 个答案:

答案 0 :(得分: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允许您定义过滤器,因此您可以创建仅显示严重错误的过滤器。

答案 1 :(得分:2)

所以今天作为开发者的那一天,你会因为自己的愚蠢而感到谦卑。事实证明,我的问题的隐藏答案只是你必须确保用与你在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!");