Log4j2实战指南:异步日志、性能调优与故障排查全解析
你有没有遇到过这种情况单机日志打印频率一高接口响应时间直接翻倍排查线上问题的时候发现关键日志因为之前的日志太多被刷掉了项目想迁移到新日志框架又怕搞坏现有系统。如果这些场景你都经历过那Log4j2日志框架这期内容应该能对症下药。Log4j2是Apache Log4j的升级版本也是目前Java生态里综合能力最强、性能表现最突出的日志框架之一。它最核心的价值不只是换个日志库而是解决了传统日志方案在三个维度的痛点高并发下的性能损耗、运行时动态调整日志级别、多业务线日志隔离。适合正在维护老项目、准备做日志改造或者想从头搭建一套靠谱日志基建的开发者参考。我写这篇文章不会去空谈特性列表而是从实际工程落地出发把选型思路、配置细节、性能参数、踩坑实录全部拆开讲透看完基本可以直接照着做。1. Log4j2的定位与选型理由1.1 为什么是Log4j2而不是logback很多项目还在用logback甚至老项目还在用Log4j 1.x。问团队里的开发为什么这么选答案多半是框架是别人搭好的或者Spring Boot默认就是logback。但日志框架这个看似不起眼的基础设施恰恰是最值得花时间替换的组件之一。Log4j2相比logback有几个让我愿意为它做迁移的理由。第一是性能。Log4j2官方在低并发场景下和logback差距不算悬殊但一旦并发写入量上来Log4j2的异步日志吞吐量可以做到logback的数倍以上。这个差距的来源不是简单的用异步队列就能解释的关键在于Log4j2在底层用了一种无锁设计——它基于Disruptor环形缓冲区而不是JDK自带的ArrayBlockingQueue。Disruptor的设计思想是避免锁竞争和伪共享配合线程间的无锁通信把日志事件从业务线程传递到IO线程的损耗降到极低。第二是自动重载配置。生产环境遇到日志级别需要临时调整Log4j2支持监控制定配置文件并自动重载。这在排查线上偶发问题时非常救命——不需要重启应用只需要把logger级别从INFO调到DEBUG几秒钟后就生效了。logback也有类似功能但Log4j2做得更细可以精确到单个Appender的配置变更监听。第三是Lambda延迟求值。Log4j2允许你写logger.debug(() - buildComplexMessage())这种形式只有当级别真正匹配时才会执行消息构造逻辑。这句代码能省下的性能相当可观——业务系统里大量的日志消息是字符串拼接的结果如果用普通写法即使日志级别不输出拼接动作也会执行。如果你所在的项目已经全面拥抱Spring Boot迁移Log4j2需要做的是排除spring-boot-starter-logging里的logback依赖再引入log4j2-slf4j-impl适配包工作量并不大。带来的收益却非常直接性能、灵活度、安全补丁跟进速度全都会上一个台阶。1.2 两个异步概念的本质区别在Log4j2里有两种异步模式很多初次接触的人会混淆这里一定要理清楚。一种叫做异步Appender。它的工作方式是业务线程把日志事件放入一个队列后台专门有IO线程负责从队列中取数据并写入文件或其他目标。这种方式能明显降低日志对业务线程的阻塞因为业务线程只要完成了入队动作就可以继续执行不再需要等待磁盘写入完成。另一种叫做异步Logger。它的实现走的是Disruptor环形缓冲区整个日志事件从产生到交给IO线程业务线程几乎没有任何加锁动作。异步Logger是Log4j2宣称的高性能核心也是官方强烈推荐的模式。异步Appender的队列在BlockingQueue层面仍然需要一定的同步开销而异步Logger通过无锁数据结构彻底绕开了这个瓶颈。如果只从字面理解你可能会觉得既然要异步直接配置异步Logger就行了。但在实际生产环境里这两者往往需要配合使用外层用异步Logger来处理高并发场景下的日志产生内层再给某些特殊Appender独立配置异步策略避免单个Appender写入太慢拖垮整体。至于什么时候只用一种、什么时候两种叠用后面在配置实例里我会给出明确的判断依据。2. 核心API与配置文件四件套2.1 Logger / Appender / Layout / Filter 的角色分工Log4j2的配置体系可以总结成四件套Logger负责决定哪些日志需要记录、记录到什么级别Appender负责把日志输出到哪儿——文件、控制台、远程接口都可以Layout负责决定日志的展示格式Filter负责在日志事件进入Logger或Appender之前做一道拦截。很多人在配置文件里看到一长串XML就头大其实只要抓住这四类元素的职责读配置就变成了一件很自然的事。Logger与Appender之间通过name关联Logger可以引用一个或多个Appender。Appender会指定自己的LayoutLayout里用各种占位符拼出最终要写入的文本。这里的核心思维是分层Logger是逻辑出口Appender是物理出口。把这两层分开设计后业务代码里不需要关心日志到底写到哪个文件、什么格式这些全部是配置层面的决定。这也是为什么跨团队协作时日志框架往往被抽取成公共模块——底层细节收敛业务方只需要对着Logger命名规范写代码。2.2 一份真实的生产配置拆解下面这份配置是我在某个高并发交易系统里实际使用的配置的简化版本完整度足够支撑大多数业务场景?xml version1.0 encodingUTF-8? Configuration statusWARN monitorInterval30 Properties Property namelogPath/data/logs/app/Property Property namepattern%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %logger{36} - %msg%n/Property /Properties Appenders Console nameConsole targetSYSTEM_OUT PatternLayout pattern${pattern}/ /Console RollingRandomAccessFile nameMainFile fileName${logPath}/app.log filePattern${logPath}/app.%d{yyyy-MM-dd}.%i.log.gz PatternLayout pattern${pattern}/ Policies TimeBasedTriggeringPolicy interval1 modulatetrue/ SizeBasedTriggeringPolicy size200MB/ /Policies DefaultRolloverStrategy max30/ /RollingRandomAccessFile /Appenders Loggers AsyncLogger namebusiness levelinfo includeLocationfalse AppenderRef refMainFile/ /AsyncLogger Root levelinfo AppenderRef refConsole/ AppenderRef refMainFile/ /Root /Loggers /Configuration拆开看几个要点。RollingRandomAccessFile是Log4j2官方推荐的随机访问文件Appender它维护一个缓冲区只在缓冲区满或定时触发时才真正刷盘性能比普通FileAppender好很多。在日志写入非常频繁的场景这个Appender是最优先的选择。TimeBasedTriggeringPolicy负责按时间滚动SizeBasedTriggeringPolicy负责按大小滚动。两者叠加的效果是任何条件先满足都会触发一次滚动。filePattern里用了%i和.gz%i是滚动的序号gz后缀意味着旧日志会被压缩归档对于磁盘空间紧张的服务非常实用。monitorInterval30是自动重载配置的关键。这个值表示Log4j2每30秒检查一次配置文件是否变更如果发现变更就重新加载。排查线上问题时你只需要改配置文件里的level30秒内生效完全不需要重启应用。2.3 异步配置的完整落地参数刚才那套只是最基础的异步Logger用法。如果要真正发挥Log4j2的性能优势还需要理解四个关键参数。系统属性log4j2.contextSelector需要设置为org.apache.logging.log4j.core.async.AsyncLoggerContextSelector这一步是很多配置异步Logger不生效的最常见原因。没有这个设置即使写了AsyncLogger标签日志实际上还是同步处理的。Disruptor的环形缓冲区大小由系统属性log4j2.asyncQueueFullPolicy和log4j2.ringBufferSize控制。ringBufferSize默认是256KB个槽位注意不是256KB大小而是2^N个槽位在高并发场景通常建议调到1024或者2048。如果缓冲区满了会怎么样默认情况下业务线程会阻塞等待有空间腾出来。这个阻塞行为很容易被忽视但正好是保护机制——它保证了日志不会被无限丢弃代价是极端情况下日志成为性能瓶颈。includeLocation这个属性很值得单独说。当它设为true时Log4j2会记录代码位置信息类名、行号定位问题非常方便但代价是额外的栈回溯开销。在高吞吐的异步场景我建议明确关闭它。如果确实需要行号信息可以搭配log4j2.enableThreadLocals进行权衡或者只在特定的调试Logger里打开。还会有一个看起来很小但对线上影响很大的参数log4j2.discardThreshold。这个参数配合DiscardingAsyncQueueFullPolicy使用定义了当缓冲区消耗到一定比例时开始丢弃低级别日志。默认是0.8即缓冲区被占到80%就放弃TRACE和DEBUG级别的事件。这个机制让系统在极端情况下依然能保证ERROR级别的日志优先输出我认为这是Log4j2里最被低估的保护性设计。3. 多业务日志隔离与高性能落地3.1 按业务拆文件的Logger命名实践一个大型应用往往同时承载多个业务用户下单、支付回调、消息推送、定时任务各有关键日志。如果全部打在一个日志文件里不仅文件巨大而且定位困难。用Log4j2做日志隔离核心思路是按照Logger name做切分。实践中我采用的方式是设置多个AsyncLogger每个logger对应一个业务域例如namebiz.order、namebiz.payment、namenotify.push。然后在Appenders里为每个业务准备独立的文件Appender通过AppenderRef与Logger关联。业务代码里就用LoggerFactory.getLogger(biz.order)来拿Logger注意这里不是传类名而是传业务域标识。日志隔离一定会牺牲一部分开发便利性——你不能再随手传一个当前类名就能让日志自动归到对应的文件。但换来的收益是运维效率的显著提升对账排查只看订单日志、追溯支付链路只看支付日志不需要在几十GB的总日志文件里做全文检索。隔离粒度需要克制不要拆得太细。我见过有人把每个模块都拆成一个独立文件最后产生上百个日志文件反而让运维抓瞎。比较合理的做法是以业务流程中线为维度合并所有同类流程比如订单全链路一个文件而不是下单一个文件、取消一个文件。3.2 日志脱敏与条件输出日志内容里最容易踩的坑是敏感信息比如手机号、身份证、银行卡号。在接入Log4j2改造时脱敏应该是优先处理的安全动作。Log4j2提供了RewriteAppender机制可以在日志事件真正写入之前对消息内容做改写。常见的做法是自己实现一个RewritePolicy通过正则表达式匹配敏感字段并用星号替换。这套机制的好处是侵入性很低——业务代码完全不需要感知脱敏逻辑只改配置文件就能让所有落盘日志经过处理。实际落地时要注意性能问题。正则脱敏在流量大时会成为CPU热点我建议两点一是不要对全量日志做脱敏只对包含明显敏感字段模式的日志做匹配通过Filter先做一次粗筛二是优先使用预编译Pattern而非String.matches这种每次重新编译的方式。条件输出也值得提一句。Log4j2支持在Logger上配置LevelRangeFilter或自定义的Filter实现类似这个Logger只输出WARN以上级别或者满足订单号前缀的才记录这样的精细化控制。它的灵活性让日志策略可以写得非常贴近业务规则而不是一刀切地按全局级别来控制。3.3 性能调优参数与RingBuffer取舍很多人以为Log4j2只要启用异步就完事大吉但实际生产里想把性能调稳还需要做一轮取舍思考。RingBuffer调大意味着系统能承载的日志突发量更大但占用的内存也随之上涨。每个槽位占用的内存近似等于一个日志事件对象本身及它引用的消息字符序列估算时可以按每个事件200字节左右做粗糙计算。4096个槽位大约就是0.8MB的内存占用这在多数应用里完全可以接受。如果你用的是Java 11以上的ZGC或者JDK 17的虚拟线程环境内存约束会更宽松可以放心把缓冲区调大。另一个容易忽略的参数是waitStrategy。Disruptor默认的BlockingWaitStrategy在CPU资源充裕时性能很好但它会让消费者线程在等待时进入阻塞状态导致CPU核数的利用率波动。如果在容器环境里CPU配额被限制得很紧可以考虑换成YieldingWaitStrategy用自旋换阻塞吞吐量会更平滑。代价是CPU占用会高一些相当于用CPU时间换确定性延迟。我见过一个实际案例应用升级到Log4j2后吞吐上去了但监控显示GC次数明显增多。原因就是日志对象创建频率太高大量短生命周期对象涌入新生代。解决办法不是去改Log4j2而是调整自己的业务代码——大量字符串拼接日志消息时改用它提供的lambda形式同时把MessageFormat这类昂贵的消息模板替换成Log4j2的Message封装。Java里每个StringBuilder的创建都会造成垃圾压力减少无谓的字符串创建对整个JVM的稳定性帮助很大。4. 典型故障排查实录4.1 日志丢失问题接到过不少同事反馈某些日志在量大时偶尔会丢。排查的第一反应是看是否启用了异步Logger以及log4j2.enableThreadLocals是否被意外关闭。线程上下文信息在这个开关关闭时不会传递但更常见的原因是缓冲区溢出后的丢弃策略。前面提到的discardThreshold默认是0.8。当缓冲区空间不足时低级别日志会被主动丢弃来保证高级别日志能写入。如果你的业务对日志完整性要求很高比如审计日志这里有两个方向要么把logger级别配置得更高——直接不输出DEBUG和TRACE从源头减少进入缓冲区的数据量要么自定义AsyncQueueFullPolicy改为坚持全部阻塞直到有空间。对审计而言日志完整性比系统吞吐更重要选择后者更合适。还有一类假丢失特别容易误判。旧日志被Rolling策略滚动后标准化清理策略会删除过期文件。有些团队配置了30份保留数量、但按小时滚动日志文件很快就写满30份最老的被删除看起来就像丢了日志。我建议滚动策略以时间维度为主、大小维度为辅而且保留文件数要结合磁盘容量预留至少两倍余量避免磁盘满员导致写入失败。4.2 日志阻塞业务线程生产环境最怕的是日志从辅助设施变成服务中断的元凶。这类故障的典型特征是接口平均响应时间突然大幅升高线程池活跃度异常日志里大量出现AsyncLogger thread相关堆栈。定位思路很直接先看是否有大量日志事件阻塞。如果是异步模式下的环形缓冲区写满业务线程会在append方法上等待。再用jstack抓取线程快照关注业务线程栈里是否出现Log4j2的RingBuffer等待逻辑。如果确认是环形缓冲区容量不足优先调大ringBufferSize而不是关闭异步来治疗症状。同时检查磁盘IO。日志写入其实是一连串磁盘操作如果数据盘本身IOPS已经耗尽异步IO线程会卡住缓冲区自然加速堆积。这类问题最气的点是它往往由别的模块引发——比如某次全量数据同步导致磁盘写入暴增结果把日志线程堵住了。所以排查时不能只盯着Log4j2自己的参数一定拉上磁盘监控一起看。我自己的习惯是任何日志配置变更上线前都要把磁盘IO的基线数据记录一遍出了问题才对比得出来。4.3 磁盘打满的治理脚本日志是最容易被忽略的磁盘占用大户。曾经一个服务因为日志文件写满整块磁盘直接导致整个节点进入只读状态。治理方案分成两层。第一层是Log4j2内部的滚动压缩配置这能减少单文件的体积膨胀速度。第二层是操作系统的定时清理任务用crontab脚本扫描日志目录超过保留天数的文件直接删除。注意压缩与清理脚本的动作要配合好如果Log4j2已经设置了.gz压缩清理脚本只需要匹配.gz文件就行不匹配原始.log文件。有一个细节容易踩坑任何日志框架都不会删除正在写入的文件。如果清理脚本把当前正在写入的日志文件误删了Log4j2的RollingRandomAccessFile会继续持有旧文件句柄日志会写入到一个已被删除的文件里磁盘空间不会释放新日志也无法落盘。为了避免这种情况清理脚本建议带上一个滞后时间比如只清理超过一天的文件给正在写入的日志一个切换窗口。暂时没有条件重启文件的场景可以通过配置DailyRollingFile配合TimeBasedTriggeringPolicy在午夜之后自然滚动到新文件此时旧文件已经不再被持有清理起来就没有任何问题。4.4 版本安全漏洞修复记录Log4j2曾经的远程代码执行漏洞是绕不开的话题。虽然现在已经有了很多修复版本但大量老项目还是在用2.14之前的版本风险至今仍然存在。这类漏洞的本质是JNDI查找机制允许日志消息内容触达外部远程地址配合某些环境下的类加载方式可以形成攻击链。修复方案在官方发布补丁后已经很明确升级Log4j2版本至少到2.17系列之后的稳定版本如果暂时无法升级对应的临时缓解手段是设置系统属性log4j2.formatMsgNoLookups为true从根本上禁用消息查找。更稳妥的做法是两个动作同时做因为修复版本里还包含了很多后续的安全加固。团队做安全排查时可以用依赖分析工具找出项目依赖树里的Log4j2传递依赖。这里有个很容易被忽略的点Spring Boot的老版本间接依赖了log4j-to-slf4j它用的是旧版Log4j API单独升级核心包还不够必须把boot版本或显式覆盖的版本统一升上去否则依赖树里仍然存在多个版本补丁形同虚设。5. 日志体系的进阶设计5.1 从单机日志走向集中式日志Log4j2本身只是日志产生端但一个完整的日志基建绝对不能止步于本地文件。当实例数量增长到二三十个以上挨个登录机器看日志已经完全不可行集中式日志收集和分析就是必然走向。常见的方案是日志通过Appender里的HttpAppender或SocketAppender直接发送到日志采集端或者更常见的做法是本地落盘后由Filebeat这类采集器进行收集然后送入检索集群。两者的取舍在于耦合度直接发送会让Log4j2配置依赖下游可用性网络抖动时可能出现日志堆积或丢失先落盘再采集的模式在故障容忍性上明显更好代价是本机磁盘占用会增加一些。我个人更推荐后者原因很简单日志采集链路不该影响主服务的稳定性。Log4j2配置里做一次直发改造非常轻量但一旦下游系统出问题接收端反压过来整个服务就会被拖下水。落盘模式虽然看起来多一步但是真正生产环境出事故时本地文件是最可靠的回溯来源。5.2 全局日志ID串联与追踪除了集中化另一个值得投入的改造是基于MDC实现全链路日志追踪。Log4j2的ThreadContext是对应SLF4J MDC的实现把TraceID塞进ThreadContext后后续所有日志都会带上这个标识整套请求的处理过程能在日志系统中被完整串联起来。在异步Logger场景下ThreadContext的传递需要注意。因为异步模式下日志事件是在另一个线程中被处理的所以上下文需要从业务线程保证传递到消费线程。使用Log4j2自带的AsyncLogger时ThreadContext的传递是自动完成的这一点比其他框架处理得更完善。如果从Web请求入口拦截器里注入TraceID配合网关层提前生成的唯一编号排查一个跨多模块的慢请求时会非常轻松。实际的实践效果是在集中式日志平台搜索TraceID就能把整个调用链从入口到出口的日志全部拉出来聚合耗时自动计算。这个能力的价值不会立刻体现在业务指标上但每次线上故障排查节省的时间足以覆盖整套改造的投入成本。5.3 我最后想分享的几个心法如果让我给正在规划日志改造的开发者几个建议排名第一的是先明确你要排查什么问题、要维持什么样的性能水位再决定配置方案。把日志框架当成单纯的打印工具来对待后面一定会为这个认知买单。第二是关于异步的胆量。很多人知道异步Logger好但上线前又不敢真正打开。我的做法是在一个低风险服务上先做灰度配合压测脚本观察吞吐指标确认日志不再是性能瓶颈后再推全量。日志组件最大的特点是出故障时特别安静只要它没拖垮系统大家就感受不到它的存在这正是它该有的样子。第三是配置管理方式。配置别散落在各个服务各自的XML里最好收拢成公司内部的基础组件由专职的小组持续维护。Log4j2的强大来自配置的灵活度但这种灵活度对业务团队来说反而是负担——让专业的人处理专业的事业务研发只需要知道该用哪个Logger名字就够了。日志这件事做到最后你会发现它不只是技术问题更是一种工程习惯。每一次日志改造的收益都要等到线上真正遇到疑难杂症时才会被验证。希望这篇文章能让你对Log4j2有更立体的理解也能在动手改造之前少踩几个我自己踩过的坑。

相关新闻

Linux eBPF Security Tracer 架构深度解析:从内核 tracepoint 到用户空间检测引擎的完整设计

Linux eBPF Security Tracer 架构深度解析:从内核 tracepoint 到用户空间检测引擎的完整设计

【免费下载链接】Cybersecurity-Projects Building 70 Projects ranging from beginner to advanced so anyone can — learn from, build upon, use as a reference, or even copy directly. Gamified Cybersecurity learning 👇 项目地址: https://git…

2026/10/9 2:15:27 阅读更多 →
Sapling 测试体系全指南:从 .t 测试到 Rust/Python 测试的编写规范

Sapling 测试体系全指南:从 .t 测试到 Rust/Python 测试的编写规范

开发工具CLI后端 【免费下载链接】sapling A Scalable, User-Friendly Source Control System. 项目地址: https://gitcode.com/gh_mirrors/sa/sapling 点击查看 免费下载 本篇技术指南围绕 Sapling(开源的可扩展、易用的源码控制系统)的测试…

2026/10/9 2:15:27 阅读更多 →
为 models.dev 设计安全的自动化 PR 审查 Agent:pr-reviewer 的职责、判定规则与实现剖析

为 models.dev 设计安全的自动化 PR 审查 Agent:pr-reviewer 的职责、判定规则与实现剖析

人工智能大模型后端前端 【免费下载链接】models.dev An open-source database of AI models. 项目地址: https://gitcode.com/gh_mirrors/mo/models.dev 点击查看 免费下载 models.dev 是一个开源的 AI 模型数据库,仓库以 AGENTS.md 作为权威的模型/Pr…

2026/10/9 2:15:27 阅读更多 →

最新新闻

基于氢燃料电池下垂控制的直流微网与电机驱动系统

基于氢燃料电池下垂控制的直流微网与电机驱动系统

在新能源微电网向高效化、清洁化升级的背景下,氢燃料电池以零排放、能量密度高、续航能力强的核心优势,成为直流微网分布式供电的核心单元,其输出电压的稳定性直接决定微网供电可靠性与负载运行安全性。在传统电池稳电压的直流微网系统中&…

2026/10/9 2:46:44 阅读更多 →
LangChain 从入门到实战(08):让模型「说人话还附出处」——检索增强 RAG(下)

LangChain 从入门到实战(08):让模型「说人话还附出处」——检索增强 RAG(下)

LangChain 从入门到实战(08):让模型「说人话还附出处」——检索增强 RAG(下) 上一篇我们把私有文档切块、向量化、存进了 Chroma 向量库(建库完成)。这一篇做「问答下半场」:每次提问,先从库里检索出最相关的小块,拼进 prompt,再让模型基于资料作答——还带来源出处…

2026/10/9 2:46:44 阅读更多 →
LangChain 从入门到实战(06):模型只会动嘴?给它一双手——工具调用

LangChain 从入门到实战(06):模型只会动嘴?给它一双手——工具调用

LangChain 从入门到实战(06):模型只会动嘴?给它一双手——工具调用 前面 5 篇的模型都「只会嘴上说说」:你问 1+1,它背话术;你问杭州天气,它答非所问,因为它根本拿不到真实数据。这一篇讲 LangChain 最出圈的能力——工具调用(Tool Calling):让模型「伸手调用一个…

2026/10/9 2:46:44 阅读更多 →
LangChain 从入门到实战(07):让它「读」你的私有文档——检索增强 RAG(上)

LangChain 从入门到实战(07):让它「读」你的私有文档——检索增强 RAG(上)

LangChain 从入门到实战(07):让它「读」你的私有文档——检索增强 RAG(上) 模型再强,也只学过公开数据;你的公司文档、产品手册、用户手册,它一概不知。这一篇开始处理让模型「看得见你的私有知识」。RAG(Retrieval-Augmented Generation,检索增强生成)是眼下最主流…

2026/10/9 2:46:44 阅读更多 →
22 Java 做 AIGC:Spring AI 还是 LangChain4j?调 API 还是私有化?

22 Java 做 AIGC:Spring AI 还是 LangChain4j?调 API 还是私有化?

面试官翻了翻项目经历,问了一个看似随意、其实很能分辨人的问题:"你这个 AI 知识库项目,后端用的什么框架?""Spring AI。"候选人答得很干脆。"为什么用它,而不是 LangChain4j?&qu…

2026/10/9 2:46:44 阅读更多 →
潜水泵控制器原理选型与安装维护指南

潜水泵控制器原理选型与安装维护指南

一、潜水泵应用中面临的行业痛点 潜水泵大量应用于地下集水坑排水、基坑排水、深井取水、污水提升、建筑地下车库等场景。潜水泵长期浸泡在水下,现场环境潮湿恶劣,传统继电器控制方案存在不少现实问题: 1.人工值守效率低:需要人员…

2026/10/9 2:45:44 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →