Zephyr日志系统全解:从printk到logging的工程实践
做Zephyr嵌入式开发迟早会遇到一个问题printk已经挺好用了为什么项目里还要特意引入一套日志系统logging这篇文章是Zephyr调试系列的第五篇我打算把Zephyr logging从概念、配置、运行、踩坑一次讲透。Zephyr的logging不是换个打印函数那么简单它包含编译期裁剪、运行时过滤、多后端输出、异步缓冲、panic日志保存等一整套机制。如果你正从裸机开发切到RTOS或者被现场设备日志搞到头大这篇应该能帮你省下不少调试时间。先说结论Zephyr logging最核心的价值有三个——可裁剪、可过滤、可多路输出。可裁剪指编译期就能把不需要的日志代码彻底剪掉不占Flash不占CPU可过滤指模块级别和运行时级别可以动态配合想查哪里就放开哪里多路输出则意味着同样的日志可以同时进串口、日志文件、网络远端而不是只能绑死在某一个console上。理解了这三点后面所有配置都围绕它们展开。1. 日志系统在Zephyr里的位置从printk到logging的转变1.1 printk不是不能用而是组合拳打不齐很多从裸机转过来的工程师习惯是哪里要调试就在哪里塞一个printk(...)。单看功能printk确实简单直接但如果项目规模到了一定程度你会很快撞到几堵墙输出没有分级错误、警告、普通信息全混在一起日志一多根本不知道哪里是重点。没有模块归属一个工程里十几个文件都在打印串口终端里完全看不出是哪块代码输出的。开关不灵活想关掉某个模块的调试信息得去改代码改了还要重新编译烧录。后端单一基本上就是往UART控制台写想同时存一份到Flash里做故障分析得自己重写输出函数。高频打印会影响中断和调度printk默认是同步输出在需要快速响应的外设中断里频繁调用轻则拖慢时序重则导致任务超时。这不是说printk一无是处。在启动早期、系统还没起来的时候printk依然是最可靠的兜底工具。但作为一个长期维护的项目日志这种基础设施必须把自己从“临时调试工具”上升到“系统组件”的层面。1.2 logging v2带来的设计变化Zephyr的日志子系统经历过一次比较大的重构。早期的legacy logging版本更多是对printk做封装功能上有分级、有模块名但后端扩展和异步能力都比较受限。后来重做成了logging v2整个设计思路变成“消息”而不是“打印”。logging v2核心变化可以概括为几块日志内容先被组装成一个log_msg消息再由后端决定怎么消费。这就把“产生日志”和“输出日志”两个环节解耦了。后端注册机制变得更规范UART、Shell、RTT、网络、文件系统、Flash都可以挂到同一套日志框架下。支持同步immediate、延迟deferred、最小minimal三种处理模式让开发者根据项目实时性要求和内存预算去选。配套了运行时的过滤机制不用重编译就能动态修改日志级别。和系统panic、coredump做了联动故障发生时有专门的日志兜底路径。刚开始接触这套机制时会觉得Kconfig选项特别多有点吓人。但多恰恰是因为它可以按项目裁剪。Zephyr面向的场景从几十KB内存的BLE传感器到带MPU和Linux的复杂SoC都有日志系统如果做成固定一套反而没法用。1.3 日志系统实际解决的三个问题我自己的体会是Zephyr logging在项目里真正解决的是三个具体问题第一个是排查问题时的“颗粒度”问题。模块有temperature_sensor、ble_conn、power_manager出问题先看是哪个模块在报错再针对性打开对应的DEBUG级别思路清爽很多。第二个是上线后的“现场取证”问题。设备部署到客户现场出问题时不可能叫人带着仿真器过去。有日志系统配合后端把最近的运行记录保存下来拿回来一分析基本上能还原事故前后的流程。第三个是“性能可控”问题。普通打印看着无害但在高负载任务里每多一次格式化和串口输出都是一笔不小的CPU开销。logging的异步模式把“产生日志”变成“拷贝消息”任务侧可以很快返回真正的串口输出放到后台线程去做。这在大数据量调试时特别有用。2. 项目配置的骨架prj.conf里的开关到底该怎么开2.1 最基础的配置样例Zephyr里大部分能力都靠Kconfig开关控制logging也是一样。一个最小的、能立刻跑起来的基础配置通常长这样CONFIG_LOGy CONFIG_LOG_MODE_IMMEDIATEy CONFIG_LOG_BACKEND_UARTy CONFIG_LOG_DEFAULT_LEVEL3 CONFIG_LOG_RUNTIME_FILTERINGy逐行解释一下CONFIG_LOGy打开日志子系统。CONFIG_LOG_MODE_IMMEDIATEy选择同步模式调用日志函数时直接格式化并输出到后端。这是最直观、最不容易出问题的模式开发初期建议先用它。CONFIG_LOG_BACKEND_UARTy挂一个UART后端日志最终通过串口打印出来。CONFIG_LOG_DEFAULT_LEVEL3系统默认日志级别。级别数字对应关系是1ERR2WRN3INF4DBG。设成3表示默认允许输出ERR、WRN、INF三种DBG被编译期排除。CONFIG_LOG_RUNTIME_FILTERINGy打开运行时过滤能力允许在不重编译的情况下通过Shell命令调整日志级别。这套配置适合大多数开发板烧进去以后用LOG_INF、LOG_WRN、LOG_ERR就能看到带级别和模块名的输出了。2.2 按项目阶段去调编译期级别CONFIG_LOG_DEFAULT_LEVEL是编译期的全局默认级别但它不是唯一的级别控制点。实际工程里一般还要结合开发阶段决定开发调试阶段建议设成4DBG不放过任何细节。联调测试阶段可以降到3INF保留流程信息但减少抓屏噪声。量产固件阶段推荐先保持在2~3同时预留运行时过滤开关。这样万一外场出问题还能通过远程方式临时拉高日志级别而不是直接改代码发布一个新固件。量产的日志级别不是越低越好关键是要让“可诊断性”保留在那里。完全关掉日志看起来节省资源但一旦外场故障只能干瞪眼。2.3 模块注册级别和代码写法在代码里每个使用日志功能的源文件最开始要注册模块名。最常见的写法是#include zephyr/logging/log.h LOG_MODULE_REGISTER(app_main, LOG_LEVEL_INF);LOG_MODULE_REGISTER的第一个参数是模块名也是后面日志前缀中显示的名字第二个参数是当前模块的编译期级别。这里有个很容易被忽略的坑如果注册级别设成了LOG_LEVEL_INF那么即使全局配置允许DBG这个模块里的LOG_DBG也不会被编译进去。反过来如果注册级别设为LOG_LEVEL_DBG但是全局CONFIG_LOG_DEFAULT_LEVEL3那么DBG也不会被编译。实际生效的是两者中更严格的那个。跨文件共用一个模块名时要在其他文件里用LOG_MODULE_DECLARE声明不需要重复注册LOG_MODULE_DECLARE(app_main, LOG_LEVEL_INF);这种设计的好处是整个模块日志级别统一控制坏处是如果忘记声明编译器会直接报错告诉你不认识LOG_INF这些宏。第一次在Zephyr里写日志的朋友遇到这种报错通常不是没包含头文件而是模块没有声明或注册。2.4 后端组合的选择日志后端决定了“日志最后去哪”。我接触过的典型组合有这么几类纯开发板调试UART后端就够了简单可靠。量产设备现场维护UART后端 Shell后端。Shell后端让你能在设备上敲命令直接看日志状态、改日志级别。需要故障复盘加一个存储后端比如把日志循环写到Flash分区设备死机后重启读取。远程监控接网络后端把日志通过TCP或UDP发到上位机。后端之间不冲突可以同时挂多个。但每个后端都会在输出时产生开销尤其多个后端都做同步输出代价会叠加。我的习惯是默认只挂必要的后端另一种后端按需编译进去用Kconfig开关控制而不是全都开着。3. 运行时过滤与Shell调试不重新烧录就能调整输出3.1 运行时过滤先决条件CONFIG_LOG_RUNTIME_FILTERINGy这个开关提供了动态能力。但请注意运行时过滤再怎么调也不能突破编译期模块注册级别。通俗地说编译期决定“这个模块能输出到什么级别”运行时决定“在允许的输出级别里我现在实际开多少”。举个例子模块A注册时写的是LOG_MODULE_REGISTER(module_a, LOG_LEVEL_WRN);那么不管怎么在Shell里下发命令最多只能看到WRN和ERR两个级别。INF和DBG在编译阶段就被过滤了完全不占资源。这是省资源的好事但很多新手会误以为开了runtime filtering就可以为所欲为。我见过一个外场问题同事信誓旦旦说“我已经把日志开到DBG了怎么还是看不到”后来一查模块注册级别是WRN压根没把DBG编进固件。所以在设计初始模板的时候建议把你重点排查的模块注册级别先放开到LOG_LEVEL_DBG出厂的时候再通过运行时配置收住。这样既保留了随时深挖的能力又不会影响日常信息量。3.2 在Shell里操作日志打开Shell后端以后Zephyr会在Shell里注册一组日志命令。我手头一个Zephyr 3.x项目里常用的命令大致如下不同小版本命令格式略有差异先输入log help看当前支持的指令最稳妥log list log enable dbg log disable module_a log statuslog list列出所有已经注册的日志模块以及当前可用的级别范围。log enable dbg将运行时级别调整到DBG让那些已经编译进去的LOG_DBG开始输出。log disable module_a关掉指定模块的输出。log status查看当前各个模块实际生效的过滤级别、后端状态等。实际操作中我喜欢在程序里通过线程或事件触发来切日志级别而不用总是去Shell敲命令。比如检测到某个传感器数据异常时自动把对应模块的运行时级别抬到DBG记录一段数据后再降回去。这样可以避免日志长时间全开导致存储被刷爆。3.3 临时抓日志的有效操作路径产线或外场遇到问题时比较有效的路径是先看设备当前的状态用log status确认运行时过滤是开着的。用log list找到需要观察的模块名确认它编译期级别允许DBG。执行log enable dbg 目标模块只放开这一个模块减少噪声。让设备复现问题收集这段时间的日志。结束后立刻log disable恢复典型配置。整个过程不需要重新烧录也不需要重启设备对复现概率高的偶发问题特别有效。日志级别开放后输出内容变多存储或串口带宽可能不够所以最好只开一个可疑模块不要图省事全系统拉满。4. 同步、延迟还是最小三种日志模式的代价与选择4.1 同步模式直观但会占调用者时间同步模式CONFIG_LOG_MODE_IMMEDIATEy下调用LOG_INF这类函数时日志消息会在当前线程或中断上下文里完成格式化然后直接交给后端输出。好处是日志的实时性很好代码执行到哪条日志几乎同步打印到哪条排查顺序问题非常方便。坏处也很直接格式化字符串、逐字符送UART都是要花时间的。在高速循环里高频打印会把任务拖慢在中断里打印会拉长中断处理时间极端情况下影响实时性。所以同步模式适合开发阶段和日志量不大的产品场景。一旦日志打印频率非常高就应该认真考虑异步模式。4.2 延迟模式消息队列加后台处理线程延迟模式CONFIG_LOG_MODE_DEFERREDy的设计思路是日志调用方只负责把“日志事件”打包成一条log_msg消息放到内部缓冲区或队列里然后立刻返回。真正耗时耗力的格式化、后端输出、换行处理都交给日志处理线程通常叫LOG_PROCESS_THREAD去做。这样做的好处是业务代码里打印日志的CPU开销大幅降低日志产生速度和生产日志消费速度被解耦。即使后端串口速度较慢只要缓冲区没满业务线程都不会被阻塞。代价是需要额外内存日志缓冲区用来存放等待处理的log_msg。日志处理线程的栈空间。线程本身占的系统资源。Zephyr里跟异步相关的主要配置有CONFIG_LOG_BUFFER_SIZE、CONFIG_LOG_PROCESS_THREAD_STACK_SIZE等。缓冲区越大能吸收的日志突发量越大但内存占用也越高。处理线程栈太小格式化过程中可能出现栈溢出栈太大又浪费RAM。选型时要根据日志内容和格式化复杂度反复试验。4.3 最少模式给资源极度受限的场合最少模式CONFIG_LOG_MODE_MINIMALy是三种模式里最“抠门”的。它几乎不分配额外内存也不维护复杂的消息结构只是在调用时尽量简单地把日志内容送往后端。功能上会有所精简比如某些格式化和后端能力可能受限。这种模式适合RAM极小、Flash也极小但又确实需要日志功能的地方例如小型传感器节点、BLE Beacon设备。如果你在跑最小资源目标优先考虑这个模式。但我个人建议只要RAM还够尽量不要在产品里用最少模式因为可诊断性太弱了出Bug时几乎没有回旋余地。4.4 内存开销应该怎么算延迟模式的缓冲区配置是很多人容易拍脑袋的地方。我习惯按“每秒最大日志量 × 短时突发倍数”来估算假设一条LOG_INF日志经过格式化后产生一个大约48字节的log_msg。如果程序在高负载时每秒产生50条日志突发时达到每秒200条而处理线程能在几十毫秒内消费完那么设置CONFIG_LOG_BUFFER_SIZE4096可能就足够装下突发数据了。但具体还得看处理线程优先级和后端速度特别是后端UART波特率如果只有115200每秒理论最多传输约11.5KB线程消费跟不上缓冲区迟早被填满。一个更稳妥的做法是先开一个足够大的缓冲区让项目跑起来观察log status里是否有丢弃统计增长再逐步调小找到满足需求的最小值。直接开一个看起来很大的缓冲区往往浪费不少RAM而日志系统又属于“每个字节都很心疼”的子系统。4.5 在中断上下文里打日志要注意什么Zephyr的日志API是可以在中断上下文里调用的这是它比很多裸机打印方案强的地方。但我仍然建议中断里尽量少打印尤其是不要高频打印。延迟模式下中断里调用日志只是拷贝消息相对安全同步模式下中断里打印会直接占用中断处理时间影响系统实时性。如果一定要在中断里记录事件可以考虑用一个极简的标记消息比如只打一个LOG_WRN事件编号避免在中断里做复杂的字符串格式化。5. 我在实际项目里踩过的logging坑与排查链路5.1 过滤不生效先查两个开关现象在Shell里执行了log enable dbg代码里的LOG_DBG还是不输出。排查链路先确认CONFIG_LOG_RUNTIME_FILTERINGy在编译配置里生效了。用west build -t menuconfig看一眼很多小版本默认把运行时过滤关掉。再确认模块的注册级别。LOG_MODULE_REGISTER(module_x, LOG_LEVEL_DBG)至少要到DBG否则DBG代码没被编进去。然后确认该模块有没有被完整编译链接进固件。有些文件被条件编译排除在外面注册了模块但实际没参与构建log list里能看到名字但状态很奇怪。最后检查Shell命令格式是否真的选中了目标模块。有些版本里log enable dbg是全局的后面加模块名才是单模块生效。整个过程看起来琐碎但九成问题出在编译期级别和runtime filtering开关这两个点上。先用log status把当前实际生效的级别看清楚再去做判断比自己瞎猜快得多。5.2 异步模式下日志“丢”了不是代码写错现象切换到CONFIG_LOG_MODE_DEFERRED后程序高负载运行时部分日志缺失丢失的节点正好出现在高频打印那段逻辑里。这个问题本质上就是日志缓冲区在突发流量下溢出了。延迟模式下日志调用方只负责把消息放入缓冲区如果缓冲已满新消息会被丢弃而业务代码不知道。排查时先确认是不是丢在缓冲区不是丢在后端用log status看有没有计数器在增长。不少后端和日志核心会维护丢弃计数。把CONFIG_LOG_BUFFER_SIZE调大观察丢日志现象是否缓解。如果调大后仍然丢说明消费线程跑不赢产生速度。这时要么提高日志处理线程优先级要么降低日志产生速率要么换同步模式。同步模式虽然占用业务时间但不会出现“调用后消息被悄悄扔掉”的问题。我那个项目最后是把高频循环里的逐条日志改成聚合日志每100ms汇总一次数据再打一条LOG_INF丢日志问题彻底消失。日志量少了缓冲区压力小了后端串口也轻松了。5.3 循环打印Hex数据格式化开销超出想象有个常见误区想打印一串接收缓冲区的原始数据很多人会写for (int i 0; i len; i) { LOG_INF(0x%02x, data[i]); }这段代码如果len是几百字节产生的log_msg数量会非常惊人每条都有独立的格式化开销同步模式下更是灾难。Zephyr日志系统专门提供了十六进制转储接口LOG_HEXDUMP_INF(data, len, rx packet);一次调用就能按行打印整个缓冲区的十六进制内容内部只格式化当前一行不需要生成几百个消息。如果项目要抓协议数据优先用这类接口。我在协议栈调试里把循环打印替换成LOG_HEXDUMP_DBG之后日志量直接下降一个数量级定位效率反而更高了。5.4 输出格式里的颜色控制串口工具会头晕开发时为了让不同级别日志带颜色往往把后端彩色输出打开。看着是舒服但把日志存下来用脚本分析时一堆转义字符混在文本里非常难处理。生产环境或需要自动化解析日志时建议把彩色输出关掉保留干净的时间戳、模块、级别、正文四列格式。如果编辑器的颜色能起到提示作用完全可以在上位机里做不必污染数据本身。6. 把日志作为系统基础设施后端扩展与panic兜底6.1 系统崩溃时最后一条日志要能出来做嵌入式最难受的情况是设备死机了日志也看不了。Zephyr日志系统在panic路径上有专门考虑。系统进入异常后日志处理会切换到一个更可靠的路径尽量把还留在缓冲区里的日志输出出去而不是依赖可能已经被破坏的调度器和线程机制。要让这一层起作用关键的配置点是保证挂了一个能在panic时可靠工作的后端比如UART后端。在配置里打开panic相关的日志处理选项。不要在日志输出里去访问已经失效的外设状态。如果项目有死机复盘需求我强烈建议在开发早期就把panic日志流程调通并且做一次真实死机测试。比如写一个故意触发断言或非法访问的代码路径确认最后几条日志能完整打印出来。等到现场出问题再去补配置再调后端就太被动了。6.2 自定义后端的切入思路有些项目要把日志送到私有协议或特殊硬件上Zephyr允许自己写一个log_backend挂进去。大致步骤是实现后端需要的回调比如初始化、写消息、处理panic等。定义一个log_backend实例并注册到日志系统中。用Kconfig或代码开关控制这个后端是否编译。实际后端实现会涉及日志核心内部结构比如log_msg如何解析、格式化回调用哪些接口。想写自己的后端比较好的办法是拿官方UART后端或Shell后端当模板把其中调后端接口的地方替换成自己的输出函数。我不建议从零开始读所有日志核心代码那样效率很低。6.3 日志和coredump的组合用法Zephyr里日志系统可以跟coredump配合使用。coredump负责保存系统异常时的CPU寄存器快照和内存现场日志系统负责保存最近发生的事情。一个是“硬件状态”一个是“软件轨迹”结合起来往往能直接定位到异常发生前的最后动作。我的习惯是在配置里同时保留coredump后端和日志存储后端。设备崩溃后重启先把coredump数据导出来再抓取最近一段日志先看软件轨迹走到哪一步再看寄存器状态是否和某个中断或任务切换吻合。这套组合对分析hardfault类问题非常高效比单纯靠打印覆盖到崩溃点要可靠得多。6.4 日志模板应该从一开始就定下来做项目时最怕日志格式临时拼凑今天写“当前值是%d”明天写“value%d\r\n”等日志量大了脚本根本没法解析。Zephyr本身提供了统一的格式前缀我建议在此基础上再约定几个关键字段时间戳、模块名、级别、事件编号或上下文。只要每个模块都按同一个模板写日志后续不管是人工看还是脚本分析都能很快入手。我在一个Cortex-M项目里做过一次统计把散落的printk统一迁移到Zephyr logging之后不仅日志分辨率清清爽爽现场问题的定位时间也从原来的按天算缩短到按小时算。这不是玄学而是因为日志有了级别、模块、过滤机制和统一格式之后排查问题从“猜”变成了“看”。如果你还在用最原始的方式打日志值得花一个下午把Zephyr logging这套配置跑通后面会省出更多时间。

相关新闻

基于MP2642与STM32的储能电池主动均衡方案设计与实现

基于MP2642与STM32的储能电池主动均衡方案设计与实现

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

2026/10/17 10:00:52 阅读更多 →
机器人模型选型:WM世界模型、WAM动作生成与VLA端到端架构解析

机器人模型选型:WM世界模型、WAM动作生成与VLA端到端架构解析

这两年机器人圈最常挂在嘴边的三个缩写,大概就是 WM、WAM 和 VLA。我刚入行那会儿,这些词还没这么火,大家更多在调机械臂的逆解、写阻抗控制;现在不一样,随便一个 Demo 都敢说自己用了大模型,仿佛不谈 VLA …

2026/10/17 10:00:52 阅读更多 →
Python多进程共享List/Dict的5种方案与避坑指南

Python多进程共享List/Dict的5种方案与避坑指南

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

2026/10/17 10:00:52 阅读更多 →

最新新闻

反转链表详解:三指针迭代与递归回溯,附高频变体

反转链表详解:三指针迭代与递归回溯,附高频变体

有一道题,看起来不超过十行,却常年挂在算法面试和在线判题平台的热门榜单上,那就是 反转链表 。我见过不少朋友在数组上玩得很溜,交换两个元素用中间变量一气呵成,可一碰到链表就莫名发怵:数组可以通过下…

2026/10/17 10:40:07 阅读更多 →
私人 AI 随身带!OpenClaw+cpolar 外网访问完整教程:把 endpoint 改到 TaoToken

私人 AI 随身带!OpenClaw+cpolar 外网访问完整教程:把 endpoint 改到 TaoToken

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

2026/10/17 10:40:07 阅读更多 →
虚拟机安装报错怎么办?从虚拟化开关到系统配置的完整排错指南

虚拟机安装报错怎么办?从虚拟化开关到系统配置的完整排错指南

先说明一下,每隔一段时间就会在相关社区和群聊里看到类似的提问:“虚拟机安装出现了问题”“虚拟机装到一半报错”“开了虚拟机就黑屏”……每次去回答的时候,总会发现一个共同点:大家说的“装虚拟机”其实是两种完全不同的操作&a…

2026/10/17 10:40:07 阅读更多 →
独立的AI编程助手正在消失?从文心快码并入百度搭子、Qwen Code转向CLI,看编程工具正被吸收进更大的智能体平台——用TaoToken统一Key打通CLI与平台侧调用

独立的AI编程助手正在消失?从文心快码并入百度搭子、Qwen Code转向CLI,看编程工具正被吸收进更大的智能体平台——用TaoToken统一Key打通CLI与平台侧调用

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

2026/10/17 10:40:07 阅读更多 →
RabbitMQ实战:从Java客户端到SpringBoot集成的消息队列全攻略

RabbitMQ实战:从Java客户端到SpringBoot集成的消息队列全攻略

做后端开发的这些年来,RabbitMQ是我用得最频繁的中间件之一。不管是订单超时关闭、异步写日志、还是高并发场景下的削峰填谷,消息队列在分布式系统里几乎是无处不在的基础设施。很多同学看到RabbitMQ的官方文档就头大,概念太多、术语太绕&…

2026/10/17 10:40:07 阅读更多 →
纯Go代码生成彩色SVG图形:零依赖实现数据可视化

纯Go代码生成彩色SVG图形:零依赖实现数据可视化

1. 为什么用 Go 来画 SVG 而不是直接截图很多人第一次听到“用 Go 画 SVG”都会愣一下:画图不是前端的事吗,或者干脆用 Python 的 matplotlib 出图不香吗?我一开始也是这么想的,直到手上一个后端服务需要每天定时生成一批带数据的…

2026/10/17 10:39:06 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →