使用JQ将Winston JSON日志输出到CSV,但出现“无法通过Csv格式化,仅数组”错误

时间:2018-08-07 14:32:54

标签: json jq winston

我有一个供应商提供的应用程序,它以JSON格式输出Node.JS Winston日志,我正尝试将其输出为单行CSV格式。

有许多不同类型的数组类型,我已经使用“ JQ”利用成功地从每个元素中剔除了我想要的元素。

原始内容如下:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>
        <select class="category">
          <option value="low">Low</option>
          <option value="mid">Mid</option>
          <option value="high">High</option>
        </select>
      </td>
      <td>
        <select class="details">
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
          <option value="5">5</option>
          <option value="6">6</option>
        </select>
      </td>
    </tr>
    <tr>
      <td>
        <select class="category">
          <option value="low">Low</option>
          <option value="mid">Mid</option>
          <option value="high">High</option>
        </select>
      </td>
      <td>
        <select class="details">
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
          <option value="5">5</option>
          <option value="6">6</option>
        </select>
      </td>
    </tr>
  </tbody>
</table>

输出当前与我现有的命令字符串(减去@csv)类似,

{"result":{"TransactionID":"ac710dc0-8aa4-11e8-a08c-0d98209bb4f5","TimeStamp":"2018-07-18T12:07:33.082-04:00","SourceSystem":"SOUP","Status":"Accepted"},"level":"info","message":"SOAP createServiceRequest ack recieved & is successful.","timestamp":"2018-07-18T16:07:33.047Z"}

我在SE上阅读了很多有关输出到CSV的文章,这似乎相对简单,但是我始终会遇到错误。

[
  "2018-07-18T16:07:33.047Z",
  "info",
  "SOAP createServiceRequest ack recieved & is successful.",
  "ac710dc0-8aa4-11e8-a08c-0d98209bb4f5",
  "2018-07-18T12:07:33.082-04:00",
  "Accepted"
]

尽管上面提供了@csv,但无论我如何缩小包含的字段,我都会收到类似以下的错误。它只是移动了错误。

tail -200 ClientOutbound.log | jq-win64.exe --raw-output "[.timestamp, .level, .message, .result .TransactionID, .result .TimeStamp, .result .Status|tostring|@csv]"

和数组外部的@csv会产生类似的错误,但具有不同的详细信息,但甚至不会解析JSON。

jq: error (at <stdin>:199): string ("2018-07-18...) cannot be csv-formatted, only array

例如,从哪种类型的数组开始:

 c:\Nodejs\Logs> jq-win64.exe --raw-output @csv ClientOutbound.log "[.level, .message, .result .TransactionID, .result .TimeStamp, .result .Status]"

jq:错误(在NCRClientOutbound.log:2075处):对象({“ argv”:[“ D ...)不能采用csv格式,只能是数组 jq:错误(在NCRClientOutbound.log:2076处):对象({“ CreateSer ...)不能为CSV格式,只能为数组 jq:错误(在NCRClientOutbound.log:2077处):对象({“ lastReque ...)不能为CSV格式,只能为数组 jq:错误(在NCRClientOutbound.log:2078处):对象({“ result”:{...)不能采用CSV格式,只能是数组

我要寻找的最终结果是这样的东西(带有或不带有新的封装[](最好不带有),但每一行都在同一行上。此外,奖励是唯一的行标识符。

jq: error (at NCRClientOutbound.log:2074): object ({"level":"i...) cannot be csv-formatted, only array

我该怎么做才能克服错误并获得所需的输出?

1 个答案:

答案 0 :(得分:1)

要添加行号,可以使用以下帮助函数:

def tocsv(s):
  foreach s as $line (0; .+1; [.] + $line)
  | map(tostring) # for robustness
  | @csv ;

然后:

tocsv(inputs
      | [.timestamp, .level, .message]
        + ( .result | [.TransactionID, .TimeStamp, .Status] ))

这假设您的jq具有inputs,并且您包含-n作为命令行选项。