0

我遇到了 JSNlog 和 Nlog 的问题,其中包含来自 JSNlog 的格式化异常。我将所有错误日志都写为 JSON,但是当我从 javascript 抛出异常时,系统将 %message 属性编码为 JSON,同时导致外部 JSON 无效。

我对这个 appender 的 Nlog.config 文件的配置是:

layout='{"Enviroment":"${aspnet-application:variable=Enviroment}","CreatedOn": "${longdate:universalTime=true}", "WindowsIdentity":"${aspnet-user-identity:jsonEncode=true}","Application":"${AppName}", "Level":"${level}", ${message}}' />

我对 JSNlog 的 web.config 的配置是:

serverSideMessageFormat=""UserAgent": "%userAgent", "SessionId": "%requestId", "URL":"%url", "UserAddress": "%userHostAddress", "Message": "%message""

当我使用此配置运行时,它适用于所有正常的 fatal/error/warn/info/debug/trace 调用,但在使用以下 JSON 的任何 fatalException 调用时它会因 JSON 无效而失败:

{"Enviroment":"Dev", "CreatedOn": "2014-09-24 23:58:42.1734", "WindowsIdentity":"XXXr","Application":"LoggingTest", "Level":"Fatal", "UserAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36", "SessionId": "befn1iy4mlxqowppwepf104z", "URL":"/LoggingTest/jsnlog.logger", "UserAddress": "10.247.224.202", "Message": "{"stack":"TypeError: undefined is not a function\n    at Log (http://zue-v-86a32393.vpc-am.aws.shell-cloud.com/LoggingTest/:58:16)\n    at HTMLInputElement.onclick (http:/XXXX/LoggingTest/:66:141)","message":"undefined is not a function","name":"TypeError","logData":"JS Fatal Exception"}"}

我已经尝试删除消息周围的引号,然后它对于 fatalException 调用工作正常,但对于任何其他日志记录调用都不是有效的 JSON,因为它缺少引号。

有谁知道如何解决这个问题或格式化来自 fatalException 调用的异常?

4

1 回答 1

1

我是JSNLog的作者。

该问题是由 JSNLog 中的缺陷引起的。在客户端上记录对象时,它会作为 JSON 字符串发送,例如 { "x": 44 }。请注意,这包含引号。但是当你记录一个简单的字符串时,它会作为一个简单的字符串发送,不带引号,字符串中的任何引号都不会被转义——这意味着它与 JSON 对象不兼容。

在日志条目是简单字符串而不是 JSON 对象的大多数情况下,这很有效。但是当你想记录一个有效的 JSON 对象时,它就不能很好地工作了。

我没有尝试过,但我假设如果您使用原始设置并在客户端上记录一个包含引号的字符串,您将得到与使用 fatalException 时相同的错误。

我决定通过引入一个新属性 %jsonmessage 来解决这个问题,它可以正确地引用和转义字符串。然后,您将在用于使 fatalException 工作的配置中使用该属性。

我将通过对此答案的评论向您发布信息。

于 2014-09-27T02:53:29.437 回答