最近在研发环境用ELK搭建了一套日志平台,记录下。
系统:centos7
jdk:1.8
在安装elk之前需要先配置好jdk环境,logstash依赖jdk,关于jdk的配置此处省略。
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-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,出现如下截图表明配置成功,从启动信息中也能看出日志路径,端口等信息
在交互里随便输入测试hello kaka,看看输出吧
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
分别给上面设置的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,并输入测试字符串:I am kaka
从上面截图可以看到,在启动logstash过程中检查并连接output端elasticsearch,输入测试字符串后,访问elasticsearch的api:http://192.168.212.37:9201/logstash-test/_search(logstash-test是logstash.conf中配置的索引index),可以看到如下:刚才输入的I am kaka已经在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.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
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级别日志,如下图:
访问Kibana,搜索关键字,可以看到HelloController中输出的error日志了:
至此,ELK+Redis集成项目搭建日志平台完成了,enjoy it!