kaka的gravatar头像
kaka 2017-10-23 15:40:43
centos7下ELK + Redis结合项目搭建日志平台

最近在研发环境用ELK搭建了一套日志平台,记录下。

系统:centos7

jdk:1.8

在安装elk之前需要先配置好jdk环境,logstash依赖jdk,关于jdk的配置此处省略。

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-5.6.3.tar.gz,目前最新版本5.6.3

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

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

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

input {

      stdin { }

}

output {

       stdout {

              codec => rubydebug {}

       }

}

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

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

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

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

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 -xzvf elasticsearch-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,并输入测试字符串:I am kaka

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

从上面截图可以看到,在启动logstash过程中检查并连接output端elasticsearch,输入测试字符串后,访问elasticsearch的api:http://192.168.212.37:9201/logstash-test/_search(logstash-test是logstash.conf中配置的索引index),可以看到如下:刚才输入的I am kaka已经在elasticsearch中可以查看到了

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

至此,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.kaka</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;

/**
 * @author kaka
 * @create 2017-10-19 10:06
 **/
@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级别日志,如下图:

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

访问Kibana,搜索关键字,可以看到HelloController中输出的error日志了:

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

至此,ELK+Redis集成项目搭建日志平台完成了,enjoy it!

 


打赏

已有2人打赏

玖零定制问题修复的gravatar头像 最代码官方的gravatar头像
最近浏览
安安an  LV17 2019年7月23日
jien007  LV11 2019年1月4日
sy116mm7733  LV3 2018年11月17日
军绿色的小白  LV2 2018年6月29日
jianyue  LV2 2018年5月17日
上世纪风景  LV11 2018年1月12日
zyl  LV34 2018年1月5日
dafeigenihao  LV13 2017年11月28日
penghuobin 2017年11月20日
暂无贡献等级
低调人  LV38 2017年11月16日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友