温斯顿 JSON 日志使用 JQ 输出到 CSV,但收到"Cannot by Csv-Formatted, only array"错误



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

有许多不同类型的数组类型,我已经使用"JQ"利用成功地从每个元素中取出我想要的元素。

原始内容如下所示:

{"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"}

输出当前与我现有的命令字符串(减去@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"
]

我在SE上阅读了许多关于输出到CSV的帖子,这似乎相对简单,但我总是收到错误。

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

尽管存在上述@csv,但无论我如何缩小所包含的字段范围,我都会收到如下错误......它只是移动错误。

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

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

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

例如,从什么类型的数组:

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

jq: error (at NCRClientOutbound.log:2075(: object ({"argv":["D...( 不能是 csv 格式的,只能是数组 jq: error (at NCRClientOutbound.log:2076(: object ({"CreateSer...(不能是 CSV 格式的,只能是数组 jq: error (at NCRClientOutbound.log:2077(: object ({"lastReque...(不能是 CSV 格式的,只能是数组 jq: error (at NCRClientOutbound.log:2078(: object ({"result":{...( 不能是 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"

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

要添加行号,以下帮助程序函数将是一个不错的方法:

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作为命令行选项包含在内。

相关内容

最新更新