首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于NLog的JSNLog自定义目标

用于NLog的JSNLog自定义目标
EN

Stack Overflow用户
提问于 2017-10-06 14:32:22
回答 1查看 633关注 0票数 1

我目前正在开发一个应用程序,它使用NLog进行.NET日志记录,并使用JSNLog将日志从Javascript发送到NLog进行日志记录。这些日志存储在SQL数据库中。

StackTrace有几个用于NLog的列,例如Message、StackTrace、InnerException和AdditionalInfo。但是,当我从JSNLog中记录一些东西时,如下所示

代码语言:javascript
复制
window.onerror = function (errorMsg, url, lineNumber, column, errorObj) {
    JL("databaseLogger").fatalException({
        "msg": "Uncaught Exception",
        "errorMsg": errorMsg, "url": url,
        "line number": lineNumber, "column": column
    }, errorObj);

    return false;
}

NLog简单地将其解释为一个简单的字符串日志,而不是错误,因此它只是将这个巨大的JSON字符串添加到AdditionalInfo列中,并将消息、StackTrace和InnerException列保留为空白。这使得读取日志更加困难。

我希望能够解析JSNLog调用发送的JSON,并将其发送到适当的NLog变量,即:

代码语言:javascript
复制
JL("databaseLogger").fatalException({
    "Message": "Uncaught Exception",
    "InnerException": errorMsg,
}, errorObj);

将导致消息和InnerException列包含在JSON中发送的数据。解析不是一个问题,因为我知道如何做到这一点,但我不知道如何拦截对NLog的调用,以便在将JSON正确发送到NLog之前解析JSON。

我已经研究过编写一个似乎并不困难的自定义NLog目标,但我不知道如何将解析的JSON正确地传递给Nlog?

编辑#1:@Julian更新的NLog.config是我的新NLog.config,但是来自新Write函数的日志不会传递给database目标。

代码语言:javascript
复制
<targets>
    <target xsi:type="ParseJsonWrapper"
        name="JSONParser">
      <target name="database"
         xsi:type="Database"
         connectionStringName="ErrorLog"
         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>
    </target>
  </targets>

  <rules>
    <logger levels="Trace,Info,Debug,Error,Warn,Fatal" name="JSLogger" writeTo="JSONParser"/>
  </rules>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-06 16:25:56

在本例中,创建TargetWrapper是一个很好的解决方案,这样您就可以将它与其他目标结合起来。

配置如下所示:

代码语言:javascript
复制
  <target xsi:type="ParseJsonWrapper"
          name="myWrapper">
    <target xsi:type="File" ...target properties... />
  </target>

这需要的代码:从WrapperTargetBase继承并重写Write。例如:

代码语言:javascript
复制
using System;
using NLog.Common;
/// <summary>
/// Limits the number of messages written per timespan to the wrapped target.
/// </summary>
[Target("ParseJsonWrapper", IsWrapper = true)]
public class ParseJsonWrapper : WrapperTargetBase
{
    protected override void Write(AsyncLogEventInfo logEvent)
    {
        var json = logEvent.LogEvent.Message;
        // parse json

        // update log event
        logEvent.LogEvent.Exception = new Exception("something");

        // write to wrapped target
        WrappedTarget.WriteAsyncLogEvent(logEvent)
    }
}

不要忘记注册包装器(请看这里),并更新配置以写入包装器,而不是包装目标。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46608127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档