我有一个ELK服务器来管理我的日志.通常他们会自动发送.一切正常.但出于某种原因,有时我们需要发送一个日志文件.
我想这样做:
curl -F "file=@<my_file_path>" http://<ELK_server_host>:5001
Run Code Online (Sandbox Code Playgroud)
这个conf(在这里有用的部分)在服务器端:
input {
...
tcp {
port => 5001
type => "curl"
codec => line { charset => "UFT-8" }
}
.....
}
filter {
.....
if "curl" == [type] {
multiline {
pattern => "^%{TIMESTAMP_ISO8601}"
negate => true
what => previous
}
grok {.....}
date {.....}
}
.....
}
output {
stdout { codec => rubydebug }
elasticsearch {
host => localhost
}
}
Run Code Online (Sandbox Code Playgroud)
这项工作真的很好但是有两个小困难:
也许这两点是相关的,但有什么解决方案?也许多线过滤器有问题?
小智 6
第1部分:
没有更多信息,很难回答这个问题.但是我希望你的日志文件的最后一行不以换行符结尾?logstash输入编解码器"line"正在每行末尾寻找换行符.
要在Windows中添加一个:
echo. >> path\to\your_log_file
Run Code Online (Sandbox Code Playgroud)
第2部分:
cURL用于与HTTP服务器通信.Logstash输入"tcp"不是HTTP服务器,并且不会在上载结束时发送cURL期望的HTTP响应.
你最好使用像Netcat这样的工具来通过TCP发送数据.
PS
"UFT-8"看起来像一个错字.
要正确支持 HTTP,您需要将以下过滤器添加到您的input {...}部分:
http {
port => "5050"
codec => "json"
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将 JSON 文档发布到端口 5050,就像 Tomcat 访问日志中的一行一样。
{
"message": "[20/Feb/2019:14:31:22 +0100] 10.3.249.128 - 200 \"GET /my/path/foo/bar HTTP/1.1\" 0 0 -",
"fields": {
"source": "access",
"system": "dev"
}
}
Run Code Online (Sandbox Code Playgroud)