使用NLog记录对象时的额外引号

时间:2019-04-15 09:57:55

标签: c# nlog string-interpolation

我有一个代码,可使用NLog将内插字符串输出到日志。

这是一个例子

_logger.LogDebug($"REQUEST {webRequest.RequestUri}", Id)
WebResponse webResponse = await _httpService.SendRequestAsync(webRequest);
var response = ParseResponse(webResponse);
_logger.LogDebug($"RESPONSE {(int)response.StatusCode} {JsonConvert.SerializeObject(response.Body)}", Id);

在此示例中,在调用函数 _logger.LogDebug 的第一种情况下,我得到了预期的结果:

2019-04-15 09:27:24.5027 DEBUG e1701b07-d228-4543-a320-3cb1b7f2e4b0 REQUEST http://url/

但是在第二种情况下,预期结果会用其他引号引起来。

2019-04-15 09:27:57.2907 DEBUG "e1701b07-d228-4543-a320-3cb1b7f2e4b0 RESPONSE 200 [{...},{...}]"

这是 _logger.LogDebug 方法

using NLog;

private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();

public void LogDebug(string message, Guid id)
{
    Logger.Debug($"{id.ToString()} {message}");
}

JsonConvert.SerializeObject(response.Body)的结果是json数组的字符串表示形式,例如:[{"key":"value","key":"value"},{"key":"value","key":"value"}]

这是我Nlog.config的一部分

  <targets>

    <target name="csv" xsi:type="File" fileName="${shortdate}-${level}-services.log">
      <layout xsi:type="CSVLayout" delimiter="Tab" withHeader="false">
        <column name="time" layout="${longdate}" />
        <column name="level" layout="${uppercase:${level}}"/>
        <column name="message" layout="${message}" />
      </layout>
    </target>

  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="csv" />
  </rules>

为什么在第二种情况下我会得到额外的报价,如何避免呢?

1 个答案:

答案 0 :(得分:1)

根据the docs

  

CSV选项引用-列的默认引用模式。

     

默认:自动

     

可能的值:

     

自动-仅引用其值包含引号,分隔符或换行符(慢)的

     

全部-引用所有列。对于已知为多行的数据(例如Exception-ToString

)很有用      

(快速)不执行-不执行任何操作(非常快)

默认值为Auto-这意味着它引用您的字符串,因为它包含引号,制表符(分隔符)或换行符。

执行此操作很重要,这样该文件才是有效的CSV文件(否则Excel等不知道列数据的开始和结束位置。