LogStash实操
简单的从本地输入,输出到本地
logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
从本地输入,输出到es
logstash -e 'input{stdin{}} output {elasticsearch{hosts=>["hadoop111:9200"]}}'
##会在es根据时间生成一个索引库名称为logstash-xx-xx 每天只会自动生成一个索引库,就是根据时间命名的
##生成的索引库中type为logs,字段的id是自动生成的,message是采集的每一条日志的信息
实际应用中,都是将logstash三大组件写到一个文件中去执行
- 如下面两个例子
使用logstash采集日志文件中的数据到kafka集群
- 创建一个配置文件,写入如下ruby代码
input {
file {
codec => plain {
charset => "UTF-8"
}
#指定从某个文件读取数据 也可以指定某个目录下的所有文件 支持通配符 /xxx/*/*.txt
path => "/test/logstashData/*"
#指定每隔几秒检测一次目录或文件下的数据变动
discover_interval => 5
#指定以哪种方式作为检测数据的方式进行更新,有两种beginning,end一般项目中用的都是end
#end方式当有数据变化,会每次读取新增的数据(不包括修改的数据)
#beginning方式当有数据变化,会每次读取所有的数据,会造成数据重复
start_position => "end"
}
}
output {
kafka {
#在kafka中可以没有这个主题,在向kafka写入数据时,会创建分区数为1,副本为1的当前主题
topic_id => "gamelogs-prj"
codec => plain {
format => "%{message}"
charset => "UTF-8"
}
##指定kafka集群的broker,我这里是单节点
bootstrap_servers => "hadoop111:9092"
}
}
- 执行 ./bin/logstash -f ./xxx.conf
- 向指定的目录中导入数据文件,会发现kafka多了一个gamlogs-prj主题,并且从beginning正常消费数据
从kafka集群中使用logstash采集数据输送到es集群中
input {
kafka {
#当从多个kafka中消费时,需要指定不同的client-id,随便写,不同就行
#client_id => "logstash-1-1"
#这个type名称可以随意写,主要是为了后面过滤与输出用,可以定位到当前kafka主题中
type => "gamelogs-prj"
# earliest (真实项目中,此种方式是首选)
#当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
#latest
#当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
#none
#topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
auto_offset_reset => "earliest"
codec => "plain"
#指定当前消费者所在的消费者组
group_id => "elas-prj"
#指定要消费的主题
topics => "gamelogs-prj"
#指定kafka集群的broker,我这里是单节点
bootstrap_servers => "hadoop111:9092"
}
}
filter {
if [type] == "gamelogs-prj" {
mutate {
#将获取的每一条日志按照|切分
split => { "message" => "|" }
add_field => {
#指定所形成的的索引库中字段的名称以及value
"event_type" => "%{message[0]}"
"current_time" => "%{message[1]}"
"user_ip" => "%{message[2]}"
"user" => "%{message[3]}"
}
#将message字段移除,数据我已经切分了,整条消息我这里就不需要了
remove_field => [ "message" ]
}
}
}
output {
if [type] == "gamelogs-prj" {
elasticsearch {
##指定索引库的名称
index => "gamelogs-prj"
codec => plain {
charset => "UTF-16BE"
}
#指定es集群的节点,我这里是单点
hosts => ["hadoop111:9200"]
}
}
}
- 执行 ./bin/logstash -f ./xxx.conf
- 会发现es集群中增加了一个gamlogs-prj的索引库,并且数据也已经写进去了