日志
log42j
pom 文件配置依赖
- web 依赖默认引入的 logback
- 添加 log4j2 依赖
- 添加 log4j2 和 skywalking 的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 排除掉logging,不使用logback,改用log4j2 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-log4j-2.x</artifactId>
<version>8.10.0</version>
</dependency>
添加 log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,
你会看到log4j2内部各种详细输出。可以设置成OFF(关闭) 或 Error(只输出错误信息)。
-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="log.path">logs/lemes-auth</Property>
<Property name="logging.lemes.pattern">
%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{[%-5level]} [%traceId] %highlight{[%logger{50}.%M:%L]} - %msg%n
</Property>
</Properties>
<Appenders>
<!-- 输出控制台日志的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式 -->
<PatternLayout pattern="${logging.lemes.pattern}"/>
</Console>
<RollingRandomAccessFile name="debugRollingFile" fileName="${log.path}/debug.log"
filePattern="${log.path}/debug/$${date:yyyy-MM}/debug.%d{yyyy-MM-dd}-%i.log.gz">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8" pattern="${logging.lemes.pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingRandomAccessFile>
<GRPCLogClientAppender name="grpc-log">
<PatternLayout pattern="${logging.lemes.pattern}"/>
</GRPCLogClientAppender>
</Appenders>
<Loggers>
<!-- ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
<Logger name="com.lenovo.lemes" level="debug"/>
<Logger name="org.apache.kafka" level="warn"/>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="debugRollingFile"/>
<AppenderRef ref="grpc-log"/>
</Root>
</Loggers>
</configuration>
logback
pom 文件配置依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.10.0</version>
</dependency>
添加 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<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>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) [%tid] %highlight(%logger{36}) -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<!-- 配置异步记录 AsyncAppender -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="STDOUT"/>
</appender>
<!-- skywalking grpc 日志收集 8.4.0版本开始支持 -->
<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.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<!--系统操作日志-->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC"/>
<appender-ref ref="grpc-log"/>
</root>
</configuration>
链路追踪
pom 文件配置依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.10.0</version>
</dependency>
需要追踪的地方使用 @Trace 注解
示例代码
import io.swagger.annotations.ApiOperation;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
@RestController
public class TestLog0Controller {
private static final Logger logger = LoggerFactory.getLogger(TestLog0Controller.class);
@ApiOperation(value = "测试log", notes = "测试log")
@GetMapping(value = "/test/log")
public String logtest() {
logger.info("logtest");
start();
return "success";
}
@Trace(operationName = "/log/traceId")
public String getTraceId() {
try {
return TraceContext.traceId();
} catch (Exception e) {
logger.error("skywalking agent is not mount");
}
return "TID: N/A";
}
@Trace(operationName = "/log/date")
public String getNowDate(String str) {
logger.info("{} get date, traceId: {}", str, getTraceId());
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
@Trace(operationName = "/log/start")
public void start() {
logger.info("start log now is {}", getNowDate("START"));
running();
}
@Trace(operationName = "/log/running")
public void running() {
logger.info("running log now is {}", getNowDate("RUNNING"));
waiting();
}
@Trace(operationName = "/log/waiting")
public void waiting() {
logger.info("waiting log now is {}", getNowDate("WAITING"));
ending();
}
@Trace(operationName = "/log/ending")
public void ending() {
logger.info("ending log now is {}", getNowDate("ENDING"));
}
}
追踪结果
点击右边的查看日志,可以看到这个请求所打印的日志