地址:
https://sls.console.aliyun.com/lognext/profile
创建project(存储日志的位置)
接入数据
java应用的业务日志
java应用集成LogService的SDK,上报日志
配置Slf4j的日志直接写入到SLS
添加依赖
<!-- https://mvnrepository.com/artifact/com.aliyun.openservices/aliyun-log-logback-appender -->
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>aliyun-log-logback-appender</artifactId>
<version>0.1.18</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.arms.apm/arms-sdk -->
<dependency>
<groupId>com.alibaba.arms.apm</groupId>
<artifactId>arms-sdk</artifactId>
<version>1.7.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-core -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.17.0</version>
</dependency>
配置日志(直接把日志写入到SLS)
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) [%X{traceId}] %highlight(%-5level) %boldMagenta(%logger{10}) - %cyan(%msg%n)</pattern>
</encoder>
</appender>
<appender name="aliyun" class="com.aliyun.openservices.log.logback.LoghubAppender">
<endpoint>cn-hangzhou.log.aliyuncs.com</endpoint>
<accessKeyId>LTAI*********hAD7a</accessKeyId> // 密钥管理申请
<accessKeySecret>y*************ETp</accessKeySecret>
<project>arms-sls-test</project>
<logStore>arms-sls-logstore</logStore>
<topic>arms-sls-topic</topic>
<!-- Optional parameters -->
<totalSizeInBytes>104857600</totalSizeInBytes>
<maxBlockMs>0</maxBlockMs>
<ioThreadCount>8</ioThreadCount>
<batchSizeThresholdInBytes>524288</batchSizeThresholdInBytes>
<batchCountThreshold>4096</batchCountThreshold>
<lingerMs>2000</lingerMs>
<retries>10</retries>
<baseRetryBackoffMs>100</baseRetryBackoffMs>
<maxRetryBackoffMs>50000</maxRetryBackoffMs>
<timeFormat>yyyy-MM-dd'T'HH:mmZ</timeFormat>
<timeZone>Asia/Shanghai</timeZone>
<mdcFields>traceId</mdcFields>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="aliyun"/>
</root>
</configuration>
获取traceId
package org.draymond.arms.utils;
import jakarta.servlet.http.HttpServletRequest;
import cn.hutool.core.lang.UUID;
import com.alibaba.arms.tracing.Span;
import com.alibaba.arms.tracing.Tracer;
import org.apache.commons.lang3.StringUtils;
public class TraceIdUtil {
public static String getTraceIdHttpRequest(HttpServletRequest request) {
Span span = Tracer.builder().getSpan();
String traceId = span.getTraceId();
if (StringUtils.isNotBlank(traceId)) {
return traceId;
} else {
traceId = StringUtils.isBlank(request.getHeader("trace_id")) ? request.getHeader("traceId") : request.getHeader("trace_id");
return StringUtils.isNotBlank(traceId) ? traceId : UUID.fastUUID().toString();
}
}
public static String getTraceId() {
Span span = Tracer.builder().getSpan();
String traceId = span.getTraceId();
return StringUtils.isNotBlank(traceId) ? traceId : UUID.fastUUID().toString();
}
}
业务使用
@Slf4j
@Component
public class ArmsService {
/**
* 测试cpu占用
*
* @param number
* @return
*/
public ArmsModel cpuTest(Integer number) {
MDC.put("traceId", TraceIdUtil.getTraceId());
log.info("cpu测试, number={}", number);
sleepNumberTime(number);
ArmsModel build = ArmsModel.build(number);
return build;
}
}
SLS效果
后续可以根据traceId查询分布式日志
arms中使用traceId查询调用链
全链路