Sliver 仓库中的 logtail 日志服务 API:Collection、Instance 与日志存取配置接口详解
网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载Sliver 仓库的vendor/tailscale.com/logtail目录内置了 Tailscale Logs Service 的完整客户端库与接口文档api.md。本文以该 API 文档为主体逐节讲解 Collection/Instance 双级数据模型、日志存储、检索与配置四类 REST 接口的请求格式与语义并结合仓库内logtail.go、config.go、buffer.go等源码实现说明 Sliver 所依赖的tsnet组件是如何在实际运行中调用这套接口的。一、日志服务总览与认证方式Tailscale Logs Service 定义了一套 REST 接口用于日志条目的配置、存储、检索与处理。HTTP 请求发送到服务的 base URLhttps://log.tailscale.com响应为 JSON 编码并使用标准 HTTP 状态码。配置类与检索类 API 的授权方式是将 secret API key 作为 HTTP Basic Auth 的 username传入。secret key 通过 base URL 下的 Web UI 生成。原文档给出的 curl 示例curl -u log_api_key: https://log.tailscale.com/collections注意 password 部分留空key 位于 username 位置。此外文档预告了未来的演进方向后续会支持通过 HTTP 头指定 MessagePack 替代 JSON 作为响应/请求格式。二、核心数据模型Collection 与 InstanceCollection以域名划分的日志分组日志被组织进collection。每个 collection 内可以包含任意数量的instance。Collection 的名字就是一个域名是对相关日志的分组。文档建议每个产品创建一个 collection使用公司域名的子域名。Collection 必须在存储任何日志之前先向 logs service 注册。Instance每台机器一个实例private/public 双 ID每个 collection 由若干 instance 构成写日志的每台机器对应一个 instance。instance 有名字和编号并持有两个 IDID定义用途private ID32 字节随机数hex 编码用于写日志唯一副本应留在发送日志的机器上理想情况下在机器本地生成生成后即可开始写日志public IDprivate ID 的 SHA-256 哈希hex 编码用于读日志和 adopt设计上可以安全地发送给同时持有 logs service API key 的服务Adoption 机制与保留策略logs service 只会短期存储日志。要启用长期保留需要用public ID API key对日志执行adoptadopt 之后日志按配置的保留期长期保留。未被 adopt的 instance 日志只临时保存用于调试场景——比如一台配置错误、用坏 ID 写日志的机器可以通过读取日志发现它。未 adopt 的日志存储有严格上限12 小时后删除。三、存储 APIPOST /c/collection-name/private-ID请求体为 JSON有两种合法形态。单条消息单条消息是一个 JSON 对象。客户端可以在对象里放入任意自定义属性唯一保留属性是logtail在logtail对象内客户端目前只能设置client_time属性格式为 RFC3339Go 参考格式2006-01-02T15:04:05.999999999Z07:00。文档预告的后续版本将支持client_time_offset客户端重置以来的纳秒数整数与client_time_reset布尔值置 true 时重置时间偏移计数器。服务端收到client_time_offset后会以第一条或 reset 那条事件被接收时的server_time为基准换算出client_time。若在logtail对象中设置了其他属性它们会被移入error字段消息会被保存并返回 4xx 状态码。批量消息批量消息是一个 JSON 数组元素为单条消息对象[ { }, { }, ... ]。若数组中某条目不是对象该内容会被转成带logtail: { error: ... }属性的消息保存并返回 4xx。其他不符合这两种格式的请求内容同样被保存进 logtail error 字段并返回 4xx。非法 collection 名返回{error: invalid collection name}加 403 状态码。客户端行为建议文档鼓励客户端尽可能快地 POST除非受电池续航限制。这既缩短了日志在查看器中可见的时间也降低了日志丢失概率流式写日志时使用 HTTP/2它更擅长维持 TLS 连接减少后续 POST 的开销。文档还预告未来版本将支持Content-Encoding: zstd的请求体压缩。四、检索 APIGET /collections —— 查询 collections 与 instances返回一个列出所有命名 collection 的 JSON 对象。调用方可通过 query 参数collection-name把结果限定到单个 collection。响应示例{ collections: { collection1.yourcompany.com: { instances: { logid.PublicID: { first-seen: timestamp, size: 4096 }, logid.PublicID: { first-seen: timestamp, size: 512000, orphan: true } } } } }其中 instance 以 public ID 为键orphan: true标记未被 adopt 的孤儿实例。GET /c/collection_name —— 查询已存储的日志可调用的 query 参数instances—— 零个或多个 instance限定结果范围time-start—— 要包含的最早日志时间以下三选一time-end—— 要包含的最新日志时间max-count—— 最大返回条数用于分页stream—— 布尔值保持响应挂起、像tail -f一样持续推送日志与time-end不兼容。两种响应模式streamfalse单个 JSON 对象形如{ logs: [ {}, {}, ... ] }header 字段在原文档中标注为 TODO。streamtrue响应先给出一个与存储格式类似的 JSON header 对象随后是逐行一个的 JSON 日志对象{...}服务端持续发送直到客户端关闭连接。五、配置 API对少量 instance 的组织配置 API 最好由受信任的人工操作者通常通过 GUI调用instance 数量多的组织则需要自动化 token 创建。POST /collections —— 创建或删除 collection调用方必须设置collection属性以及actioncreate或actiondeleteform 编码或 JSON 编码均可。字符集限制为[a-zA-Z0-9-_.]。collection 名是全局命名空间通常就是一个域名。POST /instances —— 将 instance adopt 进 collection必须发送以下属性form 或 JSON 编码collection—— 合法 FQDN[a-zA-Z0-9-_.]instances—— instance 的 public IDhex 编码。collection 名必须已被调用方所属的 group 认领。(collection-name, instance-public-ID)这一对可能已经有关联日志、也可能还没有。失败时返回 4xx/5xx 状态码和{error: what went wrong}。六、客户端侧实现仓库内 logtail 库如何对接这套 API以上接口的 Go 客户端就在仓库中可作为接口语义的逐条印证。URL 构造与写入路径config.go 定义了DefaultHost log.tailscale.com和Config结构体字段与 API 概念一一对应Collectioncollection 域名、PrivateID写入用的私有 ID、CopyPrivateID一个覆盖本日志流的超集流的私有 ID、BaseURL留空时回落到默认 host等。logtail.go 的 NewLogger 中可以直接看到文档中POST /c/collection-name/private-ID路由的客户端形态url: cfg.BaseURL /c/ cfg.Collection / cfg.PrivateID.String() urlSuffix,若设置了CopyPrivateID还会附加?copyId...查询参数把同一批日志复制到超集流中。批量数组格式与大小约束drainPending 证实了文档中批量消息是 JSON 数组的说法客户端把缓冲行拼成[开头、,分隔、]结尾的数组一次性上传。相关常量maxSize 256 10单条日志及单次上传体的上限 256KiBmaxTextSize 16 10纯文本日志的上限超出的部分会被截断并在字符串末尾追加省略标记见 appendTruncatedStringlowMemRatio 4低内存模式下上述上限除以 4倾向多次小批上传而非攒大请求避免 OOM。Buffer抽象buffer.go是一个环形缓冲TryReadLine读出日志行无数据返回 nil、关闭返回 io.EOF默认的MemoryBuffer以容量 256 的 channel 实现低内存模式为 64。logtail 保留属性的客户端侧强制文档规定logtail对象内只能出现client_time客户端库同样执行该规则。appendMetadata 会写入client_timeRFC3339Nano、proc_idConfig.IncludeProcID时为进程生成的一次性随机 ID、proc_seqIncludeProcSequence时的进程内自增序号以及出错时的error.detail/error.bad_data子字段。appendTextOrJSONLocked 则实现了客户端消息中保留logtail属性的语义若用户传入的 JSON 对象自身含有顶层logtail键库会将其剥离并改写为logtail: {error: {detail: duplicate logtail member, bad_data: ...}}——这与文档中多余 logtail 属性被移入 error 字段的服务端规则互为镜像。压缩、重试与网络感知upload 对应文档预告的Content-Encoding: zstd当Config.CompressLogs开启且响应体压缩后确有收益节省超过 64 字节扣除头部开销时会附带Content-Encoding: zstd与Orig-Content-Length头上传 zstd 帧。失败重试遵循标准语义响应非 200 时解析Retry-After头作为等待时长缺失时回退到 30~60 秒的随机退避每次上传带 45 秒超时。库还会通过 netmon/eventbus 感知网络是否可达awaitInternetUp断网时暂停上传并等待internet back up事件正好呼应文档中尽快 POST 以降低丢日志概率的建议——缓冲 唤醒机制让写操作不因网络阻塞。刷新延迟与关闭语义config.go 中defaultFlushDelay 2 * time.SecondFlushDelayFn可自定义返回 0 或负值立即上传正值则按该延迟攒批。Logger.Shutdown会阻塞式地完成剩余上传受传入 context 控制Close是它的废弃别名Disable()则可以在进程生命周期内全局停止上传。七、Sliver 中的实际落点tsnet 传输如何间接使用 logtailSliver 自身代码并未直接 importtailscale.com/logtail而是经由tailscale.com/tsnet间接触达该服务这决定了它的定位logtail 在 Sliver 中服务于tsnet/Tailscale 传输通道而不是 Sliver 自身的审计日志后者走server/log/下的本地审计与日志轮转。server/transport/tailscale.go 实现了 tsnet gRPC 监听要求环境变量TS_AUTHKEY在tsnet应用目录下创建tsnet.Server并Listen出 gRPC 端点。被依赖的 tsnet.go 在启动时构建logpolicy.Config并调用logtail.NewLoggerL749-L777集合名使用logtail.CollectionNode即tailnode.log.tailscale.io见 config.go日志写入通过logf委托给s.logtail.Logf并在退出时执行logtail.Shutdown。因此阅读 api.md 时应把握两点适用前提其一该接口是 Tailscale 官方日志服务的公有 API 规范base URL 与认证方式以文档为准其二在本仓库的语境下它是 tsnet 传输组件的遥测通道开发者若需要为 Sliver 配置 Tailscale 传输只需关注TS_AUTHKEY与 tsnet 目录logtail 的写入行为由依赖库自动完成。八、小结数据模型Collection域名全局命名空间需先注册→ Instance每台写日志的机器一个private/public 双 IDprivate ID 只留本机用于写入public ID 配合 API key 用于读取与 adopt未 adopt 的日志 12 小时后删除。存储POST /c/collection/private-ID单对象或对象数组logtail为保留属性当前仅client_time非法内容被降级为logtail.error并返回 4xx。检索GET /collections查拓扑GET /c/collection按instances/time-start加time-end/max-count/stream分页或流式拉取。配置POST /collections建/删 collectionPOST /instances完成 adopt。仓库内的 logtail.go、config.go、buffer.go 是这套接口的完整参考客户端Sliver 通过 tsnet 集成 在 tsnet 传输中实际使用它。赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐微服务容器日志paascloud-master中日志轮转配置微服务容器日志paascloud master中日志轮转配置 在分布式微服务架构中日志管理是保障系统稳定运行的关键环节。paascloud master作为后端微服务电商认证鉴权Druid连接池日志配置详解日志输出优化Druid连接池日志配置详解日志输出优化 引言 在数据库应用开发中连接池是提升性能和可靠性的关键组件。Druid德鲁伊作为阿里巴巴开源的数据库连接池不数据库后端微服务容器日志paascloud-master中Docker日志驱动配置微服务容器日志paascloud master中Docker日志驱动配置 日志架构概述 paascloud master作为Spring Cloud微服务架构后端微服务电商认证鉴权上一篇Android Debug Database混淆映射文件终极指南mapping.txt深度解析与实战应用下一篇antd Badge dot 模式详解无数字小红点的显示规则、源码实现与样式定制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Hippy-Vue 终端扩展组件详解:animation、dialog、swiper 与 waterfall 的完整用法及源码解析

Hippy-Vue 终端扩展组件详解:animation、dialog、swiper 与 waterfall 的完整用法及源码解析

跨平台移动开发前端 【免费下载链接】Hippy Hippy is designed to easily build cross-platform dynamic apps. 👏 项目地址: https://gitcode.com/gh_mirrors/hi/Hippy 点击查看 免费下载 扩展组件(Native Components)是 Hippy …

2026/9/25 3:28:49 阅读更多 →
oh-my-opencode-slim 内置工具与能力全景:apply_patch 救援、webfetch 增强、结构化代码搜索与后台任务控制

oh-my-opencode-slim 内置工具与能力全景:apply_patch 救援、webfetch 增强、结构化代码搜索与后台任务控制

人工智能AI AgentAgent 编排AI 技能 【免费下载链接】oh-my-opencode-slim Lean, fine tuned Opencode multi agent suite Mix any models Auto delegate tasks 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim 点击查看 免费下载 oh-my-openc…

2026/9/25 3:28:49 阅读更多 →
AdminJS useResource Hook 完全指南:从 Redux 资源状态中按 ID 获取 ResourceJSON

AdminJS useResource Hook 完全指南:从 Redux 资源状态中按 ID 获取 ResourceJSON

后端低代码 【免费下载链接】adminjs AdminJS is an admin panel for apps written in node.js 项目地址: https://gitcode.com/gh_mirrors/ad/adminjs 点击查看 免费下载 useResource 是 AdminJS 前端内置的一个 React Hook,用于从 Redux Store 中按资…

2026/9/25 3:28:49 阅读更多 →

最新新闻

Word表格自动上浮与跨页断行问题的根源与解决

Word表格自动上浮与跨页断行问题的根源与解决

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:44:15 阅读更多 →
AfKayAs.2远控木马深度解析:从样本结构到检测规则

AfKayAs.2远控木马深度解析:从样本结构到检测规则

拿到这个样本的时候,我习惯性地先看了一眼文件哈希,然后在沙箱里丢了一把。AfKayAs.2这个名字,在威胁情报社区里其实不算陌生,它是某个远控木马家族的升级变种,前一代AfKayAs.1曾经在不少攻防演练和真实攻击场景里出现…

2026/9/25 6:44:15 阅读更多 →
Atlas 300V 24G部署YOLOv5实战:从模型转换到推理调优

Atlas 300V 24G部署YOLOv5实战:从模型转换到推理调优

1. 先说结论:Atlas 300V 24G到底是什么卡做AI应用这两年,总有人问我类似的选型问题:“预算有限,想上国产推理卡,Atlas 300V 24G能不能买?”“它到底算不算一张运算加速卡,还是只是个带显存的视频…

2026/9/25 6:44:15 阅读更多 →
Atlas 300V部署YOLOv5全流程实战:从环境搭建到性能调优

Atlas 300V部署YOLOv5全流程实战:从环境搭建到性能调优

1. 先搞清楚一件事:Atlas 300V到底是不是"运算加速卡"先回应那个热搜词——很多人拿到Atlas 300V,第一反应是"这玩意是不是类似一张NVIDIA显卡?能不能直接拿来跑CUDA?"答案是:能跑推理&#xff0c…

2026/9/25 6:44:15 阅读更多 →
FPGA配置Flash烧录与擦除实操指南:SPI协议、JEDEC命令与Vivado实战

FPGA配置Flash烧录与擦除实操指南:SPI协议、JEDEC命令与Vivado实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:44:15 阅读更多 →
CTF入门实战复盘:从图片隐写到栈溢出的解题思路

CTF入门实战复盘:从图片隐写到栈溢出的解题思路

SUSCTF 2018那场比赛的周末,我是从一道Misc题开始的。当时刚入CTF圈不久,最大的感受是:题目不会按你“擅长”的来,但如果你能把每道题的思路记录下来,后面进步会很快。这篇做题记录不是完整题解,更像是我个…

2026/9/25 6:43:14 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →