代码之家  ›  专栏  ›  技术社区  ›  CRSouser

使用jq将winston json日志输出到csv,但得到“cannot by csv formatted,only array”错误

  •  0
  • CRSouser  · 技术社区  · 6 年前

    我有一个供应商提供的应用程序,它以JSON格式输出node.js winston日志,我正尝试将其输出为单行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:\Nodejs\Logs> 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 ncclientoutbound.log:2075):对象(“argv”:[”d…)不能是csv格式的,只有数组 jq:error(at ncclientoutbound.log:2076):对象(“createser…”)不能是csv格式的,只能是数组 jq:error(at ncclientoutbound.log:2077):对象(“lastreque…”)不能是csv格式的,只能是数组 jq:error(at ncclientoutbound.log:2078):对象(“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"
    

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   peak    6 年前

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

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