搭建ELK(Logstash+Elasticsearch+Kibana)日志分析系统

Logstash:负责日志的收集,处理和储存
Elasticsearch:负责日志检索和分析
Kibana:负责日志的可视化

1. 系统环境:

[root@monitor ~]# cat /etc/redhat-release 
CentOS release 6.6 (Final)
检测主机名
[root@monitor ~]# hostname -f
monitor
安装java
[root@monitor ~]# yum install java-1.8.0-openjdk
查看java版本
[root@monitor ~]# java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)

2. 安装logstash

yum安装

[root@monitor ~]# yum install https://download.elastic.co/logstash/logstash/packages/centos/logstash-1.5.4-1.noarch.rpm
创建证书
[root@monitor ~]# cd /etc/pki/tls
[root@monitor tls]# openssl req -subj '/CN=monitor/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
Generating a 2048 bit RSA private key
...................................................+++
...........................................................................................................+++
writing new private key to 'private/logstash-forwarder.key'
-----
同步证书到客户端
[root@monitor tls]# scp /etc/pki/tls/certs/logstash-forwarder.crt root@baicare:/etc/pki/tls/certs/
创建patterns目录,并编写nginx-grok
[root@monitor tls]# mkdir /opt/logstash/patterns
[root@monitor tls]# vim /opt/logstash/patterns/nginx
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:slb_addr} - - \[%{HTTPDATE:time_local}\] "%{WORD:method} %{URIPATH:path}(?:%{URIPARAM:param})? HTTP/%{NUMBER:httpversion}" %{INT:status} %{INT:body_bytes_sent} %{QS:http_referer} %{QS:http_user_agent} "%{IPORHOST:remote_addr}"
编辑配置文件
root@monitor tls]# vim /etc/logstash/conf.d/logstash.conf
input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
  if [type] == "nginx" {
    grok {
       match => { "message" => "%{NGINXACCESS}" }
    }
  }
}

output {
  elasticsearch { host => localhost }
  stdout { codec => rubydebug }
启动服务
[root@monitor ~]# /etc/init.d/logstash start
[root@monitor ~]# chkconfig logstash on

3. 安装elasticsearch

yum安装

[root@monitor ~]# yum install https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.1.noarch.rpm
添加到开机启动,并启动服务
[root@monitor ~]# chkconfig --add elasticsearch
[root@monitor ~]# service elasticsearch start
Starting elasticsearch:                                    [  OK  ]
[root@monitor ~]# netstat -lutnp |grep java
tcp        0      0 0.0.0.0:9300                0.0.0.0:*                   LISTEN      26898/java          
tcp        0      0 0.0.0.0:9200                0.0.0.0:*                   LISTEN      26898/java          
udp        0      0 0.0.0.0:54328               0.0.0.0:*                               26898/java          
测试是否能正常访问
[root@monitor ~]# curl -X GET http://localhost:9200
{
  "status" : 200,
  "name" : "Conquistador",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.7.1",
    "build_hash" : "b88f43fc40b0bcd7f173a1f9ee2e97816de80b19",
    "build_timestamp" : "2015-07-29T09:54:16Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

4.安装kibana

下载源码包

[root@monitor ~]# wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-linux-x64.tar.gz
解压并重命名
[root@monitor ~]# tar xf kibana-4.1.1-linux-x64.tar.gz -C /usr/local/
[root@monitor ~]# mv /usr/local/kibana-4.1.1-linux-x64 /usr/local/kibana
编写启动脚本
[root@monitor ~]# vim /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
启动服务
[root@monitor local]# chmod +x /etc/rc.d/init.d/kibana
[root@monitor local]# /etc/init.d/kibana start
Starting Kibana4 :                                         [确定]
[root@monitor local]# chkconfig kibana on

[root@monitor local]# netstat -lutnp |grep java
tcp        0      0 0.0.0.0:9300                0.0.0.0:*                   LISTEN      26898/java          
tcp        0      0 0.0.0.0:9200                0.0.0.0:*                   LISTEN      26898/java          
udp        0      0 0.0.0.0:54328               0.0.0.0:*                               26898/java   

5. 配置nginx

编辑配置文件

[root@monitor vhost]# vim kibana.conf
server {
     listen 80;
     server_name kibana.baicare.com;

     location / {
         proxy_pass http://127.0.0.1:5601;
         root /usr/local/kibana/src;
         auth_basic "Restricted";
         auth_basic_user_file /usr/local/nginx/conf/kibana.htpasswd;
     }
}
创建登录账号密码
[root@monitor geoip]# htpasswd -c /usr/local/nginx/conf/kibana.htpasswd charlie
New password: 
Re-type new password: 
Adding password for user charlie
启动服务
[root@monitor vhost]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@monitor vhost]# nginx -s reload

以上是服务器端配置,下面是客户端配置

 

6. 安装logstash-forwarder

yum安装logstash-forwarder

[root@baicare ~]# yum install -y https://download.elastic.co/logstash-forwarder/binaries/logstash-forwarder-0.4.0-1.x86_64.rpm
[root@baicare ~]# cp /etc/logstash-forwarder.conf /etc/logstash-forwarder.conf.bak

编辑配置

{
“network”: {
“servers”: [ “monitor:5000” ],

"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt",

"timeout": 15

},

“files”: [
{
“paths”: [
“/var/log/messages”,
“/var/log/secure”
],
“fields”: { “type”: “syslog” }
}, {
“paths”: [
“/home/wwwlogs/access_nginx.log”
],
“fields”: { “type”: “nginx” }
}
]
}
启动服务

[root@baicare src]# /etc/init.d/logstash-forwarder start
logstash-forwarder started

然后打开浏览器,访问服务器(域名解析提前做好)

7. 配置索引模式

 

参考文章:

ELKstack 中文指南 - http://kibana.logstash.es/
三斗室 - http://chenlinux.com/
elastic - https://www.elastic.co/guide
LTMP索引 - http://wsgzao.github.io/index/#LTMP

 

坚持原创技术分享,您的支持将鼓励我继续创作!