【问题标题】:How to setup NLog to show sqlexception linenumber in log?如何设置 NLog 以在日志中显示 sqlexception 行号?
【发布时间】:2018-08-07 13:21:16
【问题描述】:

我有一个可以产生错误的存储过程。 但是,NLog 只写这样的文本消息

16:08:37.7139|ERROR|ConsoleApplication35.Program|System.Data.SqlClient.SqlException (0x80131904): 将表达式转换为数据的算术溢出错误 输入整数。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action`1 wrapCloseInAction)

但是SqlException 也有一个LineNumber 属性

如何强制 NLog 也写入行号? 有预定义的布局吗?

【问题讨论】:

  • 发布您调用 nlog 的代码。

标签: .net sql-server nlog


【解决方案1】:

选项 1

您可以使用格式@ (NLog 4.5+)

${exception:format=@}

docs

format - 输出的格式。必须是以逗号分隔的异常属性列表:Message、Type、ShortType、ToString、Method、StackTrace、Data & @。此参数值不区分大小写。默认值:消息

@ 表示将所有异常属性序列化为 Json 格式。在 NLog 4.5 中引入

注意:使用“toString”格式时也可以使用:

${exception:format=ToString}

选项 2

如果您需要对输出进行更多控制,例如只有行号,您可以编写自己的布局渲染器(继承自ExceptionLayoutRenderer):

 private class MyExceptionLayoutRenderer : ExceptionLayoutRenderer {

     protected override void Append(StringBuilder builder, LogEventInfo logEvent)
     {
         base.Append(builder, logEvent);

         // Also write linenumber (C# 7 syntax) at the end.
         if (logEvent.Exception is SqlException sqlException)
         {
             builder.AppendLine($"LineNumber: " + sqlException.LineNumber);
         }
     }
  
 }

并尽快注册(例如app_start、main()):

LayoutRenderer.Register<MyExceptionLayoutRenderer>("myException"); //usage ${myException}

选项 3

NLog 4.6.8 引入了新的格式选项Properties

${exception:format=Message,Properties}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2016-07-30
    • 2014-06-01
    • 2011-05-12
    相关资源
    最近更新 更多