ELK日志收集系统搭建
目录
ELK,也就是Elasticsearch、Logstash、Kibana三者的结合,是一套开源的分布式日志管理方案。
简介
Elasticsearch:负责日志存储、检索和分析
LogStash:负责日志的收集、处理
Kibana:负责日志的可视化
java8
logstash和elasticsearch均依赖java,所以安装这两个之前,我们应该先安装好java,java version大于7,然而官方推荐最好是java 8.
安装:
$sudo add-apt-repository -y ppa:webupd8team/java $sudo apt-get update $sudo apt-get -y install oracle-java8-installer
Elasticsearch
我们以elasticsearch目前的版本1.7为例,参看官方教程:https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html,在官方网站上下载了elasticsearch的压缩包,解压到某个目录后执行即可。
当然,在Ubuntu下,我们可以用apt-get的方式安装:
下载并安装公钥:
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
添加源:
echo "deb http://packages.elastic.co/elasticsearch/1.7/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-1.7.list
安装:
$sudo apt-get update $sudo apt-get install elasticsearch
设置开机启动:
$sudo update-rc.d elasticsearch defaults 95 10
配置:修改 network.host: localhost
$sudo vim /etc/elasticsearch/elasticsearch.yml
启动:elasticsearch启动后,即绑定在了localhost:9200端口上
$sudo service elasticsearch start
常用命令:
# 查看elasticsearch健康状态 $curl localhost:9200/_cat/health?v # 查看elasticsearch indices $curl localhost:9200/_cat/indices?v # 删除指定的indices,这里删除了logstash-2015.09.26的indices $curl -XDELETE localhost:9200/logstash-2015.09.26
Kibana
从官方下载最新的压缩包:https://www.elastic.co/guide/en/kibana/current/setup.html,解压到任意目录
$tar xvf kibana-*.tar.gz $sudo mkdir -p /opt/kibana $sudo cp -R ~/kibana-4*/* /opt/kibana/ # 将kibana作为一个服务 $cd /etc/init.d && sudo wget https://gist.githubusercontent.com/thisismitch/8b15ac909aed214ad04a/raw/bce61d85643c2dcdfbc2728c55a41dab444dca20/kibana4 $sudo chmod +x /etc/init.d/kibana4 # 将kibana设为开机启动 $sudo update-rc.d kibana4 defaults 96 9 # 修改kibana配置,因为我们采用nginx作为反向代理,修改 host: "localhsot" $sudo vim /opt/kibana/config/kibana.yml # 启动kibana,默认绑定在了localhost:5601 $sudo service kibana4 start
Nginx配置:
# elk server { listen 80; server_name elk.chenjiehua.me; #auth_basic "Restricted Access"; #auth_basic_user_file /home/ubuntu/htpasswd.users; location / { proxy_pass http://localhost:5601; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
如果需要限制访问权限,我们可以通过nginx的auth_basic进行设置:
$sudo apt-get install apache2-utils # 新建一个kibana认证用户 $sudo htpasswd -c /home/ubuntu/htpasswd.users kibana # 然后按提示设置kibana密码 $sudo nginx -t $sudo nginx -s reload
Logstash
安装:
参考官方教程:https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html。
在Ubuntu下,我们可以用apt-get的方式来安装:
$sudo wget -qO - https://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add - $sudo echo "deb http://packages.elasticsearch.org/logstash/1.5/debian stable main" | sudo tee -a /etc/apt/sources.list# $sudo apt-get update $sudo apt-get install logstash
在这里,logstash具有两个身份角色,一个是shipper,一个是indexer;当应用在分布式的系统中时,一般是多个shipper将日志收集然后发送到redis(作为broker身份),而indexer则从redis中读取数据进行处理,然后再发送给elasticsearch,而我们则可以通过kibana查看到所有的日志信息。
这里的broker采用的是redis作为消息系统,根据业务需要,我们也可以采用kafka等其他消息系统。
中心logstash(indexer)配置, /etc/logstash/conf.d/central.conf
input { redis { host => "127.0.0.1" port => 6379 type => "redis-input" data_type => "list" key => "key_count" } } output { stdout {} elasticsearch { cluster => "elasticsearch" codec => "json" protocol => "http" } }
远程logstash(shipper)配置,/etc/logstash/conf.d/shipper.conf
input { file { type => "type_count" path => ["/data/logs/count/stdout.log", "/data/logs/count/stderr.log"] exclude => ["*.gz", "access.log"] } } output { stdout {} redis { host => "20.8.40.49" port => 6379 data_type => "list" key => "key_count" } }
在这里,因为我们是在单台服务器上进行操作的,所以我们可以将indexer和shipper合并在一起,省去其中的redis。配置文件如下:
input { file { type => "blog" path => ["/home/ubuntu/log/nginx/blog.log"] } } output { stdout {} elasticsearch { cluster => "elasticsearch" codec => "json" host => "localhost" protocol => "http" } }
对于logstash,我们有许多插件可以使用,其中比较常用的有filter部分的grok插件。假如我们要对nginx的日志进行处理,获取其中的各个字段信息,我们可以参看如下用法:
nginx的日志格式:
log_format main '$remote_addr - $remote_user [$time_local]' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" $request_time'; access_log /var/log/nginx/access.log main;
Logstash中filter的配置:
filter { grok { match => { 'message' => '%{IP:remote_addr} - - \[%{HTTPDATE:time_local}\]"%{WORD:http_method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:status} %{NUMBER:body_bytes_sent} (?:\"(?:%{URI:http_referer}|-)\"|%{QS:http_referer}) %{QS:http_user_agent} %{NUMBER:request_time}' } remove_field => ["message"] } date { match => ["time_local", "dd/MMM/YYYY:HH:mm:ss Z"] } }
关于grokdebugger,可以使用在线调试http://grokdebug.herokuapp.com/。当grok中的配置与日志格式不匹配时,在Kibana管理后台可以看到_grokparsefailure.
启动logstash:
$sudo service logstash start
我们就可以在kibana中看到日志的数据了,同时也可以非常方便的进行搜索等。
参考:
https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html
评论