SpringBoot集成Graylog
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot集成Graylog相关的知识,希望对你有一定的参考价值。
在微服务架构中,一个服务通常都会有多个实例,而这些服务实例可能会被部署到不同的机器或虚拟容器上。此时对于日志数据的查看和分析就会变得困难起来,因为这些服务的日志数据都散落在各自实例所在的机器或容器上。例如,我现在要在订单服务里查找一个订单id为1的日志,而订单服务有10个实例并且部署在10台不同的机器上,那么我就得一台台的去找这个日志数据。所以这时候我们就需要有一个可以实现日志聚合的工具,将所有实例的日志数据都聚合在一个地方,那么我们就不需要到每个实例去找日志了,而本文将使用的日志聚合工具为Graylog。
关于Graylog的介绍及安装可以参考我另一篇文章:
目前使用Java语言编写微服务架构的项目,基本都是使用SpringBoot作为项目的基本开发框架,所以本文主要介绍SpringBoot如何集成Graylog,并将日志数据发送给Graylog服务实现日志聚合。
1.首先创建一个SpringBoot项目,SpringBoot默认自带的日志框架是Logback,我们可以到Graylog组件市场查找Logback相应的组件。
我这里选择了一个近期有更新过的组件,该组件的github地址如下:
2.然后在项目的pom.xml加入该组件的依赖,如下:
<dependency>
<groupId>de.siegmar</groupId>
<artifactId>logback-gelf</artifactId>
<version>2.0.0</version>
</dependency>
3.接着在项目的resources目录下,新建一个logback.xml文件,编辑文件内容如下:
<configuration>
<!-- 配置控制台的输出日志 -->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<!-- 定义日志输出的格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - [%thread] %-5level %logger{35} - [%line] - %msg%n
</pattern>
</layout>
</encoder>
</appender>
<!-- 配置日志输出到Graylog服务 -->
<appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender">
<!-- 配置Graylog服务的地址 -->
<graylogHost>192.168.190.129</graylogHost>
<!-- UDP Input端口 -->
<graylogPort>12201</graylogPort>
</appender>
<root level="info">
<appender-ref ref="GELF" />
<appender-ref ref="consoleLog" />
</root>
</configuration>
我这边的UDP Input配置信息如下:
4.配置完成后启动项目,启动完成后正常情况下可以在Graylog的Search界面中查看日志信息:
点击一条日志信息会展开详细的字段:
以上是最简单的日志配置,如果希望对更多配置项进行自定义的话,可以参考该组件的GitHub文档,上面有具体的配置项说明,下面给出一个我自己常用的appender配置示例:
<appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender">
<!-- Graylog服务的地址 -->
<graylogHost>192.168.190.129</graylogHost>
<!-- UDP Input端口 -->
<graylogPort>12201</graylogPort>
<!-- 最大GELF数据块大小(单位:字节),508为建议最小值,最大值为65467 -->
<maxChunkSize>508</maxChunkSize>
<!-- 是否使用压缩 -->
<useCompression>true</useCompression>
<encoder class="de.siegmar.logbackgelf.GelfEncoder">
<!-- 是否发送原生的日志信息 -->
<includeRawMessage>false</includeRawMessage>
<includeMarker>true</includeMarker>
<includeMdcData>true</includeMdcData>
<includeCallerData>false</includeCallerData>
<includeRootCauseData>false</includeRootCauseData>
<!-- 是否发送日志级别的名称,否则默认以数字代表日志级别 -->
<includeLevelName>true</includeLevelName>
<shortPatternLayout class="ch.qos.logback.classic.PatternLayout">
<pattern>%m%nopex</pattern>
</shortPatternLayout>
<fullPatternLayout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d - [%thread] %-5level %logger{35} - %msg%n</pattern>
</fullPatternLayout>
<!-- 配置应用名称(服务名称),通过staticField标签可以自定义一些固定的日志字段 -->
<staticField>app_name:backend</staticField>
<staticField>os_arch:${os.arch}</staticField>
<staticField>os_name:${os.name}</staticField>
<staticField>os_version:${os.version}</staticField>
</encoder>
</appender>
现在我们已经成功将项目的日志数据发送到了Graylog服务,如果我们想在Graylog上检索日志也很简单,只需要使用一些简单的语法即可,例如我要查询包含Mapping的日志信息:
还可以使用一些条件表达式,例如我要查询message字段包含http,并且日志级别为INFO的日志信息:
常用的日志搜索语法如下:
- 模糊查询:直接输入要查询的内容,例如:
orderid
- 精确查询:要查询的内容加上引号,例如:
"orderid: 11"
- 指定字段查询:
message:http 或 message:"http"
- 多字段查询:
message:(base-service base-web)
- 多条件查询:
message:http AND level_name:ERROR OR source:192.168.0.4
- 正则匹配查询:
app_name:order-service AND orderid:12?4*
注意:以上示例中涉及的符号全部是英文符号,且字母不区分大小写
关于搜索语法的官方文档地址如下:
以上是关于SpringBoot集成Graylog的主要内容,如果未能解决你的问题,请参考以下文章