C# JSNLog的NLog自定义目标
我目前正在开发一个应用程序,它使用NLog进行.NET日志记录,并使用JSNLog将日志从Javascript发送到NLog进行日志记录。这些日志存储在SQL数据库中 SQL数据库有几个NLog列,如Message、StackTrace、InnerException和AdditionalInfo。但是当我从JSNLog中记录一些东西时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(
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属性是一种选择吗?看见