Log4j2.xml配置全解析:从基础到高级实践,打造高效日志系统
1. 项目概述为什么你的日志配置总是不对劲干了这么多年Java开发我敢说十个项目里有八个的日志配置都或多或少有点问题。要么是线上出问题了找不到关键日志要么是日志文件一天就涨到几十个G把磁盘撑爆再不然就是调试信息满天飞把生产环境的日志输出搞得跟调试控制台一样混乱。很多人觉得日志嘛不就是把log4j2.xml文件从网上找个模板复制粘贴一下能打印出来不就行了结果往往是“能用”但绝对“不好用”。今天咱们就抛开那些花里胡哨的教程从一个一线开发者的视角彻底拆解log4j2.xml。我们不仅要让它“能打印”更要让它“聪明地打印”。核心目标就一个让日志在正确的时间、以正确的格式、输出到正确的地方并且不给我们添任何麻烦。这背后涉及到日志级别Level的精准控制、输出目的地Appender的灵活组合、日志格式Layout的定制以及最容易被忽视的日志上下文Context和异步日志Async的性能考量。你会发现一个精心配置的日志系统不仅是线上排查问题的“火眼金睛”更是监控系统健康度的“听诊器”。接下来我会结合最常见的坑和最佳实践带你从零搭建一个既适合开发调试又能无缝切换到生产环境的日志配置方案。2. 核心设计构建一个分层、高效的日志体系一个健壮的日志配置其设计思路应该是分层和模块化的。我们不能把所有日志都一股脑地塞进同一个文件或控制台。我的设计原则通常遵循以下几点环境隔离开发环境的日志需要详尽、可读性强便于调试生产环境的日志则需要结构化、紧凑且要严格控制输出量避免性能开销和信息过载。级别分流不同级别的日志DEBUG, INFO, WARN, ERROR应该有不同的处理方式。例如DEBUG日志只在开发环境输出到控制台ERROR日志除了写入文件最好还能实时告警。输出目的地分离通常我们会同时需要控制台输出便于本地开发查看和文件输出用于持久化存档。更复杂的场景还可能包括输出到数据库、Kafka或专门的日志收集系统如ELK栈。性能优先在高并发场景下同步写日志可能成为性能瓶颈。Log4j2的异步日志AsyncLogger是必须考虑的特性它能大幅提升性能。基于这些原则一个典型的log4j2.xml骨架会包含以下几个核心部分Configuration根节点、若干个Appender定义日志去哪、若干个Logger定义谁、在什么级别、使用哪个Appender以及将它们关联起来的Root或Logger引用。注意很多人喜欢用properties格式配置但xml格式在表达复杂的嵌套关系和过滤器Filter时更清晰、强大建议作为项目标准。2.1 配置文件的基本结构与属性解析让我们先从一个最精简但功能完整的配置模板开始然后逐一拆解。?xml version1.0 encodingUTF-8? Configuration statusWARN monitorInterval30 !-- 第一部分定义属性变量便于维护 -- Properties Property nameLOG_HOME./logs/Property Property nameFILE_NAMEmyapp/Property Property nameLOG_PATTERN%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n/Property Property nameJSON_PATTERN{time:%d{yyyy-MM-dd HH:mm:ss.SSS},thread:%t,level:%p,logger:%c,message:%m,stackTrace:%ex}/Property /Properties !-- 第二部分定义输出目的地Appenders -- Appenders !-- 控制台输出 -- Console nameConsole targetSYSTEM_OUT PatternLayout pattern${LOG_PATTERN}/ !-- 开发环境可以放开生产环境建议注释掉ThresholdFilter默认只输出INFO及以上 -- ThresholdFilter levelDEBUG onMatchACCEPT onMismatchDENY/ /Console !-- 滚动文件输出按日期和大小 -- RollingFile nameRollingFileInfo fileName${LOG_HOME}/${FILE_NAME}.log filePattern${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz !-- 过滤器只记录INFO级别更高级别的WARN/ERROR会被其他Appender处理 -- Filters ThresholdFilter levelWARN onMatchDENY onMismatchNEUTRAL/ ThresholdFilter levelINFO onMatchACCEPT onMismatchDENY/ /Filters PatternLayout pattern${LOG_PATTERN}/ Policies !-- 每天滚动一次 -- TimeBasedTriggeringPolicy interval1 modulatetrue/ !-- 单个文件超过100MB时滚动 -- SizeBasedTriggeringPolicy size100 MB/ /Policies !-- 最多保留30天的日志或总大小超过10GB则删除最老的 -- DefaultRolloverStrategy max30 compressionLevel9 Delete basePath${LOG_HOME} maxDepth2 IfFileName glob*/${FILE_NAME}-*.log.gz/ IfLastModified age30d/ !-- 可选同时限制总磁盘占用 IfAccumulatedFileSize exceeds10 GB/ -- /Delete /DefaultRolloverStrategy /RollingFile !-- 专门记录ERROR级别日志的文件 -- RollingFile nameRollingFileError fileName${LOG_HOME}/${FILE_NAME}_error.log filePattern${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}_error-%d{yyyy-MM-dd}-%i.log ThresholdFilter levelERROR onMatchACCEPT onMismatchDENY/ PatternLayout pattern${LOG_PATTERN}/ Policies TimeBasedTriggeringPolicy interval1/ /Policies DefaultRolloverStrategy max90/ !-- 错误日志保留更久 -- /RollingFile /Appenders !-- 第三部分定义日志记录器Loggers及其路由规则 -- Loggers !-- 第三方库的日志级别控制避免过于冗杂 -- Logger nameorg.apache levelWARN additivityfalse/ Logger nameorg.springframework levelWARN additivityfalse/ Logger namecom.zaxxer.hikari levelINFO additivityfalse/ !-- 业务核心包使用DEBUG级别便于追踪 -- Logger namecom.yourcompany.biz levelDEBUG additivityfalse AppenderRef refConsole/ AppenderRef refRollingFileInfo/ AppenderRef refRollingFileError/ /Logger !-- 根记录器所有未特殊指定的日志都走这里 -- Root levelINFO AppenderRef refConsole/ AppenderRef refRollingFileInfo/ AppenderRef refRollingFileError/ /Root /Loggers /Configuration关键属性解析Configuration statusWARN monitorInterval30status属性控制Log4j2自身内部日志的级别设为WARN可以避免它输出太多调试信息干扰我们。monitorInterval30是神器意味着Log4j2会每30秒检查一次配置文件是否有变化并热重载。这样你改配置就不需要重启应用了。Properties定义变量。强烈建议将路径、文件名、格式等抽取为变量一处修改处处生效。RollingFile中的filePattern$${date:yyyy-MM}中的双美元符号表示按日期创建子目录。%i是滚动索引。.gz后缀表示自动用GZIP压缩旧日志能节省大量磁盘空间。Filters过滤器是进行精细日志分流的关键。ThresholdFilter的onMatch和onMismatch属性需要理解ACCEPT立即接受不再经过后续过滤器、DENY立即拒绝、NEUTRAL不表态交给下一个过滤器决定。上面RollingFileInfo的配置逻辑是先拒绝WARN及以上级别交给其他Appender然后接受INFO级别。DefaultRolloverStrategy中的Delete这是Log4j2 2.5之后的功能允许你配置自动删除策略。比单纯设置max属性更灵活可以基于时间、大小等多个条件组合删除。Logger的additivityfalse这个属性至关重要。如果设为true默认该Logger的日志事件在传递给自身配置的Appender后还会继续向上传递给根LoggerRoot的Appender导致日志被重复记录。通常对于明确指定了Appender的Logger我们都应该设为false。3. 高级特性与场景化配置实战掌握了基础结构我们来看看如何应对更复杂的实际需求。3.1 异步日志配置用性能换响应速度在高并发场景下I/O操作写文件是昂贵的。同步日志意味着业务线程必须等待写日志操作完成才能继续这会造成延迟。Log4j2的异步日志器通过将日志事件放入一个队列由后台线程消费并写入从而解放业务线程。配置异步日志有两种方式推荐使用**全异步All Async**方式性能提升最明显。首先需要在pom.xml中引入disruptor依赖Log4j2官方推荐的高性能无锁队列实现dependency groupIdcom.lmax/groupId artifactIddisruptor/artifactId version3.4.4/version /dependency然后在log4j2.xml中将Configuration标签的status级别调低如DEBUG以观察异步初始化并添加AsyncLogger或直接使用系统属性启动。方式一混合异步配置简单在Loggers部分将需要异步的Logger配置为AsyncLogger。AsyncLogger namecom.yourcompany.biz levelDEBUG additivityfalse AppenderRef refRollingFileInfo/ /AsyncLogger方式二全异步性能最佳推荐无需修改xml配置只需在JVM启动参数中加上-Dlog4j2.contextSelectororg.apache.logging.log4j.core.async.AsyncLoggerContextSelector这种方式下所有的Logger都变成异步的。你需要特别注意队列大小AsyncLoggerConfig.RingBufferSize默认256*1024和队列满时的策略AsyncLoggerConfig.SynchronizeEnqueueWhenQueueFull默认阻塞。实操心得全异步性能虽好但在应用关闭时队列中未处理的日志事件有可能丢失。对于要求绝对不丢日志的关键应用需要在停机时调用LogManager.shutdown()或考虑使用同步日志高性能Appender的组合。对于绝大多数Web应用全异步带来的吞吐量提升远大于微小的丢失风险。3.2 结构化日志JSON输出为日志分析平台铺路当你的日志需要被ELKElasticsearch, Logstash, Kibana或Splunk等系统收集分析时JSON格式远比一行文本友好。Log4j2提供了JsonLayout。首先确保依赖中包含log4j-core和log4j-jackson用于JSON序列化。dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-core/artifactId version2.23.1/version /dependency dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-jackson/artifactId version2.23.1/version /dependency然后在Appenders中定义一个JSON格式的File AppenderRollingFile nameRollingFileJson fileName${LOG_HOME}/${FILE_NAME}.json.log filePattern${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.json.log.gz JsonLayout completefalse compacttrue eventEoltrue propertiestrue KeyValuePair keyapplication valuemy-awesome-app/ KeyValuePair keyenvironment value${sys:ENV:-dev}/ !-- 读取系统环境变量 -- /JsonLayout Policies TimeBasedTriggeringPolicy interval1/ /Policies /RollingFile在代码中你可以使用**线程上下文ThreadContext**来添加结构化字段这些字段会自动被JsonLayout捕获当propertiestrue时import org.apache.logging.log4j.ThreadContext; try { ThreadContext.put(requestId, generateRequestId()); ThreadContext.put(userId, currentUser.getId()); logger.info(用户订单查询开始); // ... 业务逻辑 logger.info(用户订单查询成功); } finally { ThreadContext.clearAll(); // 务必清理防止内存泄漏 }这样输出的JSON日志就会包含requestId和userId字段极大方便了后续的追踪Trace和聚合分析。3.3 动态日志级别调整线上问题排查的救星想象一个场景生产环境某个接口偶发报错但现有日志级别是INFO抓不到详细的DEBUG信息。重启应用调整级别风险太大。这时Log4j2的monitorInterval和Scripts支持就派上用场了。你可以配置一个特殊的HTTP端点需要log4j-web模块或使用JMX但更简单通用的是利用Script条件化配置。下面是一个示例演示如何通过判断系统属性来动态改变某个Logger的级别Configuration statusWARN monitorInterval30 Scripts Script namedynamicLevel languagejavascript![CDATA[ var env java.lang.System.getProperty(dynamic.debug); if (env ! null env.equals(true)) { // 返回一个Mapkey为Logger名value为Level对象 var Level Java.type(org.apache.logging.log4j.Level); var map new java.util.HashMap(); map.put(com.yourcompany.biz.service.OrderService, Level.DEBUG); map.put(com.yourcompany.biz.dao.OrderDao, Level.DEBUG); map; } ]]/Script /Scripts Loggers !-- 其他Logger配置 -- ScriptLogger namedynamic additivityfalse AppenderRef refConsole/ /ScriptLogger /Loggers /Configuration这个配置有点复杂更常见的做法是结合Log4j2的Lookup功能。你可以在配置文件中直接引用环境变量、系统属性从而实现动态开关。例如为控制台Appender添加一个基于环境变量的过滤器Console nameConsole targetSYSTEM_OUT PatternLayout pattern${LOG_PATTERN}/ !-- 只有当环境变量ENVdev时才在控制台打印DEBUG日志 -- Filters ThresholdFilter level$${env:ENV:-prod} levelDEBUG onMatchACCEPT onMismatchDENY/ /Filters /Console更实用的线上调试方法是利用monitorInterval和外部化配置。将日志级别配置放在一个独立的log4j2-component.properties文件里或者放在应用外部的某个目录。当需要调试时直接修改这个外部文件Log4j2会在monitorInterval周期后自动重载无需重启应用。这才是真正的“热更新”。4. 常见问题排查与性能调优实录配置写得再漂亮跑起来可能还是会遇到各种妖魔鬼怪。下面是我踩过的一些坑和解决方案。4.1 日志文件不生成或内容为空这是最常见的问题排查思路如下检查配置文件位置和名称Log4j2默认在classpath下寻找log4j2.xml。确保文件在src/main/resources目录下。对于Spring Boot还要注意其内置的日志系统可能会干扰需要排除spring-boot-starter-logging并引入spring-boot-starter-log4j2。检查status级别将Configuration statusTRACE观察控制台输出的Log4j2内部初始化信息看它是否找到了你的配置文件以及每个Logger和Appender的初始化状态。检查Logger的additivity属性如果设为true且Root Logger没有配置对应的Appender日志可能被传递到Root后就丢弃了。检查过滤器Filter仔细检查每个Appender上的ThresholdFilter确认日志级别是否匹配。一个常见的错误是在控制台配置了ThresholdFilter levelINFO .../却在代码里打logger.debug(...)那这条日志肯定看不到。文件权限问题检查LOG_HOME指向的目录应用进程是否有写入权限。4.2 日志重复打印几乎100%是因为additivitytrue默认值导致的。假设你为com.yourcompany.biz配置了一个File Appender并且additivitytrue。那么一条来自该包的日志会首先被自己的File Appender记录。然后事件继续向上传递到Root Logger。Root Logger如果也配置了Appender比如Console那么这条日志会再次被Console Appender记录一次。解决方案对于明确指定了Appender的非Root Logger一律加上additivityfalse。4.3 异步日志导致日志丢失或顺序错乱丢失日志应用崩溃或强制终止kill -9时还在内存队列Disruptor RingBuffer中的日志事件会丢失。这是异步日志的固有风险。对于关键业务日志可以考虑使用同步缓冲的组合Appender如BufferedIo或者在停机钩子Shutdown Hook中执行LogManager.shutdown()等待队列清空。顺序错乱异步日志器为了性能可能不会严格按照时间顺序将日志写入文件尤其是在多线程并发写入时。如果对顺序有严格要求可以考虑使用AsyncLogger的sync模式性能会下降或者将需要严格顺序的日志用同步Logger输出。4.4 日志输出性能调优如果发现日志成为性能瓶颈可以从以下几点优化启用异步日志这是提升吞吐量最有效的一招如前所述。优化日志格式PatternLayout%logger{36}、%class、%location行号等模式的解析成本很高尤其是在DEBUG级别日志很多的情况下。生产环境可以考虑移除或缩短这些信息。使用%c{1}只输出类名的最后一部分代替%c。使用Lazy Logging避免在日志语句中进行昂贵的字符串拼接。即使该日志级别被禁用字符串拼接也会发生。应该使用参数化日志。// 不好即使DEBUG关闭expensiveOperation()也会执行 logger.debug(Result: expensiveOperation()); // 好只有DEBUG启用时才会调用expensiveOperation()并格式化字符串 logger.debug(Result: {}, () - expensiveOperation());调整滚动策略和压缩过于频繁的日志滚动如按小时滚动或压缩如用GZIP会带来额外的I/O开销。根据日志量合理设置SizeBasedTriggeringPolicy的大小和TimeBasedTriggeringPolicy的间隔。压缩可以放在低峰期由脚本异步执行。控制日志输出量这是根本。合理使用日志级别避免在循环、高频调用路径上打印INFO甚至DEBUG日志。使用logger.isDebugEnabled()进行预先判断虽然Lambda方式更好。4.5 与Spring Boot、Spring Cloud等框架的集成在Spring Boot项目中默认使用Logback。要切换到Log4j2需要排除spring-boot-starter-logging。引入spring-boot-starter-log4j2。将你的log4j2.xml或log4j2-spring.xml后者能更好地利用Spring的Environment属性放在src/main/resources下。在Spring Cloud微服务中如果你想将日志通过log4j2.xml直接输出到Kafka或HTTP端点以便被中心的ELK收集可以使用KafkaAppender或HttpAppender。配置KafkaAppender时要特别注意序列化方式和错误处理避免因为日志收集系统的不稳定导致业务应用阻塞。我个人在实际项目中的体会是日志配置没有银弹必须根据项目的具体规模、团队习惯和运维体系来定制。一个好的起点是建立一个“基线配置”包含按级别分离文件、异步输出、JSON格式输出和自动清理策略。然后针对不同服务如高并发的API服务、后台批处理任务进行微调。最重要的是要把日志配置当成代码一样来管理进行版本控制和评审确保所有环境的日志行为是可预期、可管理的。最后别忘了定期检查日志文件的大小和内容它往往是系统健康度最直接的反映。

相关新闻

SQL工具全攻略:从入门到精通,数据分析师与开发者的效率利器

SQL工具全攻略:从入门到精通,数据分析师与开发者的效率利器

1. 为什么你需要一款趁手的SQL工具? 干数据这行,无论是刚入门的学生、转行的新人,还是每天和数据打交道的分析师、开发工程师,SQL都是绕不过去的一道坎。它就像数据分析师的“手术刀”,数据库开发者的“脚手架”&#…

2026/8/13 23:05:38 阅读更多 →
电子商务网站建设也管理与运营背后的那些坑与机会深度解析

电子商务网站建设也管理与运营背后的那些坑与机会深度解析

做电商,这事儿听起来挺高大上的,好像就是开个网店,挂几张图,然后等着钱哗哗进账。但说实话,如果你真这么想,那大概率是要交的学费比赚的钱还多。咱们今天不聊那些虚头巴脑的宏观趋势,也不讲什么高大上的底层逻辑,就聊聊最实在的——电子商务网站建设也管理。这四个字里…

2026/8/15 0:12:33 阅读更多 →
AutoSizer:Windows窗口自动化布局工具,提升多屏多任务效率

AutoSizer:Windows窗口自动化布局工具,提升多屏多任务效率

1. 项目概述与核心价值 如果你和我一样,每天需要在多个显示器、不同分辨率的屏幕上处理十几个甚至几十个应用窗口,那你一定对频繁手动拖拽窗口、点击最大化/还原按钮感到厌烦。这种重复、低效的操作不仅打断工作流,还浪费了大量宝贵时间。Aut…

2026/8/14 23:15:12 阅读更多 →

最新新闻

1.6 窗口布局

1.6 窗口布局

1. 布局的样式为什么要布局:1. 布局之后窗口的排列是有序的 2. 布局之后窗口的大小发生变化, 控件的大小也会对应变化 3. 如果不对控件布局, 窗口显示出来之后有些控件的看不到的布局可以嵌套使用Qt窗口布局是指将多个子窗口按照某种排列方式将其全部展示到对应的父窗口中的一种…

2026/8/15 2:04:05 阅读更多 →
布尔盲注实战解析:从原理到自动化工具Sqlmap应用

布尔盲注实战解析:从原理到自动化工具Sqlmap应用

1. 从一道CTF题看布尔盲注的实战精髓 最近在带新人入门网络安全,发现很多朋友对SQL注入的理解还停留在“万能密码”或者联合查询的层面,一旦遇到没有明确回显的“盲注”场景就有点懵。正好,之前带大家复盘过一道非常经典的Bugku平台上的SQL盲…

2026/8/15 2:04:05 阅读更多 →
2026北京本土GEO优化服务商调研分析与选型避坑指南

2026北京本土GEO优化服务商调研分析与选型避坑指南

2026北京本土GEO优化服务商调研分析与选型避坑指南一、研究前言:AI搜索迭代下的北京GEO产业新格局2026年,生成式人工智能的商用落地进入深度普及阶段,大众用户获取商业信息、解答行业疑问、筛选合作品牌的主要入口,已从传统网页搜…

2026/8/15 2:04:05 阅读更多 →
告别配置劝退:四层心法让新工具从“听说”到“用上”

告别配置劝退:四层心法让新工具从“听说”到“用上”

你肯定听说过 Codex,也大概知道它能做什么——自动补全代码、生成函数、甚至根据注释写代码。但每次想动手试试,是不是总卡在第一步?不是环境变量没配好,就是依赖冲突,或者某个神秘的错误弹窗让你瞬间失去耐心。“配置…

2026/8/15 2:04:05 阅读更多 →
从AI问答转化率拆解:为什么高收录不等于高获客,GEO如何补齐流量闭环

从AI问答转化率拆解:为什么高收录不等于高获客,GEO如何补齐流量闭环

从AI问答转化率拆解:为什么高收录不等于高获客,GEO如何补齐流量闭环从AI问答转化率拆解:为什么高收录不等于高获客,GEO如何补齐流量闭环一、行业普遍假象:收录正常,但AI咨询寥寥无几在大量企业GEO优化落地复…

2026/8/15 2:04:05 阅读更多 →
从提示工程到驾驭工程:构建可靠AI Agent的系统工程实践

从提示工程到驾驭工程:构建可靠AI Agent的系统工程实践

1. 项目概述:从“提示”到“驾驭”的工程思维升级最近在AI Agent的开发圈子里,一个词的热度正在悄然攀升,那就是“Harness Engineering”,有人把它翻译成“驭缰工程”或“驾驭工程”。如果你和我一样,在过去一年里深陷…

2026/8/15 2:03:05 阅读更多 →

日新闻

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

2026/8/15 0:00:30 阅读更多 →
重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

2026/8/15 0:00:30 阅读更多 →
一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

2026/8/15 0:02:30 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →