如何使用 NLog JsonLayout 减少异常数据属性的输出?
Posted
技术标签:
【中文标题】如何使用 NLog JsonLayout 减少异常数据属性的输出?【英文标题】:How to reduce output from Exception Data property with NLog JsonLayout? 【发布时间】:2022-01-06 13:02:15 【问题描述】:现在使用 NLog JsonLayout 来序列化异常细节,如下所示:
<target>
<layout xsi:type="JsonLayout">
<attribute name="Exception" encode="false" layout="$exception:format=@"/>
异常“数据”属性包含一些我想要截断的大字节数组。
已尝试使用 $exception:format=@:truncate=500
,但输出被剪切,因此格式被破坏。
如何在 Json 格式保持有效的情况下限制输出?
"Date": "2021-11-23T09:56:30.3214775Z",
"Application": "MyApp",
"Logger": "MyLogger",
"Level": "ERROR",
"Exception":
"Type": "Microsoft.EntityFrameworkCore.DbUpdateException",
"Entries": [
"Entity":
"Id": 0,
"SomeStuff":
"Id": 0,
"File": [
"Name": "myfile.pdf",
"Data": [
37,
80,
68,
7
【问题讨论】:
可以考虑使用truncate
这样<attribute name="A" layout="$somelayout:truncate=5000"/>
(NLog 4.6.3及更高版本支持)
太棒了,谢谢! :)
如果使用$exception:format=@
并且有一个疯狂的异常,那么您可以使用RegisterObjectTransformation
覆盖该异常类型(例如Microsoft.EntityFrameworkCore.DbUpdateException
)的反射。另见:github.com/NLog/NLog/wiki/…
啊,非常感谢! :-)
【参考方案1】:
NLog 4.7 允许您像这样覆盖特定异常类型(例如 Microsoft.EntityFrameworkCore.DbUpdateException)的反射:
LogManager.Setup().SetupSerialization(s =>
s.RegisterObjectTransformation<System.Net.WebException>(ex => new
Type = ex.GetType().ToString(),
Message = ex.Message,
StackTrace = ex.StackTrace,
Source = ex.Source,
InnerException = ex.InnerException,
Status = ex.Status,
Response = ex.Response.ToString(), // Call your custom method to render stream as string
)
);
另请参阅:https://github.com/NLog/NLog/wiki/How-to-use-structured-logging#customize-object-reflection
【讨论】:
以上是关于如何使用 NLog JsonLayout 减少异常数据属性的输出?的主要内容,如果未能解决你的问题,请参考以下文章
C#使用NLOG System.TypeInitializationException,类型初始值设定项引发异常
使用 NLog 在 ASP.NET Web API 2.1 中进行全局异常处理?