如何使用 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这样&lt;attribute name="A" layout="$somelayout:truncate=5000"/&gt;(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 中进行全局异常处理?

使用 NLog 记录时修改异常数据

为啥 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息

NLog LogException 似乎忽略了异常

解析 nlog.config 时出现 NLog 异常 - 找不到目标:'EventLog'