Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSNLog的NLog自定义目标_C#_Logging_Nlog - Fatal编程技术网

C# JSNLog的NLog自定义目标

C# JSNLog的NLog自定义目标,c#,logging,nlog,C#,Logging,Nlog,我目前正在开发一个应用程序,它使用NLog进行.NET日志记录,并使用JSNLog将日志从Javascript发送到NLog进行日志记录。这些日志存储在SQL数据库中 SQL数据库有几个NLog列,如Message、StackTrace、InnerException和AdditionalInfo。但是当我从JSNLog中记录一些东西时 window.onerror = function (errorMsg, url, lineNumber, column, errorObj) { JL(

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

SQL数据库有几个NLog列,如Message、StackTrace、InnerException和AdditionalInfo。但是当我从JSNLog中记录一些东西时

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列,并将Message、StackTrace和InnerException列留空。这使得读取日志更加困难

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

JL("databaseLogger").fatalException({
    "Message": "Uncaught Exception",
    "InnerException": errorMsg,
}, errorObj);
将导致包含JSON中发送的数据的Message和InnerException列。解析不是问题,因为我知道如何做到这一点,但我不确定如何拦截对NLog的调用,以便在将JSON正确发送到NLog之前解析它

我研究过如何编写一个似乎并不难的JSON,但我不知道如何将解析后的JSON正确地传递给Nlog


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

<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>

在这种情况下,创建TargetTrapper是一个很好的解决方案,这样您就可以将它与其他目标结合起来

配置将如下所示:


此操作所需的代码:从
WrapperTargetBase
继承并重写
Write
。e、 g

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)
    }
}
使用系统;
使用NLog.Common;
/// 
///限制每个时间跨度写入包装目标的消息数。
/// 
[目标(“ParseJsonWrapper”,IsWrapper=true)]
公共类ParseJsonWrapper:WrapperTargetBase
{
受保护的重写无效写入(AsyncLogEventInfo logEvent)
{
var json=logEvent.logEvent.Message;
//解析json
//更新日志事件
logEvent.logEvent.Exception=新异常(“某物”);
//写入包装的目标
WrappedTarget.WriteAsynClogeEvent(logEvent)
}
}

不要忘记注册包装器()并更新配置以写入包装器而不是包装目标

谢谢你的回答!我已经注册了我的包装器,我可以看到消息被传递到我的自定义
Write
函数,但是一旦我更改
LogEvent.Exception
以使用JSON中的数据,
Write
函数就结束了,新的日志永远不会传递到
Wrapper
中的
目标。我有什么遗漏吗?我已经更新了OP以包含我的新
NLog.config
.oops,从示例中剥离了太多内容。您需要调用
WrappedTarget.WriteAsynClogeEvent(logEvent)
,我已经更新了示例作为一个工作示例,请参见此处:非常好,更新的示例非常有效!不过我还有几个问题。我可以通过编写自定义异常类来更改
异常类型
,但我不确定如何设置
调用站点
堆栈跟踪
变量。我注意到有一个
SetStackTrace
函数,但它只接受一个.NET StackTrace参数,我的堆栈来自Javascript字符串。我希望能够将
CallSite
设置为字符串。谢谢NLog属性是一种选择吗?看见