微服务可观测性:pig平台日志聚合方案

微服务可观测性:pig平台日志聚合方案

【免费下载链接】pig 【免费下载链接】pig 项目地址: https://gitcode.com/gh_mirrors/pig/pig

引言:微服务日志的困境与解决方案

在微服务架构中,日志分散在各个服务实例中,传统的单机日志查看方式已无法满足需求。pig平台作为一个微服务架构,面临着日志分散、查询困难、问题定位复杂等挑战。本文将详细介绍pig平台的日志聚合方案,帮助开发者解决这些问题,实现微服务的可观测性。

读完本文,你将能够:

  • 了解pig平台日志聚合的整体架构
  • 掌握日志采集、传输、存储和分析的关键技术
  • 学会在pig平台中使用日志聚合方案进行问题定位和性能优化

一、pig平台日志架构概览

1.1 日志流程

pig平台的日志流程主要包括以下几个环节:

mermaid

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还支持创建自定义仪表盘,将关键的日志指标以图表形式展示,如日志数量趋势、错误率、服务调用频率等。这有助于开发人员快速了解系统的运行状况,及时发现潜在问题。

mermaid

六、实践指南:日志聚合方案的使用

6.1 环境搭建

  1. 安装并启动Elasticsearch、Kafka、Logstash和Kibana
  2. 配置Logstash,确保能够正确消费Kafka中的日志并存储到Elasticsearch
  3. 在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 问题定位流程

当系统出现问题时,可以按照以下流程使用日志聚合方案进行定位:

  1. 在Kibana中根据时间范围和关键信息筛选相关日志
  2. 查看日志详情,确定问题发生的服务和大致时间
  3. 根据日志中的请求ID等信息,关联相关的上下游服务日志
  4. 分析日志中的错误信息和堆栈跟踪,定位问题根源

七、总结与展望

7.1 总结

pig平台的日志聚合方案通过统一的日志采集、传输、存储和分析,解决了微服务架构下日志分散、查询困难的问题。该方案基于ELK Stack(Elasticsearch、Logstash、Kibana)和Kafka构建,具有高可靠性、可扩展性和易用性等特点。

7.2 展望

未来,pig平台的日志聚合方案可以在以下方面进行优化:

  1. 引入日志采样机制,减少非关键日志的存储量
  2. 结合APM(应用性能监控)工具,实现日志与性能数据的关联分析
  3. 利用机器学习技术,实现日志异常检测和智能告警

通过持续优化日志聚合方案,pig平台将进一步提升微服务的可观测性,为系统的稳定运行提供有力保障。

八、参考资料

  1. ELK Stack官方文档
  2. Kafka官方文档
  3. Spring Boot日志配置指南
  4. Lombok @Slf4j注解使用说明

如果您觉得本文对您有所帮助,请点赞、收藏并关注我们,获取更多关于pig平台的技术文章。下期预告:"pig平台分布式追踪实现方案"。

【免费下载链接】pig 【免费下载链接】pig 项目地址: https://gitcode.com/gh_mirrors/pig/pig

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值