给定以下配置:
input {
udp {
type=> "genericJson2"
port => 9994
}
}
filter{
if [type] == "genericJson2" {
json {
source => "message"
}
}
}
output {
elasticsearch{
}
}
以下输入:
{"date":"2018-02-27T13:21:41.3387552-05:00","level":"INFO","appname":"listenercore","logger":"Main","thread":"1","message":"test"}
我得到以下结果:
{
"_index": "logstash-2018.02.27",
"_type": "doc",
"_id": "AWHYfh_qDl_9h030IXjC",
"_score": 1,
"_source": {
"type": "genericJson2",
"@timestamp": "2018-02-27T18:19:59.747Z",
"host": "10.120.4.5",
"@version": "1",
"date": "{\"date\":\"2018-02-27T13:20:02.2113",
"message": "{\"da",
"logger": "{\"da",
"thread": "{",
"level": "{\"da",
"appname": "{\"date\":\"201"
},
"fields": {
"@timestamp": [
"2018-02-27T18:19:59.747Z"
]
}
}
我需要做什么才能正确解析json日志?
编辑
我挖得更深一点。
从cmd行运行此命令
sudo bin/logstash -e "input{stdin{type=>stdin}} filter{json {source=>message}} output{ stdout{ codec=>rubydebug } }"
产生所需输出
{
"@timestamp" => 2018-02-28T02:07:01.710Z,
"host" => "Elastisearch01",
"appname" => "listenercore",
"logger" => "Main",
"@version" => "1",
"type" => "stdin",
"date" => "2018-02-27T13:21:41.3387552-05:00",
"level" => "INFO",
"thread" => "1",
"message" => "test"
}
因此,我编写了一个快速的python udp服务器,以查看网络上出现的内容,下面是我捕获的内容:
{ " d a t e " : " 2 0 1 8 - 0 2 - 2 7 T 2 1 : 0 6 : 0 4 . 7 4 6 1 3 4 6 - 0 5 : 0 0 " , " l e v e l " : " I N F O " , " a p p n a m e " : " l i s t e n e r c o r e " , " l o g g e r " : " M a i n " , " t h r e a d " : " 1 " , m e s s a g e " : " t e s t " }
每个字符之间都有额外的空格,我正在研究文本编码,但我还不确定。
编辑
这是一个编码问题。如果我使用此python脚本捕获、解码和重新传输日志,则可以解决问题:
import socket
UDP_IP_ADDRESS = "10.254.18.166"
UDP_PORT_NO = 9993
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))
clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
data, addr = serverSock.recvfrom(1024)
clientSock.sendto(data.decode('utf-16'), ("127.0.0.1", 9994))
如何让logstash达到我的UTF-16输入?
我试过这个,但不起作用:
bin/logstash -e "input{udp{port=>9994 type=>stdin codec=>plain{charset=>'UTF-16'}}} filter{json {source=>message}} output{ stdout{ codec=>rubydebug } }"