Winston JSON 使用 JQ 将输出记录到 CSV 但出现 "Cannot by Csv-Formatted, only array" 错误
Winston JSON Log output to CSV using JQ but getting "Cannot by Csv-Formatted, only array" error
我有一个供应商提供的应用程序,它以 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 NCRClientOutbound.log:2075): 对象 ({"argv":["D...) 不能是 csv 格式,只能是数组
jq: error (at NCRClientOutbound.log:2076): object ({"CreateSer...) cannot be csv-formatted, only array
jq: error (at NCRClientOutbound.log:2077): object ({"lastReque...) cannot be csv-formatted, only array
jq: error (at NCRClientOutbound.log:2078): object ({"result":{...) 不能是 csv 格式,只能是 array
我正在寻找的最终结果看起来像这样(有或没有新的封装 [](最好没有)但每一行都在同一行上..作为奖励将是一个独特的行标识符。
"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
作为命令行选项。
我有一个供应商提供的应用程序,它以 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 NCRClientOutbound.log:2075): 对象 ({"argv":["D...) 不能是 csv 格式,只能是数组 jq: error (at NCRClientOutbound.log:2076): object ({"CreateSer...) cannot be csv-formatted, only array jq: error (at NCRClientOutbound.log:2077): object ({"lastReque...) cannot be csv-formatted, only array jq: error (at NCRClientOutbound.log:2078): object ({"result":{...) 不能是 csv 格式,只能是 array
我正在寻找的最终结果看起来像这样(有或没有新的封装 [](最好没有)但每一行都在同一行上..作为奖励将是一个独特的行标识符。
"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
作为命令行选项。