安装配置简单
集中 收集 统一管理
实时索引
日志可视化展示
集群扩展容易
Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制, restful 风格接口,多数据源,自动搜索负载等。
Logstash 是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。
kibana 也是一个开源和免费的工具,Kibana 可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
Logstash存储搜集日志存储到Elasticsearch中,然后通过Kibana去展示。
执行yum install java安装java环境。
进入官网https://www.elastic.co/cn/downloads下载三大组件。
我下载的是logstash-2.1.1.tar.gz
tar xf logstash-2.1.1.tar.gz解压,进入logstash-2.1.1,
执行:./bin/logstash -e "input{stdin{}}output{stdout{codec=>rubydebug}}"
等待启动成功后,输入什么就会打印什么。
mkdir conf创建配置文件目录,创建test.conf,增加内容。
input{
stdin{}
}
output{
stdout{
codec=>rubydebug{}
}
}
启动Logstash并指定配置文件:
./logstash-2.1.1/bin/logstash -f conf/test.conf
nohup ./logstash-2.1.1/bin/logstash -f conf/test.conf &
查看日志:
tail -f nohup.out
安装screen
yum install screen
直接输入screen回车,在新的窗口输入命令,等待logstash启动后,Ctrl+A+D回到原先的窗口,此时ps -ef可以看到logstash已在后台运行。
screen -ls命令查看运行的终端
screen -r 24559(端口号)进入终端
终止:screen -X -S 24559 quit
修改test.conf文件
input{
file {
#监听文件的路径
path => ["/var/log/nginx/access.log"]
type => "nginx"
#监听的位置,第一行读取
start_position => "beginning"
}
}
output{
stdout{
codec => rubydebug{}
}
}
指定配置文件自动logstash,./logstash-2.1.1/bin/logstash -f ./conf/test.conf
当访问这个服务器是。nginx日志中会有记录,而此时logstash也会打印出此日志。
配置文件中的start_position => "beginning"是指在监听文件的第一行开始读取,读取到哪一行记录在/root/.sincedb_*文件中,所以第一次启动时会将所有的被监听文件的信息都打印出来,而第二次启动时,将会在记录的那一行开始读取。加入需要再次从第一行读取,就删除记录文件rm -rf /root/.sincedb_d883144359d3b4f516b37dba51fab2a2 。
start_position => "end"是指读取最后一行,并实时打印出文件更新的内容。
安装插件,在/ELK/logstash-2.1.1/bin下
./plugin install logstash-codec-multiline
./plugin install logstash-filter-multiline
配置文件
input{
# file {
# path => ["/var/log/nginx/access.log"]
# type => "nginx"
# start_position => "beginning"
#}
stdin{
codec => multiline{
#设置匹配的正则表达式
pattern => "^\["
#设置true是向前匹配,设置false向后匹配,默认是FALSE
negate => true
#设置未匹配的内容是向前合并还是先后合并,previous,next两个值选择
what => "previous"
}
}
}
output{
stdout{
codec => rubydebug{}
}
}
这一配置的效果就是打印出最后一个“[”到前一个“[”之间的数据。
官方提供的grok表达式
https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
log样本:
55.3.244.1 GET /index.html 15824 0.043
配置文件样本:
input{
file {
path => ["/ELK/2.log"]
start_position => "beginning"
}
}
filter {
grok {
match => ["message" , "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"]}
# kv {
# source => "request"
# field_split => "&"
# value_split => "="
# remove_field => ["aw"]
#}
urldecode {
all_fields => true
}
}
output{
stdout{
codec => rubydebug
}
}
执行命令:
./logstash-2.1.1/bin/logstash -f conf/grok.conf
效果:
修改nginx日志格式,将输出日志格式修改为json。
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';
# access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/access.log log_json;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
nginx重启后,访问服务器时nginx的日志为:
修改logstash配置文件
input{
file {
path => ["/var/log/nginx/access.log"]
type => "nginx"
start_position => "end"
codec => json
}
# stdin{
# codec => multiline{
# pattern => "^\["
# negate => true
# what => "previous"
#}
#}
}
output{
stdout{
codec => rubydebug{}
}
}
下载elasticsearch-2.2.1.tar.gz,解压:
tar xf elasticsearch-2.2.1.tar.gz
进入elasticsearch-2.2.1文件夹,执行./bin/elasticsearch
报错说不能用root账户运行
新建用户,并切换到该用户下
useradd elk
su - elk
切换到root给该用户赋予权限
chown elk.elk elasticsearch-2.2.1 -R
执行./bin/elasticsearch
启动成功,监听的端口是9200和9300
查看端口
netstat -anpt
说明elasticsearch正常启动。
下载kibana,解压
tar xf kibana-4.3.1-linux-x64.tar.gz
进入kibana,启动
./bin/kibana
浏览器访问5601端口
修改conf/test.conf配置
input{
file {
path => ["/var/log/nginx/access.log"]
type => "nginx"
start_position => "end"
codec => json
}
#filter {
# geoip {
# source => "remote_addr"
# fields => ["ip","city_name","country_name","location"]
#}
#}
# stdin{
# codec => multiline{
# pattern => "^\["
# negate => true
# what => "previous"
#}
#}
}
output{
# stdout{
# codec => rubydebug{}
#}
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
在/ELK/elasticsearch-2.2.1/config的elasticsearch.yml配置中可修改开放地址:
在/ELK/kibana-4.3.1-linux-x64/config的kibana.yml修改监听的elasticsearch端口
test.conf配置中的elasticsearch的hosts
这个地址,我用的是云服务器的内网地址;如果用外网地址,elasticsearch启动报错。
三个都启动之后的效果: