基于 ELK6.6 + Filebeat 的 Spring Cloud 日志收集

版权声明:http://blog.csdn.net/anxpp https://blog.csdn.net/anxpp/article/details/87879206

基于 ELK6.6 + Filebeat 的 Spring Cloud 日志收集

*重要:请始终保证 ELK 各组件及 Filebeat 版本一致,以避免意想不到的麻烦。*

ELK

官网:[https://www.elastic.co/](https://www.elastic.co/cn/).

ELK 即 Elasticsearch、Logstash、Kibana,其中:

  • Elasticsearch:一个基于Lucene的搜索服务器,无人不知,不多介绍
  • Logstash:Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的 “存储库” 中。
  • Kibana:Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。

安装

ELK 各组件官网均有详细的安装文档,对于小规模的场景,推荐使用 docker 打包安装,方便快捷易维护。

docker 如何使用请自行解决,下面给一个 docker 运行 elk 的示例代码:
    docker run -dti \
	-p 5601:5601 \
	-p 9200:9200 \
	-p 9300:9300 \
	-p 5044:5044 \
	-e TZ="Asia/Shanghai" \
    --name elk660 sebp/elk:660

配置

Elasticsearch 和 Kibana 采用默认配置即可,Logstash 需要简单的配置以适应 Spring Cloud 下的日志。

配置文件目录为:/etc/logstash/conf.d/,不同环境下可能有差异。

日志是通过 Filebeat 搬运的,首先需要配置日志的输入。

vi /etc/logstash/conf.d/02-beats-input.conf

编辑文件保证内容类似:

input {
  beats {
    port => 5044
    codec => "json"
  }
}
* 1、input 表示日志输入
* 2、beats 即用于接收 filebeat 日志的插件
* 3、codec 为指定输入的日志格式,此处为 json

配置好输入后,在配置日志的输出(到Elasticsearch):

vi /etc/logstash/conf.d/30-output.conf

编辑文件保证内容类似:

output {
  elasticsearch {
    hosts => ["localhost"]
    manage_template => false
    index => "%{[fields][index]}-%{+YYYY}"
    document_type => "%{[fields][doc]}"
  }
}
* 1、index 即索引,使用了自定义字段+当前年份生成
* 2、document_type 即文档类型,也通过自定义字段指定
* 3、自定义字段会通过 Filebeat 传入,后面会看到
* 4、对 Elasticsearch 相关概念不了解的,可以自行了解一下

现在就可以启动 elk 了,启动后可以访问 Kibana,但是除了一个属于系统的索引,并没有自定义的索引存在。

Kibana配置认证

最简单的方式是通过 Nginx 反向代理,然后在 Nginx 上配置基础认证。

可参考:https://www.cnblogs.com/configure/p/7607302.html

Filebeat

Filebeat 是一个轻量级的日志搬运工具,官网也有详细的教程。

安装

安装有不同平台下的详细安装教程:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation.html

Centos 7 安装脚本示例:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.6.1-x86_64.rpm \
&& sudo rpm -vi filebeat-6.6.1-x86_64.rpm

配置

安装完成后开始配置:

vi /etc/filebeat/filebeat.yml

打开日志:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/logs/*.json
  fields:
    index: logtest
    doc: springcloud
1、enabled 设置是否开启该 type 的日志收集
2、paths 是一个数组,用于指定日志的目录和匹配规则
3、fields 用来指定自定义添加的字段(刚刚 Logstash 中用来生成索引和文档类型的字段就是这里定义的)

输出到 Logstash:

output.logstash:
  hosts: ["localhost:5044"]
localhost 请填 Logstash 实际的地址信息
同时可以注释掉 "utput.elasticsearch" ,因为我们不需要它

现在可以启动filebeat了:

systemctl start filebeat

查看服务状态:

systemctl status filebeat

设置开机启动:

systemctl enable filebeat

Logback配置

日志输出到文件的部分,需要转换为 Json 格式

依赖

Gradle:

// https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder
compile group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '5.3'

Maven:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>5.3</version>
</dependency>
因为是 Spring Boot 项目,logback的基础依赖已经包含了,所以不再需要引入

配置文件

logback 如何配置请自行了解。

对于控制台的输入,格式基本保持不变,仅修改输出到文件的格式。

完整的配置文件如下(logback-spring.xml):

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>

    <property name="app.name" value="service-myProject"/>
    <appender name="stdout_info" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="stdout_warn" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>%yellow(%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n)</pattern>
        </encoder>
    </appender>
    <appender name="stdout_error" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%red(%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n)</pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/home/logs/${app.name}.json</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/home/logs/${app.name}.%d{yyyy-MM-dd.HH}.json.gz
            </fileNamePattern>
            <maxHistory>365</maxHistory>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>100MB</maxFileSize>
        </triggeringPolicy>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"app":"${app.name}"}}</customFields>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="stdout_info"/>
        <appender-ref ref="stdout_warn"/>
        <appender-ref ref="stdout_error"/>
        <appender-ref ref="file"/>
    </root>

    <logger name="com.example.logback" level="error"/>

    <logger name="stdout_log" level="info" additivity="false">
        <appender-ref ref="stdout_info"/>
        <appender-ref ref="stdout_warn"/>
        <appender-ref ref="stdout_error"/>
    </logger>

</configuration>
1、 指定了服务名称:property name="app.name",方便后续的日志筛选
2、 appender name="file" 部分的配置即输出到文件的配置
3、 customFields 为自定义字段。
4、 其他配置慢慢看一下应该都能看懂

当服务启动后就能看到 /home/logs 下的日志文件,通过在 Elasticsearch 中也能看到其索引信息,打开 Kibana 可以添加对应的索引到面板中,Kibana 的查询功能很强大,可以多摸索摸索。

猜你喜欢

转载自blog.csdn.net/anxpp/article/details/87879206
今日推荐