logstash之input插件
标准输入
input{
stdin{
add_field => {"key" => "value"}
codec => "plain"
tags => ["add"]
type => "std"
}
}
output{
stdout{
codec => rubydebug{}
}
elasticsearch{
hosts=>["127.0.0.1"]
}
}
文件输入
input{
file{
path => ["/home/wuyong/elk/logs/test1.log", "/home/wuyong/elk/logs/test2.log"]
type => "system"
start_position => "beginning"
}
}
output{
stdout{
codec => rubydebug{}
}
elasticsearch{
hosts=>["127.0.0.1"]
}
}
其它配置:
- discover_interval: logstash每隔多久检测一次被监听的path下是否有新文件,默认15s
- exclude: 不想被监听的文件列表
sincedb_path: 定义sincedb配置的路径,默认路径如下:
sincedb_write_interval,每个多久写一次sincedb文件,默认15s
- stat_interval, 没隔多久检测一次被监听文件状态(是否有更新),默认1s
- start_position: 从什么位置读取文件数据,默认结束位置,如果需导数据,则设置成beginning,从开始位置读取; 仅在该文件从未被监听过才有效,因为sincedb文件记录了该文件的inode,会从记录过的pos开始读,需要重复读取一个日志,可以删除sincedb文件或定义sincedb_path为/dev/null
- close_older: 一个已经监听中的文件,超过这个值的时间内没更新内容,就关闭监听它的文件句柄,默认3600s
- ingore_older: 每次检测文件列表的时候,如果一个文件的自后修改时间超过该值,就忽略这文件,默认86400s即1天
path
- path不支持
path => "/path/to/%{+yyyy/MM/dd/hh}.log"
格式, 只能写成
path => "/path/to/*/*/*/*.log" 或
path => "/path/to/**/*.log" , **缩写表示递归全部子目录
TCP输入
- 适用于临时任务,尤其是测试环境,因为logstash本身只能在SizeQueue中缓存20个事件,所以生产环境中最好换用其他消息队列
input{
tcp{
port => 8888
mode => "server"
ssl_enable => false
}
}
output{
stdout{
codec => rubydebug{}
}
elasticsearch{
hosts=>["127.0.0.1"]
}
}
./logstash/logstash-5.6.3/bin/logstash -f logstash.conf 执行,另一终端tcp输入数据
nc 127.0.0.1 8888 < test1.log
输入:
输出:
syslog输入
- syslog是一种标准的协议,分为客户端和服务器端,客户端是产生日志消息的一方,而服务器端负责接收客户端发送来的日志消息,并做出保存到特定的日志文件中或者其他方式的处理,rsyslog 是syslog 的升级版
服务器端
- 使用的一个虚拟机,ip: 192.168.237.129
- log收集服务器中logstash配置
input{
syslog{
port => "5514"
}
}
output{
stdout{
codec => rubydebug{}
}
elasticsearch{
hosts=>["127.0.0.1"]
}
}
- 启动
./logstash/logstash-5.6.3/bin/logstash -f logstash.conf
- 查看启动端口情况,证明已经启动
ss -ntlp
客户端
- 客户机配置, 这里是使用另外一个虚拟机, ip: 192.168.237.130
- 配置syslog发送服务器地址
vim /etc/rsyslog.conf
加入:
*.* @@192.168.237.129:5514
- 重启rsyslog,观察服务器logstash日志情况
/etc/init.d/rsyslog restart
- 日志从logstash中输出
http_poller抓取
- logstash可以作为数据采集客户端,去像指定地址请求数据
服务端
- 本例子使用flask搭建简单的server来实现,因为flask确实够轻量够简单
from flask import Flask
app = Flask(__name__)
from flask import jsonify
@app.route("/hello")
def hello():
return jsonify({"field": "Hello World!"})
@app.route("/bye")
def bye():
return jsonify({"field": "bye!!!"})
if __name__ == "__main__":
app.run(debug = True)
启动, python app.py
测试
logstash客户端
- 每一分钟请求一次,配置如下
input {
http_poller {
urls => {
test1 => {
method => get
url => "http://127.0.0.1:5000/hello"
headers => {
Accept => "application/json"
}
}
test2 => {
method => get
url => "http://127.0.0.1:5000/bye"
headers => {
Accept => "application/json"
}
}
}
request_timeout => 60
schedule => {cron => "* * * * * UTC" }
codec => "json"
metadata_target => "http_poller_metadata"
}
}
output{
stdout{
codec => rubydebug{}
}
elasticsearch{
hosts=>["127.0.0.1"]
}
}
请求顺序可以通过test_数字类似这样的hash顺序来作为hash的key
- 启动
./logstash/logstash-5.6.3/bin/logstash -f logstash.conf
- 查看结果, 每隔一分钟会有如下输出