Java应用日志如何与Jaeger的trace关联

注意:免费节点订阅链接已更新至 2025-12-16点击查看详情

原文链接:https://www.cnblogs.com/bolingcavalry/p/15709398.html

本篇概览

在正式开始前,咱们先来看一个具体的问题:

  1. 一次web请求可能有多条业务日志(log4j或者logback配置的那种),这和您写代码执行log.info的次数有关,假设有10条,那么十次请求就有一百条业务日志;
  2. 通过jaeger发现这十次请求中有一次耗时特别长,想定位一下具体原因,现在问题来了:一共有100条业务日志,到底哪些是和Jaeger中耗时长的那一次请求有关?
  • 您可能会说:有些业务特征如user-id,咱们可以写入span的tag或者log中,这样通过span查到user-id,再去日志中查找含有此user-id的日志即可,这样确实可以,但未必每条日志都有user-id,所以并非最佳方式
  • 好在Jaeger官方给出了一种简单有效的方案:基于MDC,Jaeger的SDK在日志中注入trace相关的变量

关于MDC

  • 关于sl4j的MDC不是本篇的重点,因此只把本篇用到的特性简单说说即可,经验丰富的您如果对MDC已经了解,请跳过此节
  • 在sl4j的配置文件中可以配置日志的格式,例如logback的配置文件如下,可见模板中新增了一段内容[user-id=%X{user-id}]:
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">             <level>INFO</level>         </filter>         <encoder>             <!--%logger{10}表示类名过长时会自动缩写-->             <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{10} [user-id=%X{user-id}] %msg%n</pattern>             <charset>utf-8</charset>         </encoder>     </appender> 
  • 再来看一段日志的代码,先调用MDC.put方法将一个键值对写入当前线程的诊断上下文map(diagnostic context map),键名和上面的模板中配置的%X{user-id}一模一样:
@GetMapping("/test")     public void test() {         MDC.put("user-id", "user-" + System.currentTimeMillis());         log.info("this is test request");     } 
  • 现在把代码运行起来,打印日志看看,如下所示,之前模板中配置的%X{user-id}已被替换成了user-1632122267618,就是代码中MDC.put设置的值:
15:17:47 [http-nio-18081-exec-6] INFO  c.b.j.c.c.HelloConsumerController [user-id=user-1632122267618] this is test request 
  • 以上就是MDC的基本功能:对日志模板中的变量进行填充,填充的内容可以用MDC.put方法随意设置;
  • 此刻聪明的您应该能猜到jaeger官方的方案是如何实现的了,没错,就是借助MDC将trace信息填充到日志模板中,这样每行日志都有了trace信息,咱们在jaeger web页面中感兴趣的任何一次trace,都能找到对应的日志了

关于Jaeger的官方方案

  • Jaeger的官方方案如下图所示,SDK已经把traceIdspanIdsampled写入当前线程的诊断上下文map(diagnostic context map),只要日志模板中配置上述三个变量,就会在所有业务日志中输出它们具体的值:
  • 看起来似乎非常简单,那就动手编码试试吧

编码实战

  • jaeger与MDC的关联只是个小功能,没必要大张旗鼓的新建项目,基于《Jaeger开发入门(java版)》的代码继续开发即可,也就是说修改两个子工程jaeger-service-consumerjaeger-service-provider的源码,让它们的业务日志打印出Jaeger的trace信息
  • 首先从jaeger-service-provider工程开始,增加一个标准的logback日志配置文件logback.xml,如下所示,日志模板中已添加了traceIdspanIdsampled变量:
<?xml version="1.0" encoding="UTF-8"?>  <configuration scan="true" scanPeriod="60 seconds" debug="false">      <contextName>logback</contextName>      <!--输出到控制台-->     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">             <level>INFO</level>         </filter>         <encoder>             <!--%logger{10}表示类名过长时会自动缩写-->             <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{10} [traceId=%X{traceId} spanId=%X{spanId} sampled=%X{sampled}] %msg%n</pattern>             <charset>utf-8</charset>         </encoder>     </appender>      <root level="info">         <appender-ref ref="console" />     </root> </configuration> 
  • 再去检查配置类,确认JaegerTracer实例化时用了MDCScopeManager参数,如下所示,咱们在上一章已经这么做了,可以维持不变:
package com.bolingcavalry.jaeger.provider.config;  import io.jaegertracing.internal.MDCScopeManager; import io.opentracing.contrib.java.spring.jaeger.starter.TracerBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  @Configuration public class JaegerConfig {     @Bean     public TracerBuilderCustomizer mdcBuilderCustomizer() {         // 1.8新特性,函数式接口         return builder -> builder.withScopeManager(new MDCScopeManager.Builder().build());     } } 
  • 接下来是在业务代码中随意加几行打印日志的代码,如下图红框所示:
  • 接下来继续修改jaeger-service-consumer子工程,具体步骤与刚才改造jaeger-service-provider时一模一样,就不多占用篇幅赘述了,记得在业务代码中随意加几行日志,如下图红框:
  • 开发完成,开始验证吧

验证

  • 像《Jaeger开发入门(java版)》那样操作,将jaeger-service-consumerjaeger-service-provider编译构建制作成docker镜像
  • 用docker-compose将所有服务启动,然后通过浏览器访问jaeger-service-consumer的服务,多访问几次
  • 打开jaeger的web页面,可以看到多次请求的trace,咱们随机选择一个,鼠标点击下图红框中的圆点:
  • 此时会跳转到该trace的详情页,注意页面的url,如下图红框,里面的2037fe105d73f4a5就是traceid:
  • 2037fe105d73f4a5搜索jaeger-service-provider的日志,由于应用部署在docker中,咱们要用docker log和grep命令组合来过滤,如下所示,咱们代码写的日志都打印出来了,并且红框中就是traceid等关键信息
  • 再去查看jaeger-service-consumer的日志,如下图红框,本次请求相关的日志也可以通过traceid搜索到:
  • 至此,本篇实战就完成了,Jaeger的web页面上的任何一个trace,现在都能轻易找到与之对应的所有业务日志,这在定位问题时简直是如虎添翼的效果,如果您的系统用了ELK或者EFK来汇总所有分布式服务的日志,那就更高效了

iOS平台免费科学上网神器大盘点:解锁全球网络的终极指南

在当今这个信息爆炸的时代,互联网已成为我们获取知识、沟通交流的重要渠道。然而,由于各种原因,某些地区或国家对特定网站和应用程序实施了访问限制,这无疑给用户的信息自由带来了挑战。幸运的是,科学上网工具应运而生,它们就像一把把钥匙,为我们打开了通往全球互联网的大门。

对于iOS用户而言,选择一款合适的科学上网软件尤为重要。苹果设备的封闭性虽然带来了更高的安全性,但也让寻找优质的科学上网工具变得更具挑战性。本文将为您详细介绍iOS平台上最优秀的免费科学上网软件,并提供详细的使用指南和实用建议,助您轻松突破网络限制,畅游全球互联网。

科学上网:数字时代的通行证

科学上网,简单来说就是通过特定的技术手段绕过网络封锁,访问被限制的网站和服务。这项技术不仅能让您观看国外流媒体、使用被屏蔽的社交平台,还能保护您的网络隐私,避免受到不必要的监控。

在iOS设备上实现科学上网主要有以下几种方式:
1. VPN(虚拟专用网络):通过加密通道连接到远程服务器
2. 代理服务器:中转您的网络请求
3. 智能DNS:绕过地理限制而不改变IP地址
4. Shadowsocks等新型代理协议:更高效、更隐蔽

iOS免费科学上网软件精选

经过大量测试和用户反馈,我们为您精选了以下几款在iOS平台上表现优异的免费科学上网工具:

1. LynxVPN - 简单易用的入门之选

核心优势
- 完全免费的服务器节点
- 简洁直观的用户界面
- 无需复杂配置,一键连接
- 支持多国语言(包括中文)

使用体验
LynxVPN就像是科学上网界的"傻瓜相机",即使是技术小白也能轻松上手。App Store直接下载安装后,只需选择服务器位置,点击连接按钮即可。虽然免费服务器数量有限,但连接速度和稳定性都相当不错,足以满足日常浏览和视频观看需求。

适用场景
- 临时需要访问国外网站
- 不想折腾复杂配置的用户
- 轻度使用(浏览网页、社交媒体)

2. Kitsune - 隐私保护的卫士

核心优势
- 严格的"无日志"政策
- 自动选择最优服务器
- 智能分流功能(仅代理需要科学上网的流量)
- 精美的日式极简设计

技术亮点
Kitsune采用了最新的WireGuard协议,在保证安全性的同时提供了更快的连接速度。其独特的"智能路由"功能可以自动识别流量类型,国内网站直连,国外流量走代理,既节省流量又提高速度。

隐私考量
这款应用由日本团队开发,受严格的隐私保护法规约束。注册时仅需邮箱(甚至可以使用临时邮箱),不收集任何个人身份信息,是注重隐私用户的理想选择。

3. Shadowrocket - 技术爱好者的瑞士军刀

特别说明
虽然Shadowrocket是付费应用(约3.99美元),但其功能之强大使其成为不得不提的选项。App Store中国区已下架,需切换至外区账号下载。

专业功能
- 支持SS/SSR/V2Ray/Trojan等多种协议
- 自定义规则系统(可精确控制哪些网站走代理)
- 本地DNS解析防止DNS污染
- 流量统计和连接日志

进阶技巧
配合订阅链接使用,可以自动更新服务器列表。熟练使用后,您可以打造完全个性化的科学上网方案,甚至实现分应用代理(如仅让Twitter走代理,其他应用直连)。

4. Psiphon - 老牌抗封锁专家

历史背景
诞生于多伦多大学的开源项目,专门为突破网络审查设计,在全球拥有数百万用户。

技术特点
- 混合代理技术(结合VPN、SSH和HTTP代理)
- 自动寻找可用连接方式
- 内置速度测试和服务器选择

实测表现
在对抗深度包检测(DPI)方面表现优异,特别适合网络管控严格的地区。免费版本有广告且速度一般,但连接成功率很高。

5. Thunder VPN - 闪电般的连接速度

速度测试
在多个地区的测试中,其美国服务器平均延迟仅180ms,YouTube 1080p视频缓冲时间不到2秒。

独特功能
- 服务器负载实时显示
- 连接速度测试工具
- 自动重连机制

注意事项
免费版每天有500MB流量限制,适合短期应急使用。观看视频建议选择标清画质以节省流量。

安装与配置完全指南

基础安装步骤

  1. App Store下载

    • 打开iOS设备上的App Store
    • 搜索应用名称(如"LynxVPN")
    • 点击"获取"并安装
  2. 权限授予

    • 首次打开时会请求VPN配置权限
    • 点击"允许"并在弹出窗口中输入设备密码
  3. 服务器选择

    • 通常会自动推荐最优服务器
    • 也可手动选择特定国家/地区的节点
  4. 连接测试

    • 连接成功后访问google.com测试
    • 使用speedtest.net测速

高级配置技巧

对于Shadowrocket等专业工具,您可能需要:

  1. 手动添加服务器信息(地址、端口、加密方式等)
  2. 配置分流规则(如国内网站直连)
  3. 设置自动切换规则(当延迟过高时自动更换节点)

安全与隐私深度解析

风险评估

  1. 免费VPN的潜在隐患

    • 部分免费应用可能通过出售用户数据盈利
    • 恶意软件或广告注入风险
    • 连接日志可能被记录
  2. 选择建议

    • 优先选择开源软件(代码可审计)
    • 查看隐私政策是否明确承诺"无日志"
    • 选择知名大学或非营利组织开发的项目

增强安全措施

  1. 结合使用VPN和Tor浏览器获得更高匿名性
  2. 定期更换使用的VPN服务
  3. 重要操作(如网银)不使用VPN连接

常见问题权威解答

Q:使用这些工具会被追踪吗?
A:正规VPN会加密您的流量,使ISP无法知道您访问的具体内容。但VPN服务商本身可以看到您的活动,因此选择可信的服务商至关重要。

Q:为什么有时候连接后网速变慢?
A:这通常是由于服务器负载过高或物理距离过远导致。尝试切换至其他服务器,或选择专为视频优化的节点。

Q:免费和付费版主要区别是什么?
A:付费版通常提供:更快的专属服务器、无流量限制、更多国家节点选择、优先客服支持等。

Q:iOS系统更新后VPN不能用怎么办?
A:这通常是因苹果修复了某些漏洞导致。解决方法包括:更新VPN应用到最新版本、更换连接协议(如从L2TP改为IKEv2)、重启设备等。

终极选择建议

根据不同的使用需求,我们给出以下推荐方案:

  1. 临时轻量使用:LynxVPN或Thunder VPN
  2. 长期隐私保护:Kitsune
  3. 技术爱好者:Shadowrocket
  4. 高审查环境:Psiphon

未来展望

随着网络管控技术的升级,科学上网工具也在不断进化。我们期待看到:
- 更智能的流量混淆技术
- 基于区块链的去中心化VPN
- 硬件级的安全解决方案

结语:自由与责任的平衡

科学上网工具为我们打开了通往信息自由的大门,但同时也提醒我们:
- 尊重不同国家和地区的法律法规
- 不将这些工具用于非法用途
- 保持理性和批判性思维,辨别网络信息的真伪

在这个互联互通的世界里,我们既是信息的消费者,也是传播者。选择一款合适的科学上网工具,不仅是为了突破地理限制,更是为了以更开阔的视野参与全球对话。希望本文能帮助您在iOS平台上找到最适合的科学上网解决方案,安全、自由地探索数字世界的无限可能。

记住:技术本身是中立的,关键在于我们如何使用它。愿您在享受互联网自由的同时,也能成为网络空间负责任的数字公民。

版权声明:

作者: freeclashnode

链接: https://www.freeclashnode.com/news/article-4383.htm

来源: FreeClashNode

文章版权归作者所有,未经允许请勿转载。

免费节点实时更新

热门文章

最新文章

归档