ES系列十7、logback+ELK日志搭建

1、ELK应用场景

在复杂的企业应用服务群中,记录日志方式多种多样,而且不易归档以及提供日志监控的机制。不管是开发人员仍是运维人员都没法准确的定位服务、服务器上面出现的种种问题,也没有高效搜索日志内容从而快速定位问题的方式。所以须要一个集中式、独立的、搜集管理各个服务和服务器上的日志信息,集中管理,并提供良好的UI界面进行数据展现,处理分析。html

得此:ELK提供一套开源的解决方案,能高效、简便的知足以上场景。java

2、ELK日志系统介绍

一、ELK分别是Elasticsearch、Logstash、Kibana三个开源框架缩写。

框架 简介 做用
Elasticsearch 开源分布式搜索引擎,提供存储、分析、搜索功能。特色:分布式、基于reasful风格、支持海量高并发的准实时搜索场景、稳定、可靠、快速、使用方便等。 接收搜集的海量结构化日志数据,并提供给kibana查询分析
Logstash 开源日志搜集、分析、过滤框架,支持多种数据输入输出方式。 用于收集日志,对日志进行过滤造成结构化数据,并转发到elasticsearch中
Kibana 开源日志报表系统,对elasticsearch以及logstash有良好的web页面支持。 对elasticsearch提供的数据进行分析展现

二、与Logstash的直接集成有两种方式:

2.一、Logstash与微服务应用安装在一块儿,监听日志文件

2.二、Logstash独立部署,微服务节点经过网络向Logstash发送日志信息。

三、间接集成(两种方式)

一、每一个应用节点部署一个轻量级日志采集框架Beats,再由Beats对接统一的Logstash

因为Logstash消耗资源大,而服务器资源至关宝贵,因此引进另外一个轻量级日志采集框架Beats,其中包含如下6种node

Packetbeat 用于搜集网络流量数据

Heartbeatlinux

用于运行时间监控
Filebeat 用于搜集文件数据
Winlogbeat 用于搜集winodws事件数据
Metricbeat 用于指标
Auditbeat 用于审计数据

 

 

二、微服务将日志发送给Redis或者MQ,再由他们去对接Logstash(高并发场景)

因为logstash消耗性能,因此高并发场景容易遇到流量上的瓶颈,及时使用logstash集群也是如此,因此能够添加中间件进行日志缓存处理。因为logstash数据源具备多种方式,全部中间件也能够不少选择,常见的有kafka,redis。web

3、ELK搭建(非集群)

一、下载ELK(保持版本一致)

Elasticsearch 官网elasticsearch-6.3.1.tar elasticsearch官方文档
Kibana 官网kibana-6.3.1下载 linux64位 kibana官方文档
Logstash 官网logstash-6.3.1.tar logstash官方文档
Filebeat 官网filebeat-6.3.0 linux64位 beats官方文档

下面只介绍,方案2:Logstash独立部署,微服务节点经过网络向Logstash发送日志信息。redis

二、环境准备

一、jdk1.8spring

二、Elasticsearch安装参考:ES系列1、CentOS7安装ES 6.3.1json

三、启动 Elasticsearchvim

三、安装Kibana

一、解压到安装目录便可缓存

 

/home/kibana-6.3.1-linux-x86_64

二、修改配置文件

vi /home/kibana-6.3.1-linux-x86_64/config/kibana.yml
server.port: 5601       ##服务端口
server.host: "0.0.0.0"  ##服务器ip  本机
elasticsearch.url: "http://localhost:9200" ##elasticsearch服务地址 与elasticsearch对应

三、启动kibana

/home/kibana-6.3.0-linux-x86_64/bin/kibana       #命令窗启动

四、关闭kibana

ps -ef | grep kibana                    #后台线程关闭
kill -9 4525                             ##pid 4525 为查处线程的pid 

五、验证kibana启动

四、安装logstash

一、下载

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.1.tar.gz
tar -zxvf logstash-6.3.1.tar.gz

二、建立配置文件logstash-es.conf

vim /home/logstash-6.3.1/conf.d/logstash-es.conf 

复制一下内容:

input {
    tcp {
        port => 10514
        codec => "json"
    }
}
output {
     elasticsearch {
        action => "index"
        hosts => ["localhost:9200"]
        index => "%{[appname]}"
     }
}

10514:接受日志端口

hosts => ["localhost:9200"]   :es的ip和端口

"%{[appname]}" :取值日志中appname值为索引

三、检测配置文件是否有错:

/home/logstash-6.3.1/bin/logstash --path.settings /home/logstash-6.3.1/config/ -f /home/logstash-6.3.1/config/conf.d/logstash-es.conf--config.test_and_exit
Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
Configuration OK  # 为ok则表明配置文件没有问题
[root@data-node1 /usr/share/logstash/bin]# 

命令说明:

  • --path.settings 用于指定logstash的配置文件所在的目录
  • -f 指定须要被检测的配置文件的路径
  • --config.test_and_exit 指定检测完以后就退出,否则就会直接启动了

四、指定配置文件,启动logstash:

/home/logstash-6.3.1/bin/logstash --path.settings /home/logstash-6.3.1/config/ -f /home/logstash-6.3.1/config/conf.d/logstash-es.confSending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
# 这时终端会停留在这里,由于咱们在配置文件中定义的是将信息输出到当前终端

五、验证

打开新终端检查一下10514端口是否已被监听:

[root@data-node1 ~]# netstat -lntp |grep 10514
tcp6       0      0 :::10514                :::*                    LISTEN      4312/java 
[root@data-node1 ~]# 

五、配置lockback

一、maven

  <!--logback日志-->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>4.8</version>
        </dependency>

二、logback.xml添加logstash配置

  <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <param name="Encoding" value="UTF-8"/>
        <remoteHost>192.168.1.102</remoteHost> <port>10514</port>
       <!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入过滤类
        <!-- encoder is required -->
       <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
           <customFields>{"appname":"${appName}"}</customFields> // 索引名
        </encoder>
    </appender>

logback.xml以下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <contextName>MovieBooking</contextName>
    <timestamp key="TIMESTAMP" datePattern="yyyy-MM-dd" />
    <property name="LOGPATH" value="log" />
    <springProperty scope="context" name="appName" source="server.Name" defaultValue="localhost.log"/>
    <!-- 输出到控制台 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d{HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n
            </pattern>
        </layout>
    </appender>

    <!-- 输出到文件 -->
    <appender name="fileLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGPATH}${file.separator}${TIMESTAMP}.log</file>
        <append>true</append>
        <encoder>
            <pattern>
                %d{HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n
            </pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGPATH}${file.separator}all${file.separator}%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <param name="Encoding" value="UTF-8"/>
        <remoteHost>192.168.1.102</remoteHost>
        <port>10514</port>
       <!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入过滤类
        <!-- encoder is required -->
       <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
           <customFields>{"appname":"${appName}"}</customFields>
        </encoder>
    </appender>


    <root level="INFO">
        <appender-ref ref="fileLog" />
        <appender-ref ref="stdout"  />
        <appender-ref ref="logstash"  />
    </root>
</configuration>

三、测试

添加单元测试类:

package com.example.demo;

import com.example.service.StudentService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
@WebAppConfiguration
public class DemoApplicationTests {
    @Autowired
    private StudentService studentService;

    @Test
    public void Test() {
        log.info("测试日志{}","台风山竹,威力很大!");
        log.info(studentService.findAllStudent().get(0).toString());
    }
}  

执行:

 

四、验证

相关文章
相关标签/搜索