我有一台ELK服务器来管理我的日志。通常他们会自动发送。一切正常。 但由于某种原因,有时我们需要发送一个日志文件。
我想这样做:
curl -F "file=@<my_file_path>" http://<ELK_server_host>:5001
这个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
}
}
这项工作非常好但有两点困难:
也许这两点有关,但有什么解决方案?也许多线过滤器有问题吗?
答案 0 :(得分:5)
第1部分:
如果没有更多信息,很难回答这个问题。但是我希望你的日志文件的最后一行不以换行符结尾? logstash输入编解码器“line”正在每行末尾寻找换行符。
在Windows中添加一个:
echo. >> path\to\your_log_file
第2部分:
cURL用于与HTTP服务器通信。 Logstash输入“tcp”不是HTTP服务器,并且不会发送cURL在上载结束时期望的HTTP响应。
最好使用像Netcat这样的工具来通过TCP发送数据。
<强> P.S 强>
“UFT-8”看起来像是一个错字。
答案 1 :(得分:0)
我想如果你使用logger命令,它会更好,因为它可以让你更好地控制你发送的内容:
logger -t your_tag -p "local1.info" --file /path/to/file --server <ELK_server_host> --tcp --port 5001
答案 2 :(得分:0)
要正确支持HTTP,您需要在input {...}
部分中添加以下过滤器:
http {
port => "5050"
codec => "json"
}
然后,您可以像从tomcat访问日志中的一行一样将JSON文档发布到端口5050。
{
"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"
}
}