• 03篇ELK日志系统——升级版集群之ELK日志系统整合springboot项目


      前言:整个ELK日志系统已经搭建好了,接下来的流程就是:

        springboot项目中的logback日志配置通过tcp传输,把springboot项目中所有日志数据传到————》logstash,再由logstash把收集来的日志数据传到——————》elasticsearch集群————————》最后由kibana展示。

    1、准备一个springboot项目,并配置logback日志

        1.1、springboot项目demo怎么创建就不写了,pom.xml要配置logback包依赖和logstash包依赖,如下:

        <!-- 添加Logback日志 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </dependency>
    
            <!-- logstash整合logback,使用logback向服务器的logstash输出日志数据 -->
            <dependency>
                <groupId>net.logstash.logback</groupId>
                <artifactId>logstash-logback-encoder</artifactId>
                <version>4.11</version>
            </dependency>

      1.2、然后是logback与spring的整合配置文件logback-spring.xml,内容如下:(里面有logback向logstash传输的配置)

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
    <!-- 日志输出规则  根据当前ROOT 级别,日志输出时,级别高于root默认的级别时  会输出 -->
    <!-- 以下  每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志-->
    
    
    <!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
        debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <!-- 定义日志文件 输入位置 -->
        <property name="log_dir" value="/logs/jz-project" />
        <!-- 日志最大的历史 30天 -->
        <property name="maxHistory" value="30"/>
    
    
    
    
        <!-- ConsoleAppender 控制台输出日志 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <!-- 对日志进行格式化 -->
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n</pattern>
            </encoder>
        </appender>
    
    
        <!-- ERROR级别日志 -->
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender-->
        <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 过滤器,只记录WARN级别的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责出发滚动 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志输出位置  可相对、和绝对路径 -->
                <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/error-log.log</fileNamePattern>
                <!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6,
                则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除-->
                <maxHistory>${maxHistory}</maxHistory>
            </rollingPolicy>
    
            <!-- 按照固定窗口模式生成日志文件,当文件大于20MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。
            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
              <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/.log.zip</fileNamePattern>
              <minIndex>1</minIndex>
              <maxIndex>3</maxIndex>
            </rollingPolicy>   -->
            <!-- 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <maxFileSize>5MB</maxFileSize>
            </triggeringPolicy>   -->
    
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
            </encoder>
        </appender>
    
    
    
        <!-- WARN级别日志 appender -->
        <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 过滤器,只记录WARN级别的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>WARN</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 按天回滚 daily -->
                <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/warn-log.log
                </fileNamePattern>
                <!-- 日志最大的历史 60天 -->
                <maxHistory>${maxHistory}</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
            </encoder>
        </appender>
    
    
    
    
        <!-- INFO级别日志 appender -->
        <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 过滤器,只记录INFO级别的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 按天回滚 daily -->
                <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/info-log.log
                </fileNamePattern>
                <!-- 日志最大的历史 60天 -->
                <maxHistory>${maxHistory}</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
            </encoder>
        </appender>
    
    
    
    
        <!-- DEBUG级别日志 appender -->
        <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 过滤器,只记录DEBUG级别的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>DEBUG</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 按天回滚 daily -->
                <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/debug-log.log
                </fileNamePattern>
                <!-- 日志最大的历史 60天 -->
                <maxHistory>${maxHistory}</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
            </encoder>
        </appender>
    
    
    
    
        <!-- TRACE级别日志 appender -->
        <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 过滤器,只记录ERROR级别的日志 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>TRACE</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 按天回滚 daily -->
                <fileNamePattern>${log_dir}/%d{yyyy-MM-dd}/trace-log.log
                </fileNamePattern>
                <!-- 日志最大的历史 60天 -->
                <maxHistory>${maxHistory}</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
            </encoder>
        </appender>
    <!--
        <logger name="java.sql.PreparedStatement" value="DEBUG" />
        <logger name="java.sql.Connection" value="DEBUG" />
        <logger name="java.sql.Statement" value="DEBUG" />
        <logger name="com.ibatis" value="DEBUG" />
        <logger name="com.ibatis.common.jdbc.SimpleDataSource" value="DEBUG" />
        <logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG"/>
        <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" value="DEBUG" />
        -->
    
    
        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>192.168.26.233:9601</destination>     <!--指定logstash ip:监听端口 tcpAppender  可自己实现如kafka传输等-->
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
                <!-- "appname":"yang_test" 的作用是指定创建索引的名字时用,并且在生成的文档中会多了这个字段  -->
                <customFields>{"appname":"zj_test"}</customFields>
            </encoder>
    
        </appender>
    
    
    
    
        <!-- 这样能打印出sql -->
        <logger name="com.jzproject.mapper" level="DEBUG" />
    
    
        <!-- root级别   DEBUG,(我修改成了info) -->
        <root level="info">
            <!-- 控制台输出 -->
            <appender-ref ref="STDOUT" />
            <!-- 文件输出 -->
            <appender-ref ref="ERROR" />
            <appender-ref ref="INFO" />
            <appender-ref ref="WARN" />
            <appender-ref ref="DEBUG" />
            <appender-ref ref="TRACE" />
            <appender-ref ref="LOGSTASH" />
        </root>
    </configuration>

     下面来看整合效果:

        开启3台服务器es集群服务、开启logstash服务,开启kibana服务。

        只是为了演示日志数据传入服务器ELK系统的效果,springboot项目就不上传服务器启动了,只在本地启动,本地启动时会立刻就会有日志生成,并通过刚才的logback与logstash的配置传输日志到服务器上的ELK日志系统里。

        

        1、在idea上启动项目:

        2、可以看到115服务器上的logstash立刻打印出了实时日志,而且是以json格式打印的:

      

         3、到浏览器上打开kibana,效果如下:也显示出了刚才启动项目生成的日志数据,不过要创建一下日志索引具体使用就要去学kibana的使用了

    到此为止整个ELK日志系统与springboot项目整合算是完成了,这只是一个初步的日志系统,用户量一大,日志数据将会是爆发式增涨,下一步将考虑如何把kafka整合进来

    放牛去。。。

  • 相关阅读:
    Codeforces441B_Valera and Fruits(暴力)
    《Python核心编程》第五章:数字
    app-framework学习--Scroller
    饿了么移动APP的架构演进
    移动支付--银联,支付宝,微信(android)
    android推送,极光推送
    Flume 1.7 源代码分析(四)从Source写数据到Channel
    <html>
    软件系统演示脚本实践(草稿)
    mmu介绍
  • 原文地址:https://www.cnblogs.com/spll/p/10950908.html
Copyright © 2020-2023  润新知