如何设置NLog在日志中显示sqlexception行号?

时间:2018-08-07 13:21:17

标签: .net sql-server nlog

我有一个存储过程,可能会产生错误。 但是,NLog只写这样的短信

  

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

但是SqlException也具有LineNumber属性

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

1 个答案:

答案 0 :(得分:0)

选项1

您可以使用for index,match in df.iterrows(): for name, shots in {'home_team_name':'home_team_shots', 'away_team_name':'away_team_shots'}: if match[name] not in teams_shots: #we have to setup an entry in the dictionary teams_shots[name]=[] teams_shots[name].append(match[shots]) home_shots_avg.append(None) else: home_shots_avg.append(np.mean(teams_shots[name])) (NLog 4.5+)格式

@

请参见docs

  

format-输出格式。必须是用逗号分隔的异常属性列表:消息,类型,ShortType,ToString,方法,StackTrace,数据和${exception:format=Message,@} 。此参数值不区分大小写。默认:消息

     

@意味着将所有Exception-properties序列化为Json格式。在NLog 4.5中引入

注释:使用“ toString”格式时,它也可能可用:

@

选项2

如果您需要更多控制输出,例如仅行号,就可以编写自己的布局渲染器(继承自${exception:format=ToString} ):

ExceptionLayoutRenderer

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

 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);
         }
     }

 }