sky walking日志采集以及注意事项
在介绍Sky walking日志采集功能之前,最好在系统学习一遍日志框架,这里推荐楠哥的日志框架在实际项目中我们需要将项目中的日志采集到sky walking中以便于我们能够快速排查问题,sky walking本身提供了logback,log4j,log4j2日志采集功能。可以直接进入官网学习和配置因为现在企业基本上使用logback和log4j2两个日志框架所以我们就只演示这两个日志框架的收集。
1,sky walking日志采集功能概述
在介绍Sky walking日志采集功能之前,最好在系统学习一遍日志框架,这里推荐楠哥的日志框架
在实际项目中我们需要将项目中的日志采集到sky walking中以便于我们能够快速排查问题,sky walking本身提供了logback,log4j,log4j2日志采集功能。
可以直接进入官网学习和配置
因为现在企业基本上使用logback和log4j2两个日志框架所以我们就只演示这两个日志框架的收集。
2,采集log4j2日志
引入依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-log4j-2.x</artifactId>
<version>9.0.0</version>
</dependency>
<dependency> <!-- 引入log4j2依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
如果是Spring boot项目中还需要排除他自带的logback日志框架
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉springboot默认配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
在resource目录下新建log4j2.xml文件定义日志输出格式等
这里可以参考sky walking官方给出的配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN" monitorInterval="30">
<!--先定义所有的appender-->
<appenders>
<!-- skywalking输出器 -->
<GRPCLogClientAppender name="SkywalkingLog">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
</GRPCLogClientAppender>
</appenders>
<loggers>
<root level="INFO">
<appender-ref ref="SkywalkingLog"/>
</root>
</loggers>
</configuration>
3,采集logback日志
如果是在springboot项目中的话不需要引入logback依赖,因为上面已经介绍过springboot自带有logback日志框架,所以只需要引入sky walking日志上传的工具包依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>9.0.0</version>
</dependency>
同样在resource目录下新建logback.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%tid) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${LOG_PATTERN}</pattern>
</layout>
</encoder>
</appender>
<!-- 使用gRpc将日志发送到skywalking服务端 -->
<appender name="GRPC_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${LOG_PATTERN}</Pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="GRPC_LOG"/>
</root>
</configuration>
4,效果展示
正常情况下日志成功展示效果如下
5,注意事项
最近在工作中使用sky walking时遇到一个大坑,因为项目已经运行很久了,在日志的配置文件中,已经有了很多了appender并且有些logger还是自定义的,这就导致一个问题,日志上传不成功。
在排查过程中反复确认配置是没问题的【自己新建一个项目使用相同配置都能上传成功】最终进过源码调试和查阅很多文档确认还是配置问题,
这也是为什么一开始我建议希望在好好系统性学习一下日志框架,logger里面有一个additivity配置,代表是否需要向上一级logger传递打印信息,默认是true,但是我们的项目中都是配置了false,而我们的sky walking的appender是配置在根logger里面,导致了我们的sky walking采集的日志不在同一个上下文中,所以没有采集到对应日志。
日志配置说明
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread]
%-5level %msg%n"/>
<!--
Appender: 设置日志信息的去向,常用的有以下几个
ch.qos.logback.core.ConsoleAppender (控制台)
ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新文件)
ch.qos.logback.core.FileAppender (文件)
-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.err</target>
<!--日志格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性
name:
用来指定受此logger约束的某一个包或者具体的某一个类。
level:
用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和
OFF,
如果未设置此属性,那么当前logger将会继承上级的级别。
additivity:
是否向上级loger传递打印信息。默认是true。
<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个
logger
-->
<!--
也是<logger>元素,但是它是根logger。默认debug
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL
和 OFF,
<root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个
logger。
-->
<root level="ALL">
<appender-ref ref="console"/>
</root>
</configuration>
修改方案,要么将additivity设置为true,要么将所有appender放在root标签里面。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)