Logstash:使用curl发送日志

Gui*_*tue 3 curl logstash

我有一个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)

这项工作真的很好但是有两个小困难:

  • 忽略文件的最后一行(非空)
  • 卷曲命令永远不会停止.我必须用Ctrl + C杀死.

也许这两点是相关的,但有什么解决方案?也许多线过滤器有问题?

小智 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"看起来像一个错字.


Mar*_*arc 5

要正确支持 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)