如果没有手动换行,Logstash 无法解析 json 数据

Logstash can't parse json data without a manual newline

我有一个获取互联网历史记录的 powershell 脚本,我想将数据发送到 logstash。函数 returns 一个 PSObjects 数组,我通过管道传递给这个函数:

function ConvertTo-logstash
{

    Begin {
        $result = ""
    }
    Process {             
            $result += $_ | ConvertTo-Json -Compress -Depth 1               
            $result += "`n"
    }
    end {
    $result.replace("\","\")
    }

}

其中 returns 数据如下所示:

{"Browser":"IE10/11","Category":"internethistory","Function":"inethistory","HostIP":"172.16.100.93","HostName":"wkst-7-2","LastVisitTime":"2016-08-01T16:27:13","Title":"","URL":"res://C:\Windows\system32\mmcndmgr.dll/views.htm","User":"scrub","VisitCount":2}
{"Browser":"IE10/11","Category":"internethistory","Function":"inethistory","HostIP":"172.16.100.93","HostName":"wkst-7-2","LastVisitTime":"2016-08-02T14:33:26","Title":"","URL":"file:///C:/Users/scrub/Desktop/privEsc.ps1","User":"scrub","VisitCount":1}
{"Browser":"IE10/11","Category":"internethistory","Function":"inethistory","HostIP":"172.16.100.93","HostName":"wkst-7-2","LastVisitTime":"2016-08-15T10:24:38","Title":"","URL":"file:///C:/Users/scrub/Documents/template.pdf","User":"scrub","VisitCount":22}
...

我将此信息写入文件,然后通过套接字连接将此数据发送至 logstash。问题是 logstash 阻塞了这个数据,指出 json 无效并且索引字段 "Category" 必须是小写的,它是。当我在记事本中打开文件并在第一个条目后放置一个换行符然后发送它时,logstash 处理得很好。我尝试更改

$result += "`n"

$result += "`r`n"

因为这就是将换行符放入记事本所做的更改,但没有运气。为什么 logstash 似乎无缘无故地阻塞这些数据?

编辑:添加换行符无关紧要。只需在记事本中打开并保存而不修改它的行为似乎就可以修复错误。目前正在检查文件的二进制文件以找出差异。

重定向运算符 (>,>>) 默认为 "Unicode" 编码格式 (UTF16-LE) - 据我所知,logstash 需要输入 ASCII 或 UTF8 编码.

改用Set-ContentOut-File,两者都支持Encoding参数:

Get-InetHistory |ConvertTo-Logstash |Out-File internethistory.log -Encoding UTF8

(或者如果失败)

Get-InetHistory |ConvertTo-Logstash |Out-File internethistory.log -Encoding ASCII

检查以确保您正在收集的数据中没有任何空字节。 Logstash 不知道如何处理其中包含空字节的条目。记事本将空字节解释为空格,然后在您保存时,它将空字节替换为空格。如果这是问题所在,那么它就可以解释为什么只保存在记事本中而不修改就可以了。

干杯!