微服务可观测性:pig平台日志聚合方案
【免费下载链接】pig 项目地址: https://gitcode.com/gh_mirrors/pig/pig
引言:微服务日志的困境与解决方案
在微服务架构中,日志分散在各个服务实例中,传统的单机日志查看方式已无法满足需求。pig平台作为一个微服务架构,面临着日志分散、查询困难、问题定位复杂等挑战。本文将详细介绍pig平台的日志聚合方案,帮助开发者解决这些问题,实现微服务的可观测性。
读完本文,你将能够:
- 了解pig平台日志聚合的整体架构
- 掌握日志采集、传输、存储和分析的关键技术
- 学会在pig平台中使用日志聚合方案进行问题定位和性能优化
一、pig平台日志架构概览
1.1 日志流程
pig平台的日志流程主要包括以下几个环节:
1.2 架构组件
pig平台日志聚合架构主要包含以下组件:
| 组件 | 功能 | 技术选型 |
|---|---|---|
| 日志采集 | 收集各个服务产生的日志 | Logback + 自定义Appender |
| 日志传输 | 将日志从服务传输到日志中心 | Kafka |
| 日志存储 | 存储收集到的日志数据 | Elasticsearch |
| 日志分析 | 对日志进行分析和检索 | Logstash |
| 日志可视化 | 以图形化方式展示日志数据 | Kibana |
二、日志采集:从代码到日志文件
2.1 日志注解@Slf4j
在pig平台中,广泛使用了Lombok的@Slf4j注解来简化日志的使用。通过该注解,可以在类中直接使用log对象进行日志输出,无需手动创建Logger实例。
例如,在PigTokenEndpoint.java中:
@Slf4j
public class PigTokenEndpoint {
// 直接使用log对象输出日志
log.info("Token endpoint accessed");
}
这种方式不仅简化了代码,还统一了日志的使用方式,便于后续的日志处理。
2.2 业务操作日志注解@SysLog
除了常规日志外,pig平台还提供了@SysLog注解用于记录业务操作日志。该注解可以标记在控制器方法上,自动记录方法的调用情况、参数信息等。
例如,在SysJobController.java中:
@RestController
@RequestMapping("/sys/job")
public class SysJobController {
@SysLog("新增定时任务")
@PostMapping
public R save(@RequestBody SysJob sysJob) {
// 业务逻辑处理
}
}
2.3 日志切面SysLogAspect
@SysLog注解的实现依赖于SysLogAspect切面类。该类通过AOP的方式,在被@SysLog注解标记的方法执行前后进行增强,收集日志信息并发送到日志事件中。
关键代码如下:
@Aspect
@Slf4j
@RequiredArgsConstructor
public class SysLogAspect {
@Around("@annotation(sysLog)")
@SneakyThrows
public Object around(ProceedingJoinPoint point, com.pig4cloud.pig.common.log.annotation.SysLog sysLog) {
// 日志收集逻辑
SysLogEventSource logVo = SysLogUtils.getSysLog();
logVo.setTitle(value);
// ... 其他日志信息设置
Long startTime = System.currentTimeMillis();
Object obj;
try {
obj = point.proceed();
} catch (Exception e) {
logVo.setLogType(LogTypeEnum.ERROR.getType());
logVo.setException(e.getMessage());
throw e;
} finally {
Long endTime = System.currentTimeMillis();
logVo.setTime(endTime - startTime);
SpringContextHolder.publishEvent(new SysLogEvent(logVo));
}
return obj;
}
}
三、日志事件处理:从事件到存储
3.1 日志事件SysLogEvent
SysLogAspect切面收集到日志信息后,会创建SysLogEvent事件,并通过Spring的事件机制发布出去。
public class SysLogEvent extends ApplicationEvent {
public SysLogEvent(SysLog source) {
super(source);
}
}
3.2 日志事件源SysLogEventSource
SysLogEvent事件携带的日志数据封装在SysLogEventSource类中,该类继承自SysLog实体类,并添加了body字段用于存储请求参数。
@Data
public class SysLogEventSource extends SysLog {
/**
* 参数重写成object
*/
private Object body;
}
3.3 日志工具类SysLogUtils
SysLogUtils是一个工具类,提供了获取系统日志、解析SPEL表达式等功能。其中,getSysLog方法用于构建SysLogEventSource对象,填充基本的日志信息。
@UtilityClass
public class SysLogUtils {
public SysLogEventSource getSysLog() {
HttpServletRequest request = ((ServletRequestAttributes) Objects
.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
SysLogEventSource sysLog = new SysLogEventSource();
sysLog.setLogType(LogTypeEnum.NORMAL.getType());
sysLog.setRequestUri(URLUtil.getPath(request.getRequestURI()));
sysLog.setMethod(request.getMethod());
sysLog.setRemoteAddr(JakartaServletUtil.getClientIP(request));
sysLog.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));
sysLog.setCreateBy(getUsername());
sysLog.setServiceId(SpringUtil.getProperty("spring.application.name"));
// 获取请求参数并脱敏
PigLogProperties logProperties = SpringContextHolder.getBean(PigLogProperties.class);
Map<String, String[]> paramsMap = MapUtil.removeAny(request.getParameterMap(),
ArrayUtil.toArray(logProperties.getExcludeFields(), String.class));
sysLog.setParams(HttpUtil.toParams(paramsMap));
return sysLog;
}
}
四、日志传输与存储
4.1 日志事件监听
发布的SysLogEvent事件会被相应的监听器捕获。监听器负责将日志数据发送到Kafka等消息队列,实现日志的异步传输。
@Component
public class SysLogListener {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@EventListener
public void handleSysLogEvent(SysLogEvent event) {
SysLogEventSource logSource = (SysLogEventSource) event.getSource();
// 将日志数据转换为JSON字符串
String logJson = JSON.toJSONString(logSource);
// 发送到Kafka
kafkaTemplate.send("pig-log-topic", logJson);
}
}
4.2 日志存储到Elasticsearch
Logstash消费Kafka中的日志数据,并将其存储到Elasticsearch中。通过Logstash的配置,可以实现日志的过滤、转换等操作,确保存储到Elasticsearch中的日志格式统一、内容规范。
Logstash配置示例:
input {
kafka {
bootstrap_servers => "kafka-server:9092"
topics => ["pig-log-topic"]
group_id => "logstash-pig-group"
}
}
filter {
json {
source => "message"
}
# 其他过滤规则
}
output {
elasticsearch {
hosts => ["elasticsearch-server:9200"]
index => "pig-log-%{+YYYY.MM.dd}"
}
}
五、日志分析与可视化
5.1 使用Kibana进行日志查询
Elasticsearch中的日志数据可以通过Kibana进行可视化查询和分析。Kibana提供了丰富的查询功能,可以根据关键词、时间范围、服务名称等条件快速定位所需日志。
例如,查询服务名为"pig-auth"的错误日志:
serviceId:pig-auth AND logType:ERROR
5.2 日志仪表盘
Kibana还支持创建自定义仪表盘,将关键的日志指标以图表形式展示,如日志数量趋势、错误率、服务调用频率等。这有助于开发人员快速了解系统的运行状况,及时发现潜在问题。
六、实践指南:日志聚合方案的使用
6.1 环境搭建
- 安装并启动Elasticsearch、Kafka、Logstash和Kibana
- 配置Logstash,确保能够正确消费Kafka中的日志并存储到Elasticsearch
- 在pig平台中配置Kafka地址等相关参数
6.2 日志查询示例
查询用户"admin"在2025-09-16的所有操作日志:
createBy:admin AND @timestamp:[2025-09-16T00:00:00Z TO 2025-09-16T23:59:59Z]
6.3 问题定位流程
当系统出现问题时,可以按照以下流程使用日志聚合方案进行定位:
- 在Kibana中根据时间范围和关键信息筛选相关日志
- 查看日志详情,确定问题发生的服务和大致时间
- 根据日志中的请求ID等信息,关联相关的上下游服务日志
- 分析日志中的错误信息和堆栈跟踪,定位问题根源
七、总结与展望
7.1 总结
pig平台的日志聚合方案通过统一的日志采集、传输、存储和分析,解决了微服务架构下日志分散、查询困难的问题。该方案基于ELK Stack(Elasticsearch、Logstash、Kibana)和Kafka构建,具有高可靠性、可扩展性和易用性等特点。
7.2 展望
未来,pig平台的日志聚合方案可以在以下方面进行优化:
- 引入日志采样机制,减少非关键日志的存储量
- 结合APM(应用性能监控)工具,实现日志与性能数据的关联分析
- 利用机器学习技术,实现日志异常检测和智能告警
通过持续优化日志聚合方案,pig平台将进一步提升微服务的可观测性,为系统的稳定运行提供有力保障。
八、参考资料
- ELK Stack官方文档
- Kafka官方文档
- Spring Boot日志配置指南
- Lombok @Slf4j注解使用说明
如果您觉得本文对您有所帮助,请点赞、收藏并关注我们,获取更多关于pig平台的技术文章。下期预告:"pig平台分布式追踪实现方案"。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



