活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心
      文档中心

      云日志服务

      云日志服务

        • 产品动态
        • 产品介绍
        • 产品定义
        • 功能特性
        • 产品优势
        • 应用场景
        • 术语解释
        • 使用限制
        • 基础资源
        • 数据读写
        • 日志采集器
        • 查询与分析
        • 操作系统
        • 与其他服务关系
        • 计费说明
        • 计费概述
        • 计费模式
        • 按需计费
        • 资源包
        • 计费项
        • 计费样例
        • 欠费说明
        • 停止计费与退订
        • 计费FAQ
        • 快速入门
        • 入门概览
        • 开通云日志服务
        • 创建日志项目与日志单元
        • 日志接入
        • 查询与分析
        • 用户指南
        • 日志管理
        • 日志管理概述
        • 资源统计
        • 管理日志项目
        • 管理日志单元
        • 超额采集配置
        • 标签管理
        • 日志接入
        • 概述
        • 主机管理
        • 主机组管理
        • 采集器安装
        • 采集器管理
        • 接入云主机-文本日志
        • 接入云容器引擎-应用日志
        • 日志结构化解析
        • 单行全文模式
        • 多行全文模式
        • 单行分隔符模式
        • 单行正则模式
        • 多行正则模式
        • JSON模式
        • Nginx分词
        • 日志主题
        • 自定义日志时间
        • API接入
        • API接入概述
        • 访问地址(Endpoint)
        • 上报日志
        • SDK接入
        • SDK接入概述
        • 云日志服务Go SDK
        • 云日志服务Java SDK
        • 云日志服务Python SDK
        • 云日志服务C++ SDK
        • 云日志服务Log4j2 SDK
        • 云日志服务Logback SDK
        • 云日志服务Logging handler SDK
        • 云日志服务C SDK
        • 云日志服务.NET SDK
        • 云日志服务PHP SDK
        • 云日志服务 node.js SDK
        • 错误码
        • 其他接入方式
        • Systemd Journal日志采集
        • 使用Syslog协议(采集器)上传日志
        • 通过对象存储导入日志
        • 通过kafka导入日志
        • Windows事件日志采集
        • Nginx日志采集
        • 云服务日志接入
        • 云服务操作日志
        • 对象存储访问日志
        • 查询与分析
        • 日志查询
        • 日志查询
        • 上下文查询
        • 查询语法
        • SQL统计分析
        • 概述
        • SQL语法
        • 交互模式构造分析场景
        • 基础分析-字段筛选&过滤
        • 基础统计-指标统计
        • 基础统计-分组统计
        • 高级统计-日志占比
        • 高级统计-TopN
        • 高级统计-时间趋势
        • 经典分析样例
        • 内置保留字段
        • 索引配置
        • 日志聚类
        • 日志可视化
        • 可视化概述
        • 统计图表
        • 概述
        • 表格
        • 柱状图
        • 时序图
        • 饼图
        • 流图
        • 数值图
        • 散点图
        • 仪表盘
        • 创建仪表盘
        • 添加过滤器
        • 添加可视化图表
        • 权限管理
        • 数据加工
        • 数据加工概述
        • 基本概念
        • 创建数据加工任务
        • 管理数据加工任务
        • 数据加工语法
        • 概述
        • 流程控制函数
        • 事件操作函数
        • 字段操作函数
        • 事件操作函数
        • 操作符函数
        • 事件检查函数
        • 转换函数
        • 算术函数
        • 字符串函数
        • 日期时间函数
        • 正则表达式函数
        • 特定结构化数据函数
        • 编码解码函数
        • 日志转储
        • 概述
        • 转储至分布式消息服务Kafka
        • 转储至对象存储ZOS
        • 日志告警
        • 概述
        • 通知组管理
        • 通知策略管理
        • 告警规则
        • 告警历史
        • 告警事件历史
        • 告警发送历史
        • 静默策略
        • 最佳实践
        • 将本地日志迁移到云日志服务
        • 优化查询性能
        • 查询Log4j日志
        • 查询分析Nginx访问日志
        • 数据加工-日志过滤
        • 数据加工-为日志空缺字段赋值
        • 数据加工-为日志不存在的字段填充默认值
        • 告警-出现关键字即触发告警
        • 告警-根据关键字出现的次数设置告警
        • 基于业务日志的运维分析
        • API参考
        • API使用说明
        • 常见问题
        • 售前常见问题
        • 日志管理
        • 云日志服务使用建议
        • 云日志服务LTS对比自建ELK,应该如何选择?
        • 如何从第三方云厂商将日志搬迁到天翼云?
        • 数据采集
        • 常见问题
        • 如何查看日志采集器的运行状态?
        • 云日志服务可以采集哪类日志?支持采集哪些文件类型?
        • 云主机采集器无法连通如何处理?
        • 采集器安装失败如何处理?
        • 如何创建云日志服务终端节点?
        • 主机接入配置完成后未采集到日志如何处理?
        • 如何查看与升级插件版本?
        • 主机组中新增云主机后,如何启动日志采集?
        • 如何获取访问密钥(AK/SK)?
        • 数据存储
        • 查询与分析
        • 常见问题
        • 为什么检索不到日志?
        • 查询语法相关问题
        • 数据加工
        • 日志转储
        • 日志告警
        • 常见问题
        • 为什么出现漏告警或者误告警?
        • 触发告警成功,但是通知失败,如何处理?
        • 相关协议
        • 产品服务协议
        • 产品服务等级协议
          无相关产品

          本页目录

          帮助中心云日志服务用户指南日志接入SDK接入云日志服务Java SDK
          云日志服务Java SDK
          更新时间 2025-02-17 10:38:23
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          最近更新时间: 2025-02-17 10:38:23
          分享文章
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          本文主要介绍云日志服务Java SDK接入指南。

          1. 前言

          安装使用Go SDK可以帮助开发者快速接入并使用天翼云的日志服务相关功能,目前支持同步上传,异步批量上传等功能。

          2. 使用条件

          2.1. 先决条件

          用户需要具备以下条件才能够使用LTS SDK Java版本:

          1、购买并订阅了天翼云的云日志服务,并创建了日志项目和日志单元,获取到相应编码(logProject、logUnit)。

          2、已获取AccessKey 和 SecretKey。

          3、已安装JDK1.8及以上环境。

          2.2. 下载及安装

          下载ctyun_lts_java_sdk.zip压缩包,放到相应位置后并解压,把包放在本地目录:<base_path>。如果您想直接使用SDK,可以不做修改,直接使用SDK源码,示例代码为example/SamplePutlogs.java。。

          1. 把SDK源码构建成jar包,可通过构建工具构建。或者直接使用已有jar包(target目录下):”ctyun-lts-java-sdk-1.6.0.jar”。
          2. 把生成的jar包引入本地maven仓库。可以通过例如idea的maven工具install 到maven仓库。或者通过命令构建安装(在jar包所在目录执行下面命令)。
          mvn install:install-file -Dfile=ctyun-lts-java-sdk-1.6.0.jar -DgroupId=cn.ctyun.lts -DartifactId=ctyun-lts-java-sdk -Dversion=1.6.0 -Dpackaging=jar
          
          1. 在您的maven工程的pom.xml文件中增加配置
          <dependency>
              <groupId>cn.ctyun.lts</groupId>
              <artifactId>ctyun-lts-java-sdk</artifactId>
              <version>1.6.0</version>
          </dependency>
          
          1. 引入第三方依赖包
          <dependency>
                      <groupId>com.alibaba</groupId>
                      <artifactId>fastjson</artifactId>
                      <version>1.2.83_noneautotype</version>
                  </dependency>
                  <dependency>
                      <groupId>net.jpountz.lz4</groupId>
                      <artifactId>lz4</artifactId>
                      <version>1.3.0</version>
                  </dependency>
                  <dependency>
                      <groupId>org.apache.httpcomponents</groupId>
                      <artifactId>httpclient</artifactId>
                      <version>4.5.1</version>
                  </dependency>
                  <dependency>
                      <groupId>io.opentelemetry.proto</groupId>
                      <artifactId>opentelemetry-proto</artifactId>
                      <version>1.1.0-alpha</version>
                  </dependency>
                  <dependency>
                      <groupId>org.apache.httpcomponents</groupId>
                      <artifactId>httpmime</artifactId>
                      <version>4.5.1</version>
                  </dependency>
                  <dependency>
                      <groupId>com.google.protobuf</groupId>
                      <artifactId>protobuf-java</artifactId>
                      <version>3.23.4</version>
                  </dependency>
          

          3. SDK基本使用

          3.1. 基本使用

          使用 SDK访问 LTS 的服务,需要设置正确的 AccessKey、SecretKey 和服务端 Endpoint,所有的服务可以使用同一 key 凭证来进行访问,但不同的服务需要使用不同的 endpoint 进行访问,详情参考天翼云官网-SDK接入概述。在调用前SDK,需要已知以下参数:

          1、云日志服务访问地址。详情请查看访问地址(Endpoint)。

          2、key凭证:accessKey和secretKey 。详情请查看如何获取访问密钥(AK/SK)。

          3、日志项目编码:logProject,在使用SDK前,需要确保您有至少一个已经存在的日志项目,日志项目就是您要将日志上传到的地方。

          4、日志单元编码:logUnit,在使用SDK前,需要确保日志项目中有至少一个已经存在的日志单元。

          参数 参数类型 描述 是否必须
          endpoint string 域名 是
          accessKey string AccessKey,简称ak 是
          secretKey string SecretKey ,简称sk 是
          logProject string 日志项目编码 是
          logUnit string 日志单元编码 是

          目前通过SDK将日志上传到云日志服务有两种上传形式:同步上传和异步上传。

          1、同步上传:当调用日志上传接口时,sdk会立即进行http请求调用,并返回发送结果。这种方式结构简单,可用于发送频率不高的场景。

          2、异步上传:当调用日志上传接口时,后台线程会将日志进行累积,当达到发送条件时,会进行一次合并发送。对于需要频繁调用发送接口的场景,这种方式性能更卓越,更高效。

          示例代码:同步上传

            public static void main(String args[]) throws LogException, InterruptedException {
                  String accessKey = "your accessKey";
                  String secretKey = "your secretKey";
                  String logProject = "log project Code";//日志项目ID
                  String logUnit = "log unit Code";//日志单元ID
                  String endpoint = "endpoint";
          
                  Credentials credentials = new SecurityTokenCredentials(accessKey, secretKey, endpoint);
                  CredentialsProvider provider = new StaticCredentialsProvider(credentials);
                  ClientBuilder builder = new ClientBuilder(endpoint, provider);
                  Client client = builder.build();
                  //构建日志
                  LogItem logItem = new LogItem(System.currentTimeMillis());
                  logItem.setOrigin_msg(" sync ,java, test message!");
                  logItem.PushBackContent("level", "info");
                  logItem.PushBackLabel("usage_tag", "string");
                  LogItems logItems = new LogItems();
                  logItems.add(logItem);
          
                  try {
                       for (int i = 0; i < 100; i++) {        //发送100次
                          PutLogsResponse response = client.PutLogs(logProject, logUnit, logItems, "");
                          PutLogsResponseBody res = response.getBody();
                          System.out.println("response: statusCode:"+res.getStatusCode()+" ,message"+res.getMessage()+" ,error:"+res.getError());
                      }
                  } catch (LogException e) {
                      System.out.println("error :" + e.getErrorCode() + " , " + e.getMessage() + " , " + e.getHttpCode());
                      e.printStackTrace();
                  } catch (Exception ex) {
                      ex.printStackTrace();
                  }
              }
          

          示例代码:异步批量上传

           public static void main(String[] args) throws Exception {
                  String accessKey = "your accessKey";
                  String secretKey = "your secretKey";
                  String logProject = "log project Code";//日志项目ID
                  String logUnit = "log unit Code";//日志单元ID
                  String endpoint = "endpoint";
          
                  // 初始化日志生产者
                  Producer producer = new LogProducer(new ProducerConfig());
                   //以日志项目编码为区分,根据日志项目编码,会创建一个client
                  ProjectConfig projectConfig = new ProjectConfig(logProject, endpoint, accessKey, 														secretKey);  
                  producer.buildClient(projectConfig);
            
                  int task = 10; // 要发送的日志任务数
                  // 提交日志发送任务到线程池
                  for (int i = 0; i < task; ++i) {
                      EXECUTOR_SERVICE.submit(
                              new Runnable() {
                                  @Override
                                  public void run() {
                                      LogItem logItem = Utils.generateLogItem(1);
                                      try {
                                          // 发送日志,使用自定义回调函数
                                           producer.sendLogs(logProject, logUnit, logItem, 															customCallback());
                                      } catch (InterruptedException e) {
                                          LOGGER.warn("线程在发送日志时被中断。");
                                      } catch (Exception e) {
                                          LOGGER.error("发送日志失败,日志项: {}", logItem, e);
                                      } 
                                  }
                              });
                  }
          
                  // 稍作等待后关闭生产者
                  Thread.sleep(5000);
                  try {
                      producer.close();
                  } catch (InterruptedException e) {
                      LOGGER.warn("关闭生产者时线程被中断。");
                  } catch (ProducerException e) {
                      LOGGER.info("关闭生产者失败: {}", e);
                  }
                  // 等待所有任务完成
                   EXECUTOR_SERVICE.shutdown();
              }
            
              //回调函数
               private static Callback customCallback() {
                  Callback callback = new Callback() {
                      @Override
                      public void onCompletion(Result result) {
                          // 处理回调结果
                         if (result.isSuccessful()) {
                              LOGGER.info("response: statusCode:{} , message:{} , errorCode: {}",result.getStatusCode(), result.getErrorMessage(), result.getErrorCode());
                          } else {
                              LOGGER.info("response: statusCode:{} , message:{} , errorCode: {}",result.getStatusCode(), result.getErrorMessage(), result.getErrorCode());
                          }
                      }
                  };
                  return callback;
              }
          

          4. 服务代码示例-同步上传

          4.1. 关于Client的操作

          4.1.1. New Client()

          此操作是初始化Client。用户需要配置至少3个关键的参数才够初始化Client。

          参数 参数类型 描述 是否必须
          endpoint string 域名 是
          accessKey string AccessKey,简称ak 是
          secretKey string SecretKey ,简称sk 是

          示例代码:初始化Client配置

          Client client = new Client(endpoint, accessKey,secretKey);
          

          4.2. 关于Log的操作

          4.2.1. logData.PushBackContent(logItem)

          此操作用于生成待上传的日志,日志上传只能上传LogItem格式的日志,logData包含了一个ArrayList类型,里面包含若干条LogItem日志。

          LogItem类型的日志格式如下:

          参数 类型 描述 是否必须
          log_timestamp long 时间戳,单位纳秒 是
          origin_msg string 原始日志内容 是
          content ArrayList 分词后的日志内容,可用于索引 否
          labels ArrayList 自定义标签 否

          其中LogContent 和Labels是包含了两个成员变量的类,成员变量为key:string,value:T。

          示例代码:组装生成1条日志

          LogData logData = new LogData();
          LogItem logItem = new LogItem(System.currentTimeMillis());
          logItem.setOrigin_msg("java, test message!");
          logItem.PushBackContent("level", "info");
          logItem.PushBackContent("unit_id", "12345678");
          logItem.PushBackContent("area", 1.3145);
          logItem.PushBackLabel("usage_tag", "string");
          logData.add(logItem);
          

          注意:其中content和labels的key的长度不超过64字符,仅支持数字、字母、下划线、连字符(-)、点(.),且必须以字母开头。value类型最好使用字符串(String)和数字类型(int,double),其他类型建议先转为字符串类型,并且value值不能为空或空字符串。

          4.3. 关于日志上传的操作

          4.3.1. PutLogs()

          此操作用于日志上传服务,需要传入的参数有四个,分别是logProject(日志项目编码),logUnit(日志单元编码),logData(要上传的日志),source(日志来源)。

          参数 类型 描述 是否必须
          logProject string 日志项目编码 是
          logUnit string 日志单元编码 是
          logData vector 日志信息 是
          source string 日志的来源 是

          示例代码:上传日志

          PutLogsResponse response = client.PutLogs(logProject, logUnit, logItems, "");
          PutLogsResponseBody res = response.getBody();
          System.out.println("response: statusCode:"+res.getStatusCode()+",message"+res.getMessage()+" ,error:"+res.getError());	                                 
          

          PutLogsResponse 里面包含了请求的响应头header和响应体body,其中接收响应数据的响应体body格式如下:

          参数 类型 描述 示例
          statusCode int 返回码,取值范围:0:-正常、-1:严重错误,其他自定义
          message string 状态描述 SUCCESS
          error string 参考错误编码列表

          日志服务相关错误编码(部分):

          statusCode error message
          -1 LTS_8000 请求失败,请稍候重试,或提交工单反馈
          -1 LTS_8001 内容不合法,无法解析
          -1 LTS_8004 日志内容包含的日志必须小于[x] MB和[y]条
          -1 LTS_8006 日志内容解压失败
          -1 LTS_8007 Token失效,请重新获取
          -1 LTS_8009 无云日志服务产品实例,请先开通云日志服务
          -1 LTS_8010 日志项目不存在
          -1 LTS_8011 日志单元不存在
          -1 LTS_8013 在1个日志项目下,写入流量最大限制:200MB/s
          -1 LTS_8014 在1个日志项目下,写入次数最大限制:1000次/s
          -1 LTS_8015 在1个日志单元下,写入流量最大限制:100MB/s
          -1 LTS_8016 在1个日志单元下,写入次数最大限制:500次/s
          -1 LTS_18000 调用ITIAM的接口失败

          5. 服务代码-异步上传

          异步上传是为了解决同步上传无法高频异步发送等问题所增加的模块。原理是会开启多个线程,当调用日志发送接口后,会立刻返回,而内部的线程会将日志数据缓存合并,最后进行批量发送。异步上传特点如下:

          1. 线程安全设计 - producer 接口的所有对外暴露方法均经过精心设计,确保在多线程环境下安全无虞。
          2. 高效异步传输 - 调用 producer 的发送接口,用户可以迅速获得响应,而数据的实际发送则会在后台异步进行,并通过缓存和合并机制优化传输效率。
          3. 智能重试机制 - producer 配备智能重试功能,对于可重试的异常,将按照用户预设的最大重试次数和退避策略自动重试,确保数据的稳定传输。
          4. 详尽的行为跟踪 - 用户可通过 callback 或 future 机制获取数据发送的实时状态,包括每次尝试发送的详细信息,为问题排查和决策制定提供有力支持。
          5. 上下文一致性 - producer 保证同一实例产生的日志在服务端保持上下文一致,便于用户查看和分析日志间的关联关系。
          6. 优雅关闭流程 - 当用户调用 close 方法时,producer 将确保缓存中的所有数据得到妥善处理,并为用户提供关闭完成的通知,确保资源得到正确释放。

          性能卓越,在面临海量数据和高资源压力的场景下,producer 凭借多线程、智能缓存和批量发送等高级功能,帮助用户轻松达到目标吞吐量,同时简化了程序设计和开发流程。

          异步处理优势,在内存资源充足的情况下,producer 的异步发送机制使得用户调用 send 方法时无需等待,实现了计算与 I/O 逻辑的有效分离。用户可以通过返回的 future 或 callback 随时了解数据发送状态。

          精细的资源管理,用户可以通过灵活配置参数,精确控制 producer 使用的内存大小和发送任务的线程数。这不仅避免了资源的无限制消耗,还能根据实际应用场景平衡资源消耗和写入性能。

          5.1.关于Producer操作

          5.1.1. LogProducer()

          此操作是初始化producer的,producer可以看作是一个启动器,内部封装了异步线程的初始化、启动和关闭等功能,只需要对producer进行操作,即可安全便捷地控制这些异步的线程。使用这份producerConfig配置去初始化一个producer。

          ProducerConfig producerConfig = new ProducerConfig();
          producerConfig.setLingerMs(2000);
          producerConfig.setBatchCountThreshold(4096);
          ....
           Producer producer = new LogProducer(producerConfig);
          

          producerConfig内的属性是异步操作中的线程所需要的参数,如果不设置参数,则初始化的时候会使用默认的参数,默认参数如下所示:

          // 默认总大小(字节)。默认情况下,总大小限制为100MB。
           int DEFAULT_TOTAL_SIZE_IN_BYTES = 100 * 1024 * 1024;
          // 默认最大块处理时间。默认情况下,单个块的最大处理时间为1分钟。
           long DEFAULT_MAX_BLOCK_MS = 60 * 1000L;
          // 默认IO线程数。默认值为可用处理器数量的最大值和1之间的较大值。
           int DEFAULT_IO_THREAD_COUNT = Math.max(Runtime.getRuntime().availableProcessors(), 1);
          // 默认批次大小阈值。当数据量达到512KB时,将触发一批次的处理。
           int DEFAULT_BATCH_SIZE_THRESHOLD_IN_BYTES = 512 *1024;
          // 最大批次大小(字节)。默认情况下,单个批次的最大大小限制为5MB。
           int MAX_BATCH_SIZE_IN_BYTES = 5* 1024 * 1024;
          // 默认批次计数阈值。当积累达到4096个条目时,将触发一批次的处理。
           int DEFAULT_BATCH_COUNT_THRESHOLD = 4096;
          // 最大批次计数。默认情况下,单个批次的最大条目数限制为40960。
           int MAX_BATCH_COUNT = 40960;
          // 默认linger时间(毫秒)。 linger等待的时间默认为2秒。
           int DEFAULT_LINGER_MS = 2000;
          // Linger时间的下限。linger时间的最小值为100毫秒。
           int LINGER_MS_LOWER_LIMIT = 100;
           // 默认重试次数。默认情况下,操作失败后将重试10次。
           int DEFAULT_RETRIES = 10;
          //默认基础重试退避时间(毫秒)。重试之间的默认最小间隔为100毫秒。
           long DEFAULT_BASE_RETRY_BACKOFF_MS = 100L;
          // 默认最大重试退避时间(毫秒)。重试之间的最大间隔默认为50秒。
           long DEFAULT_MAX_RETRY_BACKOFF_MS = 50 * 1000L;
          

          5.1.2. BuildClient()

          此操作是根据projectConfig配置初始化client,它会根据配置中的logProject属性去初始化一个client,不同的logProject会构建不同的client,使用不同的配置就可以构建多个client,每个client负责该project项目下的日志发送任务。

          //根据不同配置生成不同client,日志上传互不影响 
          producer.buildClient(logProject, endpoint, accessKey, secretKey);
          producer.buildClient(logProject2, endpoint, accessKey, secretKey);
          

          5.1.3. Close()

          此操作是用于关闭producer。当不再需要发送数据或当前进程即将终止时,关闭producer是必要的步骤,以确保producer中缓存的所有数据都能得到妥善处理。当前,producer提供了两种关闭模式:安全关闭和有限关闭。

          安全关闭模式确保在关闭producer之前,所有缓存的数据都已完成处理,所有相关线程都已关闭,并且所有注册的回调函数都已执行完毕。一旦producer被安全关闭,缓存的批次数据会立即得到处理,并且不会被重试。如果回调函数没有被阻塞,close方法通常能够迅速返回。

          Thread.sleep(5000);
          producer.close();
          

          有限关闭模式适用于那些可能存在阻塞回调函数的场景,但您又希望close方法能在指定的时间内返回。为此,可以使用close(long timeoutMs)方法,并指定一个超时时间。如果超过了指定的timeoutMs时间后producer仍未完全关闭,该方法将抛出一个IllegalStateException异常,这意味着可能还有部分缓存的数据未及时处理就被丢弃,同时用户注册的回调函数也可能不会被执行。

          producer.close(5000);
          

          5.2.关于异步发送操作

          5.2.1. SendLogs()

          此操作是将日志发送到后台的日志累加器队列中,然后立刻返回。累加器的状态达到可发送条件时(日志量达到阈值或者等待时间达到阈值),后台任务的线程将里面的日志进行打包批量发送。

          producer.sendLogs(logProject, logUnit, logItem, customerCallback());
          //或者
          producer.sendLogs(logProject, logUnit, logItems);
          

          sendLogs()方法有很多重载方法,可以满足多种类型的发送,既可以发送单条日志,也可以发送多条日志,同时也可以根据需求是否需要结果返回值。类型如下:

          sendLogs(String logProject, String logUnit, LogItem logItem)
          sendLogs(String logProject, String logUnit, List<LogItem> logItems)
          sendLogs(String logProject, String logUnit, LogItem logItem, Callback callback)
          sendLogs(String logProject, String logUnit, List<LogItem> logItems, Callback callback)
          ...
          

          5.3.关于获取发送结果的操作

          由于 producer 提供的所有发送方法都是异步的,需要通过返回的 future 或者传入的 callback 获取发送结果。

          5.3.1. Future

          SendLogs 方法会返回一个 ListenableFuture,它除了可以像普通 future 那样通过调用 get 方法阻塞获得发送结果外,还允许注册回调方法(回调方法会在完成 future 设置后被调用)。

          以下代码片段展示了 ListenableFuture 的使用方法,ExexutorFuture.java 对sendLogs()进行了回调结果的封装,现在只需要调用executorFuture.executeTask()就可自动返回回调结果。

          int threadNum = 4;
          ExecutorFuture executorFuture = new ExecutorFuture(producer,threadNum);
          for (int i = 0; i < 1000; i++) {
               executorFuture.executeTask(logProject, logUnit, Utils.generateLogItem(5));
          
          }
               Thread.sleep(5000);   //关闭producer前,等待5s
               producer.close();
               executorFuture.shutdown();
          

          用户可以自定义回调函数,为该 future 注册一个 FutureCallback 并将其投递到应用提供的线程池 executorService中执行,完整样例可参考 SamplePutLogsFuture.java、ExexutorFuture.java。

          ListenableFuture<Result> future = producer.sendLogs(logProject, logUnit, logItem);  
           Futures.addCallback(future, new FutureCallback<Result>() {
               @Override
               public void onSuccess(Result result) {
                   System.out.println("response : " + result.getErrorMessage()+"  ,  Code:"+result.getErrorCode());
                      }
               @Override
               public void onFailure(Throwable t) {
                  System.err.println("response : " + t);
                }
            }, executorService); // 在执行器服务的线程中执行回调
          

          5.3.2. Callback

          除了使用 future 外,您还可以通过在调用 send 方法时注册 callback 获取数据发送结果,代码片段如下。(完整样例可参考 SamplePutLogsCallback.java)

          producer.sendLogs(logProject, logUnit, logItem, customCallback());
           private static Callback customCallback() {
            Callback callback = new Callback() {
            @Override
            public void onCompletion(Result result) {
               // 处理回调结果
               if (result.isSuccessful()) {
               LOGGER.info("response:  {} , {}", result.getErrorMessage(),    result.getErrorCode());
               } else {
                 LOGGER.info("response:  {} , {}", result.getErrorMessage(),    result.getErrorCode());
                 }
                }
             };
             return callback;
          }
          
          文档反馈

          建议您登录后反馈,可在建议与反馈里查看问题处理进度

          鼠标选中文档,精准反馈问题

          选中存在疑惑的内容,即可快速反馈问题,我们会跟进处理

          知道了

          上一篇 :  云日志服务Go SDK
          下一篇 :  云日志服务Python SDK
          搜索 关闭
          ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
          公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
          备案 京公网安备11010802043424号 京ICP备 2021034386号
          ©2025天翼云科技有限公司版权所有
          京ICP备 2021034386号
          备案 京公网安备11010802043424号
          增值电信业务经营许可证A2.B1.B2-20090001
          用户协议 隐私政策 法律声明