logstash 收集日志到hdfs
前言
通常情况下,我们将日志数据通过logstash收集到es,然后用kibana进行实时查询,可视化分析,这就是我们常用的elk架构。但是基于elk的日志分析,通常比较常用的是实时分析,日志存储一段时间就会删掉。那么在一些情况下,我需要将日志数据也存储一份到hdfs用来做大数据分析,这部分日志的存储时间会比存在es中久很多。
运维一般收集日志到hdfs经常会使用两种工具,一种是flume,一种是logstash,本文介绍logstash如何收集日志到hdfs。
logstash hdfs插件安装
logstash如果想收集日志到hdfs需要安装hdfs插件,官方安装命令如下
../bin/logstash-plugin install logstash-output-webhdfs
如果安装不成功或者直接卡着不动了,原因可能是防火墙挡掉了logstash默认的gem源,这个时候可以尝试换成淘宝的源
$ cd /opt/service/logstash/ $ vim Gemfile #source "https://rubygems.org" source https://ruby.taobao.org/
如果更换完源还是不行,就需要自己手动安装了
- 去https://github.com/logstash-plugins/logstash-output-webhdfs下载zip包
- 解压到本地某个目录
- 在logstash目录下的Gemfile文件中,进行如下修改
gem "logstash-output-webhdfs" 改为 gem "logstash-output-webhdfs", :path => "/root/logstash-output-webhdfs/"
- 配置文件修改完成,继续执行如下命令安装插件即可
../bin/logstash-plugin install logstash-output-webhdfs
配置文件设置
注意:logstash启动用户需要有配置文件中webhdfs段path参数目录的写入权限
input{
file{
path=>["/opt/log/data.log"]
start_position=>"beginning"
codec=>"json"
#不处理120天以前的数据,默认为一天
ignore_older => "10368000"
sincedb_path => "/opt/service/logstash-2.3.4/test_sincedb"
}
}
output{
elasticsearch{
hosts=>["192.168.201.7:9200","192.168.201.5:9200","192.168.201.6:9200"]
index=>"test_log-%{+YYYY-MM}"
}
webhdfs {
workers => 2
host => "192.168.201.4" # namenode节点
port => "50070" # webhdfs端口
user => "hdfs" #以这个用户的权限去写hdfs
path => "/test_logstash/logstash-%{+YYYY}-%{+MM}-%{+dd}.log" # 按天创建log
codec => "json"
}
}
结果验证
logstash启动之后,只要有日志进入,就可以在hdfs的相应目录看到写入的文件,且此文件是按照logstash配置的规则按天生成
[hdfs@task1-sandbox ~]$ hdfs dfs -ls /test_logstash Found 1 items -rw-r--r-- 1 hdfs hadoop 392222 2018-07-17 19:42 /test_logstash/logstash-2018-07-17.log