centos7下ELK结合Redis项目搭建日志平台
jdk:1.8
yum install java -y
Logstash:日志收集
ElasticSearch:日志存储与搜索
Kibana:日志展示
我画了个草图,通常的架构图如下:AppServer 发送日志给Logstash服务器收集,ElasticSearch服务器负责日志的查询和存储,Kibana负责日志的展示

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,出现如下截图表明配置成功,从启动信息中也能看出日志路径,端口等信息

在交互里随便输入测试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

分别给上面设置的data和logs设置用户权限
chown -R elsearch:elsearch data/es/
chown -R elsearch:elsearch logs/es/
(4)运行elasticsearch:./bin/elasticsearch,如果直接用root身份去运行,会报如下错误:

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
启动过程中有可能报如下错误

切换到root用户编辑limit.conf文件
vi /etc/security/limits.conf
在文件末尾添加
elsearch soft nofile 65536
elsearch hard nofile 65536
注意:elsearch为所创建的用户名称,创建的是什么就写什么

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

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

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的路径端口

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

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

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

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

OK,ELK的集成到此结束。
5.安装redis
(1)安装redis(省略,安装很简单)
(2)进入redis的解压目录,编辑reids.conf配置文件,修改如下三个地方:
bind IP:绑定安装服务器的ip地址
protected-mode:修改为no,否则redis只有本机才能访问
port:修改为自己的端口,默认是6379

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

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

(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

logstash和redis的集成已经完成。
7.redis和java项目中log4j的集成
通过上面的配置,基本上已经实现了上面架构图的大部分功能,最后需要的就是项目中的日志如何输入到redis中呢,且看下面配置。
为了简单起见,我直接在spring官网创建一个springboot的web项目,地址http://start.spring.io/,快速构建一个可运行的spring mvc框架出来(spring boot已经集成了log4j等一系列,无需再去配置),只是为了测试日志,项目结构很简单,如下:

主要代码讲解:
先看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

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级别日志,如下图:

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

OK,ELK的集成到此结束。

浙公网安备 33010602011771号