centos7下ELK结合Redis项目搭建日志平台

 
系统:centos7

jdk:1.8

yum install java -y

Logstash:日志收集

ElasticSearch:日志存储与搜索

Kibana:日志展示

我画了个草图,通常的架构图如下:AppServer 发送日志给Logstash服务器收集,ElasticSearch服务器负责日志的查询和存储,Kibana负责日志的展示

centos7下ELK + Redis结合项目搭建日志平台

1. Logstash的安装,官网链接:https://www.elastic.co/downloads/logstash#ga-release,也可以直接执行:wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.tar.gz,目前最新版本6.0.0

(1)wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.tar.gz下载安装包

(2)tar -xzvf logstash-6.0.0.tar.gz解压

解压后是没有logstash的配置文件的,需要手动创建一个,上面截图的logstash.conf就是我手动创建的,为了测试,只是配置了简单的标准输入和标准输出,内容如下:

input {
     stdin { }
}
output {
     stdout {
        codec => rubydebug {}
     }
}

(3) 尝试启动logstash并验证是否配置成功,在logstash的解压目录下执行命令:./bin/logstash -f logstash.conf,出现如下截图表明配置成功,从启动信息中也能看出日志路径,端口等信息

centos7下ELK + Redis结合项目搭建日志平台

在交互里随便输入测试hello world,看看输出吧

2.ElasticSearch安装,官网链接:https://www.elastic.co/downloads/elasticsearch,截止目前最新版本5.6.3

(1) wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.tar.gz

(2) tar -xzvfelasticsearch-5.6.3.tar.gz解压

(3) 进入到elasticsearch的安装目录的config下,修改配置: vi elasticsearch.yml

path.data修改为自己本机的data路径,自定义(这个路径如果不存在的话需要手动去创建)

path,logs修改为自己本机的logs路径,也是自定义吧(这个路径如果不存在的话,启动elasticsearch会自动创建)

network.host修改为安装服务器地址

http.port为http访问端口,默认是9200,我这里给的9201

centos7下ELK + Redis结合项目搭建日志平台

分别给上面设置的data和logs设置用户权限

chown -R elsearch:elsearch data/es/

chown -R elsearch:elsearch logs/es/

(4)运行elasticsearch:./bin/elasticsearch,如果直接用root身份去运行,会报如下错误:

centos7下ELK + Redis结合项目搭建日志平台

elasticsearch默认是不能用root去启动的,这是出于系统安全考虑设置的条件,所以为elasticsearch创建一个用户组和用户吧

创建elseaerch用户组及用户:

groupadd elsearch

useradd elsearch -g elsearch -p elasticsearch

更改elasticsearch文件夹及内部文件的所属用户及组为elsearch:elsearch:

chown -R elsearch:elsearch elasticsearch-5.6.3

切换用户elsearch:

su elsearch

启动elasticsearch:./bin/elasticsearch

启动过程中有可能报如下错误

centos7下ELK + Redis结合项目搭建日志平台

切换到root用户编辑limit.conf文件

vi /etc/security/limits.conf

在文件末尾添加

elsearch soft nofile 65536

elsearch hard nofile 65536

注意:elsearch为所创建的用户名称,创建的是什么就写什么

centos7下ELK + Redis结合项目搭建日志平台

然后再切换到elsearch用户启动,看到如下信息说明启动成功

centos7下ELK + Redis结合项目搭建日志平台

在浏览器中方位地址http://192.168.212.37:9201,192.168.212.37和9201都是上面elasticsearch.yml中配置的host和port,会出先如下界面说明启动成功

centos7下ELK + Redis结合项目搭建日志平台

3.完成logstash和elasticsearch的安装后,就该开始集成他们俩了,回到logstash的配置文件logstash.conf,修改配置如下:输入还是标准输入,输出增添一个elasticsearch,hosts配置elasticsearch的地址和端口:

input {
 stdin { }
}
output {
 elasticsearch {
 hosts => "192.168.212.37:9201"
 index => "logstash-test"
 }
 stdout {
 codec => rubydebug {}
 }
}
再次启动logstash,并输入测试字符串:hello world
在启动logstash过程中检查并连接output端elasticsearch,输入测试字符串后,访问elasticsearch的api:http://192.168.212.37:9201/logstash-test/_search(logstash-test是logstash.conf中配置的索引index),可以看到如下:刚才输入的hello已经在elasticsearch中可以查看到了

至此,logstash和elasticsearch集成完成,不过通过elasticsearch原生api去查询还是不方便和直观,ok,下面查询工具kibana闪亮登场了。

4.下载kibana

(1)wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.3-linux-x86_64.tar.gz

(2)tar -xzvf kibana-5.6.3-linux-x86_64.tar.gz 解压

(3)进入kibana的解压目录的config目录下,编辑kibana.yml,server.port:5601放开,server.host修改为kibana的安装服务器,配置elasticsearch的路径端口

centos7下ELK + Redis结合项目搭建日志平台

(4)启动kibana: ./bin/kibana

centos7下ELK + Redis结合项目搭建日志平台

浏览器中访问:http://192.168.212.37:5601,出现如下界面表示启动成功

centos7下ELK + Redis结合项目搭建日志平台

再在logstash的交互中输入:Hello kaka,you are the best

centos7下ELK + Redis结合项目搭建日志平台

然后再kibana的discover中指定的index里查询kaka关键字,如下:日志是不是很优雅的展示出来了

centos7下ELK + Redis结合项目搭建日志平台

OK,ELK的集成到此结束。

5.安装redis

(1)安装redis(省略,安装很简单)

(2)进入redis的解压目录,编辑reids.conf配置文件,修改如下三个地方:

bind IP:绑定安装服务器的ip地址

protected-mode:修改为no,否则redis只有本机才能访问

port:修改为自己的端口,默认是6379

centos7下ELK + Redis结合项目搭建日志平台

(3)启动redis

执行./src/redis-server redis.conf ,如果提示需要增加文件句柄数,可以使用名利ulimit -n 10032临时增大,10032是redis建议的大小。

centos7下ELK + Redis结合项目搭建日志平台

6.logstash集成redis,先看架构图

下面的架构图中,redis相当于变成了logstash的输入端,而不是appserver,为什么要这样做的,是为了防止一瞬间突然有大量日志到logstash端防止雪崩,相当于给APPserver和logstash间加了一个管道。

centos7下ELK + Redis结合项目搭建日志平台

(1)编辑logstash的logstash.conf文件,输入端修改为redis

input {
        redis {
                data_type => "list"
                type => "redis-input"
                key => "logstash:redis"
                host => "192.168.212.37"
                port => 6379
                threads => 5
                codec => "json"
        }
}
output {
        elasticsearch {
                hosts => "192.168.212.37:9201"
                index => "logstash-test"
        }
        stdout {
                codec => rubydebug {}
        }
}

(2)重新启动logstash,可以看到已经连接上了输入端redis

centos7下ELK + Redis结合项目搭建日志平台

logstash和redis的集成已经完成。

7.redis和java项目中log4j的集成

通过上面的配置,基本上已经实现了上面架构图的大部分功能,最后需要的就是项目中的日志如何输入到redis中呢,且看下面配置。

为了简单起见,我直接在spring官网创建一个springboot的web项目,地址http://start.spring.io/,快速构建一个可运行的spring mvc框架出来(spring boot已经集成了log4j等一系列,无需再去配置),只是为了测试日志,项目结构很简单,如下:

centos7下ELK + Redis结合项目搭建日志平台

主要代码讲解:

先看pom的配置

因为要和redis结合,添加如下dependency

贴上pom配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.a</groupId>
    <artifactId>elk_logback</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.cwbase</groupId>
            <artifactId>logback-redis-appender</artifactId>
            <version>1.1.5</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

springboot默认已经集成了logback,,如果需要覆盖,在resources下创建自己的logback.xml配置文件,如下:

其中host为redis安装服务器,key为logstash.conf中配置的key

centos7下ELK + Redis结合项目搭建日志平台

logback,xml配置:

贴上logback.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <Target>System.out</Target>
        <encoder>
            <pattern>[%d{HH:mm:ss}][%t][%p][%c]-%m%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
    </appender>
   <appender name="LOGSTASH" class="com.cwbase.logback.RedisAppender">
        <source>logstashdemo</source>
        <type>dev</type>
        <host>192.168.212.37</host>
        <key>logstash</key>
        <tags>dev</tags>
        <mdc>true</mdc>
        <location>true</location>
        <callerStackIndex>0</callerStackIndex>
    </appender>

    <root level="error">
        <appender-ref ref="Console"/>
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>
HelloController很简单,打印测试日志:
package com.kaka.controller;

import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@EnableAutoConfiguration
public class HelloController {
    private static org.slf4j.Logger logger = LoggerFactory.getLogger(HelloController.class);
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    @ResponseBody
    public String sayHello(){
        logger.info("The request is to sayHello");
        logger.error("This is test error log");
        return "hello,kaka";
    }
    public static void main(String[] args){
        SpringApplication.run(HelloController.class,args);
    }
}

启动项目(上面的logstash.conf我配置了两个输出,一个是elasticsearch,一个是交互标准输出),可以在logstash的交互中看到springboot的启动日志,访问HelloController,可以看到输出的error级别日志

启动项目(上面的logstash.conf我配置了两个输出,一个是elasticsearch,一个是交互标准输出),可以在logstash的交互中看到springboot的启动日志,访问HelloController,可以看到输出的error级别日志,如下图:

centos7下ELK + Redis结合项目搭建日志平台

然后再kibana的discover中指定的index里查询kaka关键字,如下:日志是不是很优雅的展示出来了

centos7下ELK + Redis结合项目搭建日志平台

OK,ELK的集成到此结束。

 

posted @ 2017-11-16 14:33  蓝瘦香菇の挨踢  阅读(2997)  评论(0编辑  收藏  举报