📚概述
安装完
graylog后,如何将Srping boot项目接入到Graylog中,实现日志统一查询与管理呢?这里主要需要两个步骤:
Graylog配置相应的GELF InputSpring boot项目需要引入相关logback-gelf的maven依赖,并完成配置
📗Graylog配置GELF input
GELF:The 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的一些缺陷:
- 长度限制为
1024字节。 - 数据类型无法区分,数字和字符串是无法区分的。
- 无压缩。
Spring Boot项目引入的Maven依赖则是把日志格式化成GELF格式然后append到GrayLog上。

📌注意:
GELF有两种形式:UDP和TCP;UDP在会存在丢包问题;graylog服务挂掉,对应用没有影响;TCP形式需要以异步形式输出;否者graylog服务挂掉,直接影响应用运行。
📐GELF TCP 配置
点击System/Inputs,选择GELF TCP,点击 Launch new input

填写相关的必要配置信息

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

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

📙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:
注意:
- 如果数据量很大,存在丢包情况。
- 同一时刻日志到
graylog中的顺序和输出顺序存在不一致的情况。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:
注意:
TCP形式引入,需要以异步形式引入日志,否者会影响应用服务正常运行。- 同一时刻日志到
graylog中的顺序和输出顺序存在不一致的情况。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中查询日志了,如果没有配置index、Stream,默认会在All Messages中,如果需要对日志进行分类处理。需要配置index、Stream以及对应的过滤规则。

本文介绍了如何将Springboot项目接入Graylog,实现日志的统一查询与管理。首先需要在Graylog中配置GELF输入(支持UDP和TCP),然后在Springboot项目中引入logback-gelf依赖并配置相关参数,如Graylog服务器地址、端口、应用名称和环境。日志格式化为GELF后,通过UDP或TCP发送到Graylog。注意TCP方式需要异步输出以避免影响应用。配置完成后,日志将在Graylog中可查询。
21万+

被折叠的 条评论
为什么被折叠?



