Spring Boot接入Graylog

📚概述

安装完graylog后,如何将Srping boot项目接入到Graylog中,实现日志统一查询与管理呢?这里主要需要两个步骤:

  1. Graylog配置相应的GELF Input
  2. Spring boot项目需要引入相关logback-gelfmaven依赖,并完成配置

📗Graylog配置GELF input

GELFThe Graylog Extended Log Format (GELF) is a log format that avoids the shortcomings of classic plain syslog.
详细资料:https://docs.graylog.org/docs/gelf
GELF是一种日志格式,能避免传统意义上的 syslogs的一些缺陷:

  1. 长度限制为1024字节。
  2. 数据类型无法区分,数字和字符串是无法区分的。
  3. 无压缩。

Spring Boot项目引入的Maven依赖则是把日志格式化成GELF格式然后appendGrayLog上。

📌注意:

  • GELF有两种形式:UDPTCP
  • UDP在会存在丢包问题;graylog服务挂掉,对应用没有影响;
  • TCP形式需要以异步形式输出;否者graylog服务挂掉,直接影响应用运行。

📐GELF TCP 配置

点击System/Inputs,选择GELF TCP,点击 Launch new input
image.png
填写相关的必要配置信息
image.png

🔗GELF TCP 配置

点击System/Inputs,选择GELF UDP,点击 Launch new input,然后填写配置信息保存即可
image.png

配置完成后,处于运行中就是正常的。
image.png

📙Spring Boot配置

🧵pom文件添加依赖

<!--graylog日志依赖-->
<dependency>
    <groupId>de.siegmar</groupId>
    <artifactId>logback-gelf</artifactId>
    <version>3.0.0</version>
</dependency>

🛒配置文件定义graylog参数

# graylog 配置
## graylog 服务地址
graylog.graylogHost=10.0.107.102
## TCP端口或者UDP端口
graylog.graylogPort=12201
## 应用名称
graylog.app_name=arrow-admin
## 应用的环境,为了统一过滤,只能是(dev|test|pre|pro)
graylog.app_env=pro

⛳logback-spring.xml配置

Java日志推荐打到标准输出,如果有多少不同类型的日志,建议在日志格式中加一个自定义标签(log_tag),来标识日志的类型,这样日志分析工具可以根据这个标签将不同的日志类型过滤到不同的索引中存储。

UDP格式接入graylog:

注意:

  1. 如果数据量很大,存在丢包情况。
  2. 同一时刻日志到graylog中的顺序和输出顺序存在不一致的情况。
  3. graylog 服务器端挂掉会丢失日志,对应用服务没有影响。
<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="false" scan="true" scanPeriod="120 seconds">
    
    <!--获取配置文件中graylog配置-->
    <springProperty scope="context" name="graylog.graylogHost"
                    source="graylog.graylogHost"/>
    <springProperty scope="context" name="graylog.graylogPort"
                    source="graylog.graylogPort"/>
    <springProperty scope="context" name="graylog.app_name"
                    source="graylog.app_name"/>
    <springProperty scope="context" name="graylog.app_env"
                    source="graylog.app_env"/>
    <!--配置日志输出到统一日志搜集平台Graylog-->
    <appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender">
        <!-- Graylog服务的地址 -->
        <graylogHost>${graylog.graylogHost}</graylogHost>
        <!-- UDP Input端口 -->
        <graylogPort>${graylog.graylogPort}</graylogPort>
        <!-- 最大GELF数据块大小(单位:字节),508为建议最小值,最大值为65467 -->
        <maxChunkSize>508</maxChunkSize>
        <!-- 是否使用压缩 -->
        <useCompression>true</useCompression>
        <encoder class="de.siegmar.logbackgelf.GelfEncoder">
            <!--原始主机名(对应graylog中source字段),如果未指定,将自动检测-->
            <!--<originHost>logback-graylog</originHost>-->
            <!-- 是否发送原生的日志信息 -->
            <includeRawMessage>false</includeRawMessage>
            <includeMarker>true</includeMarker>
            <includeMdcData>true</includeMdcData>
            <includeCallerData>false</includeCallerData>
            <includeRootCauseData>false</includeRootCauseData>
            <!-- 是否发送日志级别的名称,否则默认以数字代表日志级别 -->
            <includeLevelName>true</includeLevelName>
            <!--这个控制message字段,默认值为%m%nopex,表示只输出message,不输出任何堆栈跟踪(nopex)-->
            <shortPatternLayout class="ch.qos.logback.classic.PatternLayout">
                <!--标准日志格式-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5p [%file:%line] - %m%n</pattern>
            </shortPatternLayout>
            <!--这个控制full message字段,内容基本上和message一样,所以这里直接配置行分隔符,就会忽略该字段,默认为%m%n-->
            <fullPatternLayout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%n</pattern>
            </fullPatternLayout>

            <!-- 配置应用名称(服务名称),通过staticField标签可以自定义一些固定的日志字段,用于进行日志分类 -->
            <staticField>app_name:${graylog.app_name}</staticField>
            <staticField>env:${graylog.app_env}</staticField>
            <!--日志类型Java-->
            <staticField>log_type:Java</staticField>
        </encoder>
    </appender>


    <!-- 日志输出级别 -->
    <root level="INFO">

    	<appender-ref ref="GELF"/>
    </root>
</configuration>

TCP格式接入graylog:

注意:

  1. TCP形式引入,需要以异步形式引入日志,否者会影响应用服务正常运行。
  2. 同一时刻日志到graylog中的顺序和输出顺序存在不一致的情况。
  3. graylog 服务器端挂掉会丢失日志,对应用服务没有影响。
<?xml version="1.0" encoding="UTF-8"?>
<!--scan为true时,如果配置文件发生改变将会进行重新加载 -->
<!-- scanPeriod属性设置监测配置文件修改的时间间隔,默认单位为毫秒,在scan为true时才生效 -->
<configuration debug="false" scan="true" scanPeriod="120 seconds">
    <!--日志文件路径读取自nacos配置-->
    <springProperty scope="context" name="logPath" source="log.path" defaultValue="./logs"/>
    <!--定义日志文件的存储地址 -->
    <property name="LOG_HOME" value="${logPath}"/>
    <!--appName 应用服务名称-->
    <springProperty scope="context" name="appName"
                    source="spring.application.name"/>

    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
    <property name="LOG_FORMAT" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
    <!-- Console 输出设置 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_FORMAT}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 按照每天生成日志文件 -->
    <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/${appName}_info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
            <!-- 日志占用总空间限制 -->
            <totalSizeCap>2GB</totalSizeCap>
            <!-- 启动服务时清理历史数据 -->
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
            <!-- 单个日志文件大小-->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 日志文件的最大大小 -->
                <maxFileSize>20MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_FORMAT}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!--获取配置文件中graylog配置-->
    <springProperty scope="context" name="graylog.graylogHost"
                    source="graylog.graylogHost"/>
    <springProperty scope="context" name="graylog.graylogPort"
                    source="graylog.graylogPort"/>
    <springProperty scope="context" name="graylog.app_name"
                    source="graylog.app_name"/>
    <springProperty scope="context" name="graylog.environment"
                    source="graylog.environment"/>

    <!-- TCP配置日志输出到统一日志搜集平台Graylog -->
    <appender name="GELF" class="de.siegmar.logbackgelf.GelfTcpAppender">
        <!-- Graylog服务的地址 -->
        <graylogHost>${graylog.graylogHost}</graylogHost>
        <!-- UDP Input端口 -->
        <graylogPort>${graylog.graylogPort}</graylogPort>
        <connectTimeout>15000</connectTimeout>
        <reconnectInterval>300</reconnectInterval>
        <maxRetries>2</maxRetries>
        <retryDelay>3000</retryDelay>
        <poolSize>2</poolSize>
        <poolMaxWaitTime>5000</poolMaxWaitTime>
        <!--<poolMaxIdleTime>10</poolMaxIdleTime>-->
        <encoder class="de.siegmar.logbackgelf.GelfEncoder">
            <!--原始主机名(对应graylog中source字段),如果未指定,将自动检测-->
            <originHost>192.168.124.75</originHost>
            <includeRawMessage>false</includeRawMessage>
            <includeMarker>true</includeMarker>
            <includeMdcData>true</includeMdcData>
            <includeCallerData>false</includeCallerData>
            <includeRootCauseData>false</includeRootCauseData>
            <includeLevelName>false</includeLevelName>
            <!--这个控制message字段,默认值为%m%nopex,表示只输出message,不输出任何堆栈跟
            踪(nopex)-->
            <shortPatternLayout class="ch.qos.logback.classic.PatternLayout">
                <pattern>${LOG_FORMAT}</pattern>
            </shortPatternLayout>
            <!--这个控制full message字段,内容基本上和message一样,所以这里直接配置行分隔
            符,就会忽略该字段,默认为%m%n-->
            <fullPatternLayout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%n</pattern>
            </fullPatternLayout>
            <numbersAsString>false</numbersAsString>
            <!--控制着自定义字段,需要在spring配置文件中配置,并且在本文件中配置
            springProperty标签-->
            <staticField>app_name:${graylog.app_name}</staticField>
            <staticField>environment:${graylog.environment}</staticField>
            <!--日志类型Java-->
            <staticField>log_type:Java</staticField>
        </encoder>
    </appender>

    <!--异步记录日志,需要异步进行日志记录,否者会影响应用服务正常运行-->
    <appender name="ASYNC_GELF" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="GELF"/>
    </appender>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="LOG_FILE"/>
        <appender-ref ref="ASYNC_GELF"/>
    </root>
</configuration>

🎫验证

配置完以后,就可以在Graylog中查询日志了,如果没有配置indexStream,默认会在All Messages中,如果需要对日志进行分类处理。需要配置indexStream以及对应的过滤规则。

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值