我目前正在尝试为我的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数据库。
我还安装了NLog
和NLog.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?在这个装置中有没有我错过的东西?
答案 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!");