概述

日志系统中的收集、查询、显示,分别对应于Logstash、Elasticsearch、Kibana。

  • Logstash:是一个应用程序日志、事件的传输、处理、管理和搜索的平台
  • Elasticsearch:是基于 lucene 的开源搜索引擎
  • Kibana:是一个功能强大的 elasticsearch 数据显示客户端

SpingMVC 中的日志收集流程是: SpringMVC 输出日志 -> Logstash 收集 -> Elasticsearch 持久化 -> Kibana 展示

环境

本文的 ELK 都是安装在虚拟机中,为了解释方便,假设虚拟机 ip 地址为 192.168.1.199,下载好的压缩包全部放在 /opt 中,并使用 root 用户登录虚拟机。

配置 Elasticsearch

进入 /opt 目录:

1# 解压 Elasticsearch
2tar -xzvf elasticsearch-5.2.2.tar.gz
3# 重命名
4mv elasticsearch-5.2.2 elasticsearch

修改配置文件,修改主机名称为本机 ip 地址 network.host: 192.168.1.199,这样外部才能通过 ip 地址访问:

1vim elasticsearch/config/elasticsearch.yml

Elasticsearch 不能使用 root 用户启动,因此需要添加新的用户:

1useradd -r -m -s  /bin/bash elk # elk 为用户名称
2# 分配权限
3chown -R elk /opt

启动:

1su elk
2elasticsearch/bin/elasticsearch

访问 http://192.168.1.199:9200/ 验证是否正确启动,如果遇到问题可以参考这篇文章:

http://www.cnblogs.com/sloveling/p/elasticsearch.html

配置 Kibana

进入 /opt 目录:

1# 解压 配置 Kibana
2tar -xzvf kibana-5.2.2.tar.gz
3# 重命名
4mv kibana-5.2.2 kibana

修改配置文件 kibana/config/kibana.yml ,在最后添加:

1server.port: 8888
2server.host: "192.168.1.199"
3elasticsearch.url: "http://192.168.1.199:9200"

访问 http://192.168.1.199:8888 验证是否正确启动

配置 Logstash

进入 /opt 目录:

1# 解压 配置 Logstash
2tar -xzvf logstash-5.2.2.tar.gz
3# 重命名
4mv logstash-5.2.2 logstash

新建配置文件:

1vim logstash/config/logstash-test.conf

添加内容:

input {
 tcp {
        host => "192.168.1.199"
        port => 8082
        mode => "server"
        ssl_enable => false
        codec => json {
            charset => "UTF-8"
        }
    }
}

output {
    elasticsearch {
        hosts => "192.168.1.199:9200"
        index => "logstash-test"
    }
  stdout { }
}

表示从 192.168.1.199:8082 收集日志,并发送到 Elasticsearch (192.168.1.199:9200),索引名称为 logstash-test。 启动 Logstash:

1# 进入 Logstash 目录
2cd logstash
3./bin/logstash -f config/logstash-test.conf

启动后,Logstash 会持续监听指定的收集端,我们只需要在程序中把日志发送到 192.168.1.199:8082 即可。

SpringMVC 中配置 logback

添加 maven 依赖:

 1        <!-- logback -->
 2        <dependency>
 3            <groupId>net.logstash.logback</groupId>
 4            <artifactId>logstash-logback-encoder</artifactId>
 5            <version>4.11</version>
 6        </dependency>
 7        <dependency>
 8            <groupId>ch.qos.logback</groupId>
 9            <artifactId>logback-classic</artifactId>
10            <version>1.2.3</version>
11        </dependency>
12        <dependency>
13            <groupId>net.logstash.log4j</groupId>
14            <artifactId>jsonevent-layout</artifactId>
15            <version>1.7</version>
16        </dependency>

在 resource 文件夹中添加配置文件 logback.xml:

 1<?xml version="1.0" encoding="UTF-8"?>
 2<configuration debug="false">
 3
 4    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
 5    <property name="LOG_HOME" value="E:/logs"/>
 6
 7    <!-- 控制台输出 -->
 8    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
 9        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
10            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
11            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
12        </encoder>
13    </appender>
14
15    <!-- 按照每天生成日志文件 -->
16    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
17        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
18            <!--日志文件输出的文件名-->
19            <FileNamePattern>${LOG_HOME}/TestWeb.log_%d{yyyy-MM-dd}.log</FileNamePattern>
20            <!--日志文件保留天数-->
21            <MaxHistory>30</MaxHistory>
22        </rollingPolicy>
23        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
24            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
25            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
26        </encoder>
27        <!--日志文件最大的大小-->
28        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
29            <MaxFileSize>10MB</MaxFileSize>
30        </triggeringPolicy>
31    </appender>
32
33    <!-- 发送日志到 logstash -->
34    <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
35        <destination>192.168.1.199:8082</destination>
36        <!-- encoder is required -->
37        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
38    </appender>
39
40    <!-- 日志输出级别 -->
41    <root level="INFO">
42        <!-- 只有添加stash关联才会被收集-->
43        <appender-ref ref="stash"/>
44        <appender-ref ref="STDOUT"/>
45        <appender-ref ref="FILE"/>
46    </root>
47
48</configuration>

关键是 stash,只有添加了这个 appender,才能把日志发送给 Logstash。

代码中输出日志

代码中使用 slf4j 获取日志对象,就可以打印日志:

1import org.slf4j.Logger;
2import org.slf4j.LoggerFactory;
3
4private static Logger log = LoggerFactory.getLogger(Test.class);

最后

以上就是 SpringMVC 集成 ELK 的全部操作,输出日志后,刷新 Kibana 页面,就会看到日志信息。

参考

Logback+ELK+SpringMVC搭建日志收集服务器

Logstash + Elasticsearch + Kibana 搭建日志平台