ELK安装调试查询

来自技术开发小组内部wiki
跳转至: 导航搜索

ELK介绍

引用一个台湾兄弟的话
Easy: Even CEO can use it 
Fast: Must be interactive 
Export: Provide the csv file 
Big: Must be scalable 
80-­‐20: Solves 80% problems
ELK Stack 是 Elasticsearch、Logstash、Kibana 三个开源软件的组合。

ELK Stac可以用于实时日志处理,数据分析等领域,目前了解该领域应该是开源界的第一选择。
处理方式灵活。Elasticsearch 是实时全文索引,不需要像 storm 那样预先编程才能使用;

配置简易上手。Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 设计,都是目前业界最通用的配置语法设计;
检索性能高效。虽然每次查询都是实时计算,但是优秀的设计和实现基本可以达到全天数据查询的秒级响应;
集群线性扩展。不管是 Elasticsearch 集群还是 Logstash 集群都是可以线性扩展的;
前端操作炫丽。Kibana 界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板。

kibana查询说明

这里仅对kibana 的查询和使用做个简单说明,kibana 更强悍的功能等待你去发现~


进入kibana http://192.168.28.206:5601/app/kibana 之后 第一次会提示
Index name or pattern
Patterns allow you to define dynamic index names using * as a wildcard. Example: logstash-*
普通使用 就输入logstash-* ,复杂点可以 logstash-test-*, logstash-225-* [可以指定多个index,如果有需要] 点击discover 进入搜索页面

输入* 点击搜索按钮 可以查看所有数据
输入request_time:>2 点击搜索可以查看今天访问速度大于2 的web页面
输入clientip:"192.168.30.211" 点击搜索可以看到这个ip用户的行为
输入host:'api.fumubang.net' 可以统计某个域名 的请求数量
输入host:'api.fumubang.net' && request_time:>2 统计某个域名 下请求时间大于2 的数据。

附kibana 查询方法 字段

也可以按页面左侧显示的字段搜索 限定字段全文搜索:field:value 精确搜索:关键字加上双引号 filed:"value" http.code:404 搜索http状态码为404的文档

字段本身是否存在 _exists_:http:返回结果中需要有http字段 _missing_:http:不能含有http字段

通配符

? 匹配单个字符

  • 匹配0到多个字符

kiba?a, el*search

? * 不能用作第一个字符,例如:?text *text 正则

es支持部分正则功能 mesg:/mes{2}ages?/

模糊搜索

~:在一个单词后面加上~启用模糊搜索

first~ 也能匹配到 frist

还可以指定需要多少相似度 cromm~0.3 会匹配到 from 和 chrome 数值范围0.0 ~ 1.0,默认0.5,越大越接近搜索的原始值

近似搜索

在短语后面加上~ "select where"~3 表示 select 和 where 中间隔着3个单词以内

范围搜索

数值和时间类型的字段可以对某一范围进行查询 length:[100 TO 200] date:{"now-6h" TO "now"} [ ] 表示端点数值包含在范围内,{ } 表示端点数值不包含在范围内

逻辑操作

AND OR

+:搜索结果中必须包含此项 -:不能含有此项 +apache -jakarta test:结果中必须存在apache,不能有jakarta,test可有可无

分组

(jakarta OR apache) AND jakarta

字段分组

title:(+return +"pink panther")

转义特殊字符

+ - && || ! () {} [] ^" ~ * ? : \ 以上字符当作值搜索的时候需要用\转义

安装

  1. 安装jdk 1.7+
yum install java-1.7.0-openjdk 
  1. 安装elasticsearch
wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.2.1/elasticsearch-2.2.1.rpm 
yum install elasticsearch-2.2.1.rpm -y

  1. 安装logstash
wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-2.2.2-1.noarch.rpm && yum install logstash-2.2.2-1.noarch.rpm -y --nogpgcheck
  1. 安装kibana
wget https://download.elastic.co/kibana/kibana/kibana-4.4.2-linux-x64.tar.gz ; 
tar zvxf kibana-4.4.2-linux-x64.tar.gz ;
mv kibana-4.4.2-linux-x64 /usr/local/kibana

vi /etc/rc.d/init.d/kibana 

#!/bin/bash
### BEGIN INIT INFO
# Provides: kibana
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Runs kibana daemon
# Description: Runs the kibana daemon as a non-root user
### END INIT INFO

# Process name
NAME=kibana
DESC="Kibana4"
PROG="/etc/init.d/kibana"

# Configure location of Kibana bin
KIBANA_BIN=/usr/local/kibana/bin

# PID Info
PID_FOLDER=/var/run/kibana/
PID_FILE=/var/run/kibana/$NAME.pid
LOCK_FILE=/var/lock/subsys/$NAME
PATH=/bin:/usr/bin:/sbin:/usr/sbin:$KIBANA_BIN
DAEMON=$KIBANA_BIN/$NAME

# Configure User to run daemon process
DAEMON_USER=root
# Configure logging location
KIBANA_LOG=/var/log/kibana.log

# Begin Script
RETVAL=0

if [ `id -u` -ne 0 ]; then
 echo "You need root privileges to run this script"
 exit 1
fi

# Function library
. /etc/init.d/functions
 
start() {
 echo -n "Starting $DESC : "

pid=`pidofproc -p $PID_FILE kibana`
 if [ -n "$pid" ] ; then
 echo "Already running."
 exit 0
 else
 # Start Daemon
if [ ! -d "$PID_FOLDER" ] ; then
 mkdir $PID_FOLDER
 fi
daemon --user=$DAEMON_USER --pidfile=$PID_FILE $DAEMON 1>"$KIBANA_LOG" 2>&1 &
 sleep 2
 pidofproc node > $PID_FILE
 RETVAL=$?
 [[ $? -eq 0 ]] && success || failure
echo
 [ $RETVAL = 0 ] && touch $LOCK_FILE
 return $RETVAL
 fi
}

reload()
{
 echo "Reload command is not implemented for this service."
 return $RETVAL
}

stop() {
 echo -n "Stopping $DESC : "
 killproc -p $PID_FILE $DAEMON
 RETVAL=$?
echo
 [ $RETVAL = 0 ] && rm -f $PID_FILE $LOCK_FILE
}
 
case "$1" in
 start)
 start
;;
 stop)
 stop
 ;;
 status)
 status -p $PID_FILE $DAEMON
 RETVAL=$?
 ;;
 restart)
 stop
 start
 ;;
 reload)
reload
;;
 *)
# Invalid Arguments, print the following message.
 echo "Usage: $0 {start|stop|status|restart}" >&2
exit 2
 ;;
esac


配置

<1>elasticsearch

配置文件路径 :
vi /etc/elasticsearch/elasticsearch.yml
1取消network.host 注释 并设置一个IP地址 
 network.host: 192.168.28.206
2 端口:
 http.port: 9200
3 索引存储位置
 path.data: /home/fumubang/elasticsearch
4 日志存储位置
 path.logs: /home/fumubang/elasticsearch/logs

<2>logstash on elk

vi /etc/logstash/conf.d/nginx_acces.conf
input {
 redis {
 host => '127.0.0.1'
 # password=>''                     #如果打算设定redis密码
 data_type => 'list'
 port => "6379"
 key => 'logstash:nginx-dev-225:access_log'  #日志存储
 type => 'nginx'
 }
}
output {
 elasticsearch {
 hosts => ["192.168.28.206:9200"]
 index => "logstash-nginx-test-%{+YYYY.MM.dd}"
 workers => 1                                 # 增大workers 可以加快读取队列的速度
 flush_size => 100                           #每次最大存100
 idle_flush_time => 10                     #十秒更新一次  flush_size 、idle_flush_time 任意一个满足条件就刷新 高并发情况下需要注意设定
 template_overwrite => true
 }
}

<3>logstash on nginx

## 客户机
## 注意pattens 文件夹yum安装没有 源码安装可以有 192.168.28.225 /usr/local/logstash-1.4.2有 没有请从源码安装或直接复制
##vi /opt/logstash/pattens/nginx
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent} %{QS:other}

vii /etc/logstash/conf.d/nginx_acces.conf
input {
    file {
        path => [ "/usr/local/nginx/logs/host.access.log" ] nginx 文件地址 可以有多个 
        start_position => "beginning"   # 删除~/.sincedb_* 可以重新插入日志不删除表示默认从之前的地方加载输出
    }
}

filter {
    mutate { replace => { "type" => "nginx_access" } }    
    grok {
        match => { "message" => "%{NGINXACCESS}" }   #pattens设定的 
    }
    kv {
          prefix => ""
          field_split => "&"
          exclude_keys => ["\"no","no"]  #取消和需要删除的字段
         source => "other"
    }
    urldecode {
        all_fields => true               #转换url cookie 中的编码
   }
 date {
        match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
}
output {
    redis {
        host => "192.168.28.206"     #redis 服务器地址缓冲日志 
        data_type => "list"
        key => "logstash:nginx-dev-225:access_log" #redis key
    }
    #stdout { codec => rubydebug }    #调试时使用
}

启动相关服务

<1>启动elasticsearch

service elasticsearch start

<2>启动logostash

 logstash on elk
 service logostash start 
 logostash on nginx
 nohup logstash agent -f /etc/logstash/conf.d/nginx.conf >/dev/null 2>&1

<3>启动kibana

service kibana start