Egg.js 日志系统
1. Egg 企业级日志系统解决什么问题Egg 内置日志能力主要由egg-logger提供目标不是简单地console.log而是解决 Web 服务中的如下问题1.日志分级egg 日志级别级别含义适合场景DEBUG调试日志最详细给开发者看的细节本地开发、排查问题INFO普通信息日志记录正常业务流程比如“订单创建成功”WARN警告日志出现异常苗头但不一定导致请求失败ERROR错误日志程序异常、请求失败、服务调用失败NONE不输出日志关闭日志输出日志级别的控制可通过如下进行配置exports.logger{level:INFO,// 默认INFO只打印INFO、WARN、ERROR如果配置WARN则只打印WARN、ERROR其他类推};2.请求上下文日志在请求处理中使用ctx.logger日志里会自动带上请求相关信息例如在代码里写的是ctx.logger.info([AgentChat] chatStream 用户请求入参: %j,{sessionId,message});但是在日志文件里会生成如下2026-07-26 11:22:06,879 INFO 10837 [-/::1/723f86b7-0038-48a9-987f-6e4158c55ab4/342.335ms POST /api/agent/chat/stream] [OpenClaw chatStream] 请求参数 {endpoint:http://dev1-ge.back.jd.com/oxygen/api/oxygen/chat/stream,sessionId:session_xxxx-ec35-4210-937c-xxxx,clientRequestId:req_516de26c-89a1-461b-8f8c-80e9bb5fd3e3}字段含义如下字段示例含义时间2026-07-26 09:54:26,351日志打印时间精确到毫秒日志级别INFO日志等级表示普通信息不是错误进程 ID77817当前 Node/Egg 进程的 PID日志分类[egg:lib:core:logger]打印日志的模块或命名空间日志内容init all loggers with options...具体事件说明3.错误日志集中收敛任意 logger 调用.error()打印的错误日志都会额外进入统一错误日志文件common-error.log。这方便排查线上异常。4.应用日志、框架日志、Agent 日志分离应用业务日志和框架内部日志不会混在一起。5.自动切割默认按天切割。也支持按小时、按文件大小切割。6.高性能默认不是每条日志都立刻写磁盘而是先写入内存 buffer再定时刷盘。2. Egg 日志分类Egg 里最核心的日志可以分成这几类分类Logger 对象常见使用入口默认日志文件主要用途备注应用业务日志appLogger / loggerctx.logger/app.logger${appInfo.name}-web.log例如server-web.log业务代码最常用的日志ctx.logger用于请求内app.logger用于应用级逻辑框架/插件日志coreLoggerctx.coreLogger/app.coreLoggeregg-web.logEgg 框架内部、插件日志普通业务代码一般不用写插件或框架扩展时更常用统一错误日志errorLogger一般不直接调用由所有 logger 的.error()自动汇总common-error.log汇总所有ERROR级别日志方便排查异常例如ctx.logger.error(err)会同时写入业务日志和common-error.logAgent 进程日志agentLoggeragent.logger/agent.coreLoggeregg-agent.logAgent 进程中的日志用于 Egg 多进程模型里的 Agent 进程自定义日志自定义 Logger例如payLogger/auditLoggerapp.getLogger(xxx)/ctx.getLogger(xxx)自定义文件例如pay.log独立业务日志如支付、审计、安全日志通过config.customLogger配置调用.error()也会汇总到common-error.log插件专用日志插件自定义 Logger例如scheduleLogger插件提供的 logger例如 schedule 插件 logger插件自定义例如egg-schedule.log某些插件自己的运行日志不是 Egg 基础必有日志是否存在取决于是否启用对应插件简版记忆ctx.logger / app.logger → 业务日志 → ${appInfo.name}-web.log ctx.coreLogger / app.coreLogger → 框架、插件日志 → egg-web.log 所有 logger.error(...) → 额外复制到 common-error.log agent.logger → Agent 进程日志 → egg-agent.log 自定义 logger → 自定义业务日志 → 自定义文件 scheduleLogger → schedule 插件日志 → egg-schedule.logEgg 默认把日志放在${appInfo.root}/logs/${appInfo.name}本地和单测环境的root是项目目录生产等其他环境的root是 HOME 目录name来自package.json。可以这样自定义日志目录// config/config.default.js exports.logger { dir: /path/to/your/custom/log/dir, };也可以自定义日志文件名// config/config.default.js module.exports appInfo { return { logger: { appLogName: ${appInfo.name}-web.log, coreLogName: egg-web.log, agentLogName: egg-agent.log, errorLogName: common-error.log, }, }; };3. 日志怎么打印3.1 请求处理中优先用ctx.loggerController、Service、Middleware 里处理一次请求时推荐用ctx.logger.info(some request data: %j, ctx.request.body); ctx.logger.warn(业务参数异常%j, ctx.query); ctx.logger.error(new Error(something wrong));为什么请求里推荐用ctx.logger因为它能带上请求上下文信息类似[userid/ip/traceId/12ms GET /api/user] message这样排查问题时可以知道哪个请求触发的日志请求耗时是多少请求路径是什么有没有 traceId 可以串联链路参数与格式化占位符ctx.logger.info([SessionController] 创建会话入口 %s,JSON.stringify({...}));第一个参数是格式化模板,%s是字符串占位符,第二个参数填进占位符位置。常用占位符:%s字符串、%d数字、%jJSON(自动序列化对象)。可简化:用%j省掉手动JSON.stringify:ctx.logger.info([SessionController] 创建会话入口 %j,{requestId,appId});3.2 应用级别用app.logger比如启动阶段、定时任务、应用级初始化逻辑// app.js module.exports app { app.logger.info(应用启动完成); app.logger.warn(某个配置缺失使用默认值); app.logger.error(new Error(启动阶段异常)); };3.3 框架/插件级别用coreLogger如果你是在写框架或插件不建议把框架内部日志打到业务日志里应该用app.coreLogger.info(plugin initialized); ctx.coreLogger.warn(framework warning);3.4 Agent 进程用agent.logger// agent.js module.exports agent { agent.logger.info(agent started); agent.logger.error(new Error(agent error)); };4. 错误日志要特别注意什么Egg 文档里有一个非常重要的建议ctx.logger.error(new Error(whoops));不要随便这样ctx.logger.error(something wrong);虽然字符串也能打印但如果你希望线上异常可追踪最好传Error对象。原因是Error对象有namemessagestackcause自定义属性源码中egg-logger会专门格式化Error输出完整堆栈相关实现可以看egg/packages/logger/src/utils.ts其中formatError()会把错误格式化成包含pid、hostname、stack 等信息的日志。5. 日志切割参考链接日志切割Egg 默认使用eggjs/logrotator进行日志切割。默认按天切割比如当前文件example-app-web.log到第二天会切成example-app-web.log.2026-07-24按大小切割例如egg-web.log超过 2GB 后切割const path require(path); module.exports appInfo { return { logrotator: { filesRotateBySize: [ path.join(appInfo.root, logs, appInfo.name, egg-web.log), ], maxFileSize: 2 * 1024 * 1024 * 1024, }, }; };按小时切割const path require(path); module.exports appInfo { return { logrotator: { filesRotateByHour: [ path.join(appInfo.root, logs, appInfo.name, common-error.log), ], }, }; };切割的定时任务(内置)Egg「约定优于配置」:插件把定时任务放在自己的app/schedule/目录,框架启动自动加载。位置:node_modules/eggjs/logrotator/dist/app/schedule/ ├── rotate_by_file.js → 按天切割 ├── rotate_by_size.js → 按大小切割 ├── rotate_by_hour.js → 按小时切割(默认关闭) └── clean_log.js → 删除过期日志任务文件cron触发时机干什么rotate_by_file.js1 0 0 * * *每天 00:00:01xxx.log→xxx.log.YYYY-MM-DD,建空文件clean_log.js0 0 * * *每天 00:00:00删除超过maxDays天的归档文件rotate_by_size.js每 60 秒轮询持续检查单文件超maxFileSize立即切cron 两种写法都支持:clean_log用标准 5 段(分 时 日 月 周),rotate_by_file用 6 段(最前多了秒)。这些任务本身就是 schedule 任务,所以会产生egg-schedule.log。保留天数与自动清理删除逻辑在clean_log.js的removeExpiredLogFiles:扫描日志目录所有文件;只挑后缀是日期格式的归档文件(如.2026-07-23);算过期线 今天往前推maxDays天;归档日期早于过期线的,直接fs.unlink删除。要点:只删带日期后缀的归档文件,永不删正在写入的活动文件。默认已开启清理,maxDays: 31(保留 31 天)。maxDays: 0表示永不删除、全部保留(才会无限堆积)。logrotator 默认配置logrotator:{disableRotateByDay:false,filesRotateByHour:null,hourDelimiter:-,filesRotateBySize:null,maxFileSize:50*1024*1024,// 50MBmaxFiles:10,// 按大小切割时最多保留数rotateDuration:60000,// 按大小轮询间隔 60smaxDays:31,// 保留天数,0 不删gzip:false,// 归档是否 gzip 压缩}自定义(在config/config.default.ts覆盖)config.logrotator{maxDays:7,// 只留 7 天maxFileSize:100*1024*1024,// 100MBgzip:true,// 归档压缩省空间};11. 源码视角Egg 日志初始化流程可以重点看这几个文件11.1 默认配置egg/packages/egg/src/config/config.default.ts这里定义config.logger { dir: path.join(appInfo.root, logs, appInfo.name), encoding: utf8, env: appInfo.env, level: INFO, consoleLevel: INFO, disableConsoleAfterReady: appInfo.env ! local appInfo.env ! unittest, outputJSON: false, buffer: true, appLogName: ${appInfo.name}-web.log, coreLogName: egg-web.log, agentLogName: egg-agent.log, errorLogName: common-error.log, coreLogger: {}, allowDebugAtProd: false, enableFastContextLogger: true, };11.2 创建 Loggersegg/packages/egg/src/lib/core/logger.ts这里会从app.config.logger读取配置创建EggLoggers生产环境保护 DEBUG应用 ready 后按配置关闭 console注册全局 logger应用关闭时清理全局 logger。11.3 Logger Manageregg/packages/logger/src/egg/loggers.ts这里创建errorLoggerloggercoreLoggercustom loggers并配置错误日志集中logger.duplicate(ERROR, concentrateLogger, { excludes: [console] });也就是说业务 logger 打一条 ERROR除了进入业务日志也会复制一份到common-error.log。12. 推荐实践12.1 业务请求日志ctx.logger.info(创建订单成功orderId%s, order.id);不要打印过大的对象// 不推荐 ctx.logger.info(request body: %j, ctx.request.body);如果 body 很大或有敏感字段应该筛选ctx.logger.info(创建订单请求%j, { userId: ctx.user.id, skuId: ctx.request.body.skuId, count: ctx.request.body.count, });12.2 错误日志推荐try { await service.doSomething(); } catch (err) { ctx.logger.error(err); throw err; }如果要补充上下文try { await service.pay(order); } catch (err) { ctx.logger.error([pay failed] orderId%s userId%s, order.id, ctx.user.id); ctx.logger.error(err); throw err; }12.3 不要滥用debugdebug适合开发和临时排查不适合长期在线上大量打开。12.4 不要在日志里打印敏感信息避免打印passwordtokencookie等12.5 自定义 logger 要克制只有当日志具有明确独立消费场景时才拆比如审计日志安全日志支付流水日志调度执行日志否则优先使用默认app.logger。13. 总结一句话Egg 的日志系统可以理解成业务代码调用 ctx.logger/app.logger ↓ EggLoggers 管理多个 logger ↓ 每个 logger 绑定多个 transporttransport负责判断当前日志级别是否应该输出 ↓ transport 根据日志级别、格式、上下文输出到文件/终端/JSON/远端 ↓ ERROR 日志额外集中到 common-error.log ↓ logrotator 负责日志切割

相关新闻

Spring AI Document类设计与企业级应用实践

Spring AI Document类设计与企业级应用实践

1. Spring AI Document核心功能解析在Spring AI框架中,Document类扮演着数据载体的关键角色。这个看似简单的POJO类实际上承载了AI模型处理过程中的结构化数据流转任务。我最近在几个企业级AI项目中深度使用了这个组件,发现其设计暗含了许多工程实践的智…

2026/7/27 6:49:10 阅读更多 →
【单片机】空闲池结构

【单片机】空闲池结构

#define MSG_POOL_SIZE 8 // 消息池容量 #define MSG_MAX_LEN 256 // 单帧最大长度typedef struct {uint8_t data[MSG_MAX_LEN];uint16_t len;uint8_t in_use; // 1已分配, 0空闲 } msg_block_t;typedef struct {msg_block_t blocks[MSG_POOL_SI…

2026/7/27 6:48:10 阅读更多 →
Coze智能体开发全流程与实战技巧

Coze智能体开发全流程与实战技巧

1. Coze 智能体概述第一次接触Coze平台时,我被"智能体"这个概念深深吸引。这不同于传统聊天机器人,而是一个具备完整身份设定和任务执行能力的AI实体。简单来说,你可以把它想象成一位虚拟员工——有明确的职责范围(天气…

2026/7/27 6:48:10 阅读更多 →

最新新闻

公众号文案降AI的几个实战细节,我踩过3次审核坑

公众号文案降AI的几个实战细节,我踩过3次审核坑

上周运营部的同事拽着我工位键盘,说发出去的3篇公众号原创投稿全部触发平台AI内容预警,流量直接砍了70%。之前一直以为内容审核是运营的事,这回他们试了所有常规改法都没用,没办法只能硬着头皮搞公众号文案降AI的落地,…

2026/7/27 7:03:16 阅读更多 →
跨境电商图片自动翻译实现教程

跨境电商图片自动翻译实现教程

一、问题引入对于从事跨境电商的卖家来说,商品图片翻译是一项日常且繁琐的工作。当你要将产品上架到亚马逊美国站、日本站、欧洲站等多个站点时,每张商品图都需要重新制作当地语言的版本。在实际操作中,卖家们常常面临这些痛点:时…

2026/7/27 7:03:16 阅读更多 →
大数据情感分析在智能家居中的应用与实践

大数据情感分析在智能家居中的应用与实践

1. 大数据情感分析如何重塑智能家居:从"冰冷设备"到"懂你的生活伙伴"凌晨1点,你拖着疲惫的身体回到家,智能家居系统通过门口的摄像头捕捉到你微皱的眉头和略显沉重的步伐。灯光自动调整为柔和的暖黄色,亮度仅…

2026/7/27 7:03:16 阅读更多 →
深入解析TMS570LS20216 ADC硬件校准与自诊断技术

深入解析TMS570LS20216 ADC硬件校准与自诊断技术

1. 项目概述:为什么ADC的精度与可靠性如此重要?在嵌入式系统,尤其是汽车电子、工业控制、医疗设备这些领域,信号采集的精度和可靠性不是“锦上添花”,而是“生死攸关”。作为连接物理世界与数字世界的桥梁,…

2026/7/27 7:03:16 阅读更多 →
从《生化危机1.5》源码学习C++游戏引擎设计与PS1逆向工程

从《生化危机1.5》源码学习C++游戏引擎设计与PS1逆向工程

1. 项目概述:从“废案”到“圣杯”的传奇代码如果你是一个老派的游戏开发者,或者对游戏开发史有浓厚的兴趣,那么“生化危机1.5”这个名字,对你而言无异于一个充满魔力的咒语。它不是一个正式发行的游戏,而是卡普空&…

2026/7/27 7:03:16 阅读更多 →
OpenClaw AI框架安全加固实战:从RBAC权限到生产环境部署

OpenClaw AI框架安全加固实战:从RBAC权限到生产环境部署

1. 项目概述:为什么OpenClaw的安全配置与权限管理是“必修课”?最近在折腾OpenClaw,一个基于FastAPI和LangChain的AI智能体开发框架,功能确实强大,能搞多代理协同、记忆管理,还能对接各种大模型。但玩着玩着…

2026/7/27 7:02:16 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻