SkyWalking日志收集实战:三种模式详解与Filebeat集成指南
1. 项目概述为什么我们需要在SkyWalking中收集日志如果你正在使用SkyWalking做分布式链路追踪那你一定遇到过这样的场景一个线上接口报错你通过Trace ID在SkyWalking的UI上快速定位到了出问题的服务和方法链路图清晰地告诉你调用链在哪个节点“断”了。但然后呢你只知道“这里错了”却不知道“为什么错”。是参数不对是数据库连接超时还是下游服务返回了意外的数据这时候你只能再去翻看对应服务器上那浩如烟海的日志文件用那个Trace ID去grep过程繁琐且割裂。“SkyWalking 日志收集”要解决的正是这个“最后一公里”的问题。它的核心目标是将业务日志与链路追踪数据在同一个上下文中关联起来实现从“发现问题节点”到“洞察问题根因”的无缝衔接。简单说就是让SkyWalking不仅能告诉你“病”在哪儿还能把“病历”详细的日志直接呈现在你面前。这不仅仅是运维效率的提升更是故障排查范式的一次升级。对于开发、测试和运维同学而言这意味着再也不用在多个系统间反复横跳在一个面板上就能完成从宏观链路到微观日志的完整诊断。2. 核心设计日志收集的三种主流模式与选型考量SkyWalking本身并不直接生产或存储业务日志它的角色是一个“收集器”和“关联器”。因此如何将散落在各处的日志“喂”给SkyWalking就成了方案设计的核心。根据日志产生的位置和收集的时机主要有三种模式。2.1 模式一通过Agent的gRPC通道实时上报这是最“原生”、集成度最高的方式。SkyWalking的探针Agent在拦截应用代码时除了收集链路Trace和指标Metrics数据还可以通过其内置的日志库如skywalking-log4j-2.x、skywalking-logback-1.x等插件直接采集应用打印的日志。采集到的日志会通过Agent已有的gRPC通道与Trace和Metrics数据一并上报给后端的OAP Server。优点无侵入性对应用代码几乎零改动只需在日志配置文件中引入SkyWalking的Appender。自动关联由于日志收集和链路追踪在同一Agent进程内Trace ID、Segment ID、Span ID的上下文自动关联是天生的准确率100%。实时性强日志产生后几乎立即上报。缺点与考量性能影响日志数据量可能巨大尤其是DEBUG级别日志全开时通过gRPC实时上报会对应用性能网络I/O、序列化和OAP Server负载造成显著压力。数据冗余所有日志无论是否必要都被上报可能包含大量无用的调试信息。适用场景最适合日志量不大、但对排查实时性要求极高的核心业务应用。生产环境务必谨慎评估日志级别和采样率。实操心得我们曾在预发环境对某个QPS较高的服务开启全量INFO日志上报导致该服务CPU使用率上升约8%同时OAP Server的堆内存增长明显。后来我们调整为只上报WARN和ERROR级别日志并针对特定关键业务方法开启采样上报问题得到缓解。这告诉我们“全量”和“实时”在日志收集场景下往往是昂贵的。2.2 模式二将日志输出到文件由Filebeat等采集器推送这是目前生产环境最主流、最稳健的方案。应用按照原有方式将日志输出到本地文件如JSON格式并必须包含traceId字段。然后使用轻量级的日志采集器如Elastic Stack中的Filebeat、Fluentd、Fluent Bit或Logstash来“尾随”这些日志文件并将其推送到SkyWalking OAP Server提供的日志HTTP接收接口/v3/logs。优点解耦与稳定日志收集链路与业务应用、SkyWalking核心链路追踪链路完全解耦。即使OAP Server短暂不可用日志仍安全地存在于本地磁盘采集器会重试。资源消耗可控采集器通常比业务应用更擅长处理I/O密集型任务对应用本身性能影响极小。灵活性高可以在采集端Filebeat进行丰富的过滤、解析、富化比如添加主机标签操作只将有用的日志转发出去。缺点与考量关联依赖规范必须确保业务日志的格式中包含Trace ID。这需要开发同学在打印日志时主动从MDCMapped Diagnostic Context或类似上下文中获取并写入日志模板。这是该方案成功的关键前提。延迟稍高存在文件缓冲、采集器轮询间隔带来的延迟通常是秒级对于绝大多数排查场景可以接受。部署复杂度需要在每台服务器上多部署和维护一个采集器进程。2.3 模式三通过Kafka等消息队列异步传输这是一种适用于大规模、复杂日志管道的架构。应用将日志带Trace ID写入本地文件Filebeat采集后不直接发送给OAP而是先发送到Kafka集群。然后可以由一个独立的消费者服务或使用Logstash从Kafka消费日志再发送给SkyWalking OAP。SkyWalking OAP本身也支持从Kafka直接消费日志。优点高吞吐、高可靠Kafka能应对海量日志洪峰起到削峰填谷的作用保证日志不丢失。多路复用一份日志可以同时被多个消费者使用如同时给SkyWalking、Elasticsearch和长期存储实现数据价值最大化。架构清晰在大规模微服务体系中这是标准的可观测性数据管道。缺点与考量系统复杂度最高引入了Kafka集群的运维成本。链路更长端到端延迟进一步增加。选型建议当你的服务实例数量超过百台日均日志量达到TB级或者已有成熟的Kafka日志管道时此方案是自然演进的选择。如何选型对于大多数团队我推荐从模式二Filebeat直推开始。它在复杂度、可靠性、性能和实时性之间取得了最佳平衡。模式一适合轻量级试验或特定场景模式三则是大规模、成熟技术团队的进阶选择。3. 核心细节解析让日志与链路“血脉相连”的关键无论选择哪种模式让日志能够正确关联到链路的核心就在于上下文传递。这需要应用、日志框架和采集器三方协同。3.1 应用侧如何将Trace ID打入日志以Java Logback Spring Boot为例这是最常见的组合。依赖引入首先确保引入了SkyWalking的日志插件。dependency groupIdorg.apache.skywalking/groupId artifactIdapm-toolkit-logback-1.x/artifactId version${skywalking.version}/version /dependency配置Logback在logback-spring.xml中使用SkyWalking提供的%tidTrace ID和%sw_ctx其他上下文转换词。configuration appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender file./logs/app.log/file encoder classch.qos.logback.core.encoder.LayoutWrappingEncoder layout classorg.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout pattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} - %msg%n/pattern /layout /encoder !-- 滚动策略省略 -- /appender root levelINFO appender-ref refFILE/ /root /configuration关键就在[%tid]它会在每次日志事件发生时自动从当前线程的SkyWalking上下文中获取Trace ID。如果你的日志需要输出为JSON格式以便Filebeat解析可以使用JSONLayout并确保包含tid字段。异步场景下的挑战与解决Trace ID是存储在ThreadLocal中的。当遇到异步线程如Async、线程池、消息监听时上下文会丢失。解决方案是使用SkyWalking的RunnableWrapper或CallableWrapper对任务进行包装。// 错误示例直接提交Trace ID会丢失 executorService.submit(() - log.info(async task)); // 正确示例使用Wrapper包装 import org.apache.skywalking.apm.toolkit.trace.RunnableWrapper; executorService.submit(RunnableWrapper.of(() - log.info(async task with traceId)));3.2 采集器侧Filebeat的关键配置假设我们已将日志输出为JSON格式每行一条记录其中包含traceId字段。Filebeat的配置核心是filebeat.yml。filebeat.inputs: - type: filestream enabled: true paths: - /your/app/logs/*.log json.keys_under_root: true # 解析JSON日志 json.add_error_key: true fields: service: your-service-name # 添加服务名标签 environment: production output.http: hosts: [http://your-oap-server:12800] path: /v3/logs method: POST headers: Content-Type: application/json # SkyWalking OAP日志接口需要认证头如果开启 # headers: # Authentication: Bearer your-token这里有几个关键点json.keys_under_root: true将JSON日志的字段展开到顶层这样traceId就能被OAP直接识别。fields可以在这里添加静态的、有助于筛选的标签如服务名、环境。这些信息会出现在SkyWalking UI的日志查询条件中。output.http直接指向OAP Server的日志接收端点默认端口12800。3.3 OAP Server侧日志分析器的配置OAP Server收到日志后需要知道如何解析出traceId等字段以进行关联。这通过log-analyzer-${provider}.yml文件配置。默认使用lalLog Analysis Language作为分析引擎。你需要创建或修改config/log-analyzer-lal.ymlrules: - name: default_json_log_analysis dsl: | json.parsing(..., abortOnFailure: false) filter { text.tag({ “service”: “${service}“, // 来自Filebeat的fields “instance”: “${instance}“, “endpoint”: “${endpoint}“, “traceId”: “${traceId}“, // 从日志JSON中提取的traceId “timestamp”: “${timestamp}“, // 日志时间戳 “level”: “${level}“, “content”: “${message}“ }) } sink: | // 将处理后的日志转发到存储层 log.toLog()这个配置告诉LAL引擎将输入视为JSON进行解析然后提取出我们关心的字段并打上标签最后交给日志存储处理器。其中${traceId}就是关联链路的关键。4. 实操过程从零搭建Filebeat到SkyWalking的日志收集让我们以一个具体的Spring Boot应用为例完成一次端到端的配置。4.1 第一步应用改造与日志输出引入依赖如上文所述在pom.xml中添加apm-toolkit-logback-1.x依赖。配置Logback使用下面的logback-spring.xml配置输出为JSON格式。?xml version1.0 encodingUTF-8? configuration appender nameJSON_FILE classch.qos.logback.core.rolling.RollingFileAppender file./logs/myapp.log/file rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePattern./logs/myapp.%d{yyyy-MM-dd}.log/fileNamePattern maxHistory7/maxHistory /rollingPolicy encoder classnet.logstash.logback.encoder.LogstashEncoder includeContextfalse/includeContext includeMdctrue/includeMdc fieldNames timestamptimestamp/timestamp messagemessage/message levellevel/level threadthread/thread loggerlogger/logger version[ignore]/version levelValue[ignore]/levelValue /fieldNames customFields{service:user-service,env:dev}/customFields !-- 关键将MDC中的traceId输出到JSON -- provider classnet.logstash.logback.composite.loggingevent.LoggingEventPatternJsonProvider pattern{traceId:%mdc{tid}}/pattern /provider /encoder /appender root levelINFO appender-ref refJSON_FILE / /root /configuration这里使用了logstash-logback-encoder来输出JSON。关键在于LoggingEventPatternJsonProvider它将MDC中键为tidSkyWalking自动注入的值作为traceId字段写入每行JSON日志。验证日志输出启动应用触发一个请求查看./logs/myapp.log文件。你会看到类似这样的输出{timestamp:2023-10-27T10:00:00.12308:00,level:INFO,message:User login successfully,thread:http-nio-8080-exec-1,logger:com.example.UserController,service:user-service,env:dev,traceId:1a2b3c4d5e6f7890.1.1234567890000}注意traceId字段已经存在。4.2 第二步部署与配置Filebeat下载安装在应用所在的服务器上从Elastic官网下载对应系统的Filebeat。编辑配置文件修改filebeat.yml。filebeat.inputs: - type: filestream id: user-service-logs enabled: true paths: - /path/to/your/app/logs/myapp*.log parsers: - ndjson: # 使用ndjson解析器处理每行一个JSON对象的情况 target: # 解析到根目录 overwrite_keys: true add_error_key: true fields: service: user-service layer: backend oap_host: your-oap-server-ip fields_under_root: true # 将fields中的字段提升到根 # 可选为了调试可以先输出到控制台 # output.console: # pretty: true output.http: hosts: [http://${oap_host}:12800] path: /v3/logs method: POST headers: Content-Type: application/json这里使用了ndjson解析器它比通用的json解析器在处理行分隔的JSON时更高效。fields_under_root: true确保我们添加的service、layer标签能被OAP直接使用。启动Filebeat./filebeat -c filebeat.yml -e使用-e参数将日志输出到控制台便于初期调试。观察控制台输出确认日志被成功读取并发送。4.3 第三步配置SkyWalking OAP Server确保日志接收功能开启在OAP的application.yml中检查以下配置通常默认开启receiver-otel: default: enabled: true # 日志接收器配置 logs: enabled: true配置LAL分析规则在OAP Server的config目录下创建或修改log-analyzer-lal.yml。内容可以复用前面提到的DSL规则确保字段名如traceId与日志JSON中的字段名匹配。重启OAP Server使配置生效。4.4 第四步在SkyWalking UI中验证访问SkyWalking UI。触发一个包含日志输出的请求。在“追踪”页面找到对应的链路点击一个Span。在右侧的详情面板中你应该能看到一个“日志”标签页。点击它所有携带了相同traceId的日志条目都会在这里按时间顺序列出。你也可以在“日志”主菜单页面直接通过traceId或service等条件搜索日志。至此一个完整的、基于Filebeat的日志收集与关联链路就打通了。5. 常见问题与排查技巧实录在实际落地过程中你几乎一定会遇到下面这些问题。这里是我的排查清单和解决思路。5.1 问题一SkyWalking UI上看不到日志这是最常见的问题。请按照以下步骤排查检查日志源头首先确认应用是否真的打印了日志并且日志文件中有traceId字段。查看应用日志文件用grep搜索traceId看其值是否为空或格式是否正确。检查Filebeat状态运行./filebeat test output测试到OAP的网络和HTTP接口是否通畅。查看Filebeat自身的日志默认在/var/log/filebeat/或控制台输出看是否有发送错误如4xx/5xx状态码。常见的401/403错误可能是OAP开启了认证但未在Filebeat中配置Authentication头。使用./filebeat keystore list确保${oap_host}等变量已正确设置。检查OAP Server接收查看OAP Server的日志logs/oap.log搜索/v3/logs看是否有请求记录或错误信息。确认OAP的receiver-otel日志接收器已启用。确认log-analyzer-lal.yml配置文件位置正确且语法无误。一个快速验证的方法是临时在OAP的application.yml中开启调试日志logging.level: DEBUG然后观察日志处理过程。检查存储与查询确保你使用的存储后端如Elasticsearch有对应的日志索引并且数据已写入。在SkyWalking UI的“日志”页面尝试不添加任何条件进行查询看是否有任何日志数据。5.2 问题二日志与链路关联不上现象是日志和链路都存在但点击Span的日志标签页是空的或者用traceId查不到日志。字段名不匹配这是头号杀手。请仔细核对应用日志JSON中的字段名比如你用的是traceid、trace_id还是traceId大小写和下划线必须完全一致。Filebeat的fields_under_root和解析器确保traceId字段在解析后位于JSON的根层级。OAP LAL规则中的变量名在log-analyzer-lal.yml的DSL中${traceId}这个变量名必须与JSON根层级的字段名匹配。建议在所有环节统一使用traceId这个字段名。Trace ID格式或值异常检查日志中的traceId值是否是一个完整的SkyWalking Trace ID如1a2b3c4d5e6f7890.1.1234567890000。在异步场景下如果未使用RunnableWrappertraceId可能为空或是一个错误的值。时间范围问题SkyWalking UI查询日志有默认的时间范围。如果你的日志时间戳与OAP服务器时间有较大偏差可能导致查询不到。确保服务器时间同步NTP。5.3 问题三日志量过大影响性能在应用源头控制日志级别生产环境避免使用DEBUG级别上报。在Logback配置中可以为SkyWalking的Appender单独设置级别过滤器。采样SkyWalking Agent支持日志采样。在agent.config中配置agent.log.sample_rate1000表示每1000条日志采样1条。对于高流量服务这是必须的。# 在 skywalking-agent.config 中 agent.log.sample_rate${SW_AGENT_LOG_SAMPLE_RATE:1000}在采集端过滤利用Filebeat的processors在发送前丢弃不需要的日志。例如只发送ERROR和WARN级别的日志。processors: - drop_event: when: not: or: - equals: level: ERROR - equals: level: WARN调整OAP处理能力如果OAP是瓶颈可以考虑水平扩展OAP Server节点或者调整日志处理相关的线程池参数如receiver-otel下的gRPC/HTTP线程数。5.4 一个高效的调试技巧使用tcpdump或curl直接模拟发送当怀疑是Filebeat配置或网络问题时可以绕过Filebeat直接用curl命令向OAP发送一条日志这是最直接的验证方法。构造一条符合格式的JSON日志数据保存为test-log.json。[ { traceId: 1a2b3c4d5e6f7890.1.1234567890000, service: manual-test-service, instance: test-host, endpoint: /test, body: { content: This is a test log message for debugging. }, timestamp: 1698379200000 } ]注意OAP的/v3/logs接口期望的是一个日志对象数组。使用curl发送。curl -X POST http://your-oap-server:12800/v3/logs \ -H Content-Type: application/json \ -d test-log.json观察OAP日志和UI。如果这条测试日志能收到那么问题一定出在Filebeat或应用日志生成环节。日志收集是SkyWalking从“可追踪”迈向“可观测”的关键一步。它填平了链路与详情之间的鸿沟。实施过程就像搭积木每一步都需要严丝合缝应用要正确注入上下文日志格式要统一规范采集器要准确解析服务端要能正确关联。一旦跑通你会发现排查问题的视野被彻底打开那种在一个界面里顺藤摸瓜、直达病灶的流畅感会让之前所有繁琐的跨平台查询变得不堪回首。我的建议是从一个非核心但日志规范的服务开始试点搞定整个流程积累下像上面提到的那些“坑”和技巧然后再逐步推广到全站。

相关新闻

LLM智能体中的贪婪策略:为什么迭代优化是高效决策的默认选择

LLM智能体中的贪婪策略:为什么迭代优化是高效决策的默认选择

1. 从直觉到实践:为什么“贪婪”是智能体的默认强策略? 在构建基于大语言模型(LLM)的智能体(Agent)时,我们常常面临一个核心的架构选择:如何设计智能体的决策与行动循环?…

2026/10/15 16:07:02 阅读更多 →
Linux运维实战:深入解析WWN/WWID原理与多场景应用

Linux运维实战:深入解析WWN/WWID原理与多场景应用

1. 为什么需要关注WWN号:不止是“查一下”那么简单 在Linux服务器运维、存储网络(SAN)规划或者虚拟化平台迁移的场景里,你肯定不止一次遇到过需要确认某块磁盘“身份”的时刻。比如,当你需要将一台物理服务器上的数据盘…

2026/10/15 8:47:25 阅读更多 →
虚拟机管理从入门到精通:Hypervisor选型、性能调优与自动化实践

虚拟机管理从入门到精通:Hypervisor选型、性能调优与自动化实践

1. 从“能用”到“好用”:虚拟机管理的核心价值再认识提到虚拟机管理,很多朋友的第一反应可能就是装个VMware或者VirtualBox,然后创建几个虚拟机跑跑测试。这确实是虚拟机管理最基础的应用,但如果你只停留在这个层面,那…

2026/10/15 2:46:48 阅读更多 →

最新新闻

涡格法计算气动力MATLAB:从机翼升力线算错说起

涡格法计算气动力MATLAB:从机翼升力线算错说起

简介:这份资源面向航空航天、流体力学方向的学生与工程师,提供涡格法(VLM)在MATLAB环境下的气动计算实现方案,可用于翼型、机翼及飞行器的亚声速气动特性分析。涡格法将流场离散为若干涡元素,通过求解欧拉方…

2026/10/15 17:19:29 阅读更多 →
风控挖掘实战:从业务日志到黑灰产团伙识别的完整链路

风控挖掘实战:从业务日志到黑灰产团伙识别的完整链路

做风控这行,天天要面对的问题就是:怎么从动辄几亿条的业务数据里,把黑灰产那条线给拽出来。难点从来不是数据量,而是信号。黑产混在真实用户里,伪装得越来越像正常人,甚至会用真人的账号、真人的设备、真人…

2026/10/15 17:19:29 阅读更多 →
puppeteer-extra-plugin-stealth 实战指南:以插件化方式为 Puppeteer 与 Playwright 构建反检测能力

puppeteer-extra-plugin-stealth 实战指南:以插件化方式为 Puppeteer 与 Playwright 构建反检测能力

网页爬虫浏览器控制测试 【免费下载链接】puppeteer-extra 💯 Teach puppeteer new tricks through plugins. 项目地址: https://gitcode.com/gh_mirrors/pu/puppeteer-extra 点击查看 免费下载 puppeteer-extra-plugin-stealth 是 puppeteer-extra 生态…

2026/10/15 17:19:29 阅读更多 →
传球游戏从混乱到高效:一套可复用的团队协作活动设计方法

传球游戏从混乱到高效:一套可复用的团队协作活动设计方法

“传球游戏”看起来平平无奇,但只要组织过一次就会发现,越简单的游戏越容易翻车。有人站着不动,有人抱着球不放,有人传错了方向,十几个人围成一圈结果球在地上滚了五分钟。我见过太多次这样的场景,后来干脆…

2026/10/15 17:19:29 阅读更多 →
Qt背景色设置全解析:QSS、QPalette与paintEvent的优先级与实战避坑

Qt背景色设置全解析:QSS、QPalette与paintEvent的优先级与实战避坑

接了一个维护项目,需求听着特别简单:把右侧设置面板的背景改成浅灰色,再给标题文字换个颜色。我当时心想这有什么难的,QWidget 上写一句setStyleSheet("background-color: #F5F6FA")不就完事了吗。结果一跑起来&#xf…

2026/10/15 17:19:29 阅读更多 →
MATLAB常用信号处理函数清单:从FFT到滤波器实战指南

MATLAB常用信号处理函数清单:从FFT到滤波器实战指南

1. 项目概述:为什么要单独整理一份信号处理函数清单做信号处理这几年,我最大的感受就是:MATLAB的功能强大到让人眼花缭乱,但真正高频使用的函数翻来覆去就那么几十个。很多初学者最容易犯的毛病,是一上来就抱着几百页的…

2026/10/15 17:18:28 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →