Logstash:使用curl发送日志

时间:2014-12-24 08:53:33

标签: curl logstash

我有一台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
    }
}

这项工作非常好有两点困难:

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

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

3 个答案:

答案 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"
    }
}