最近部署后我的ElasticBeanstalk日志为何呈现此状态?
解决Elastic Beanstalk Node.js环境日志显示ANSI代码的问题
嘿,我一眼就看出问题了——你的日志里那些[90m、[32m、[1m之类的字符是ANSI颜色控制代码,这是因为你的Node.js应用日志库(比如morgan、winston这类)开启了颜色输出,但Elastic Beanstalk的日志系统不会解析这些代码,所以直接把它们原封不动打印出来,导致日志乱糟糟的可读性很差。
下面给你几个靠谱的解决办法,按优先级排序:
1. 从源头关闭日志的颜色输出(最推荐)
这是最彻底的方式,直接让日志库别输出颜色代码就行,不同的日志库设置方式略有不同:
如果你用的是morgan(常见的HTTP请求日志库)
原来的代码可能用了带颜色的dev格式,改成无颜色的格式就好:
const morgan = require('morgan'); // 原来的带颜色写法 // app.use(morgan('dev')); // 换成无颜色的combined格式 app.use(morgan('combined')); // 或者自定义完全匹配你现有日志结构的无颜色格式 app.use(morgan('[:date[iso]] :method :url - :status (:res[content-length]B, :response-time ms)'));
如果你用的是winston日志库
找到日志配置里的colorize选项关掉,或者直接用不带颜色的格式化器:
const winston = require('winston'); const logger = winston.createLogger({ transports: [ new winston.transports.Console({ format: winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DDTHH:mm:ss.SSSZ' }), winston.format.printf(info => `${info.timestamp} ${info.level.toUpperCase()} ${info.message}`) // 删掉任何winston.format.colorize()相关的配置 ) }) ] });
自定义日志工具
如果是你自己写的日志函数,检查有没有判断终端环境并输出颜色的逻辑,直接删掉颜色相关的代码就行——比如去掉那些拼接\x1b[32m这类控制字符的部分。
2. 用部署脚本过滤日志里的ANSI代码(不用改应用代码)
如果暂时不想动应用代码,也可以在Elastic Beanstalk部署后自动清理日志里的ANSI代码:
在你的项目根目录下创建.ebextensions文件夹,然后新建一个01-clean-ansi-logs.config文件,内容如下:
files: "/opt/elasticbeanstalk/hooks/appdeploy/post/99_remove_ansi_codes.sh": mode: "000755" owner: root group: root content: | #!/bin/bash # 清理Node.js应用日志里的ANSI代码 sed -i 's/\x1b\[[0-9;]*m//g' /var/log/nodejs/nodejs.log # 如果还有其他日志文件需要处理,继续添加sed命令
这个脚本会在每次部署完成后,自动去掉日志文件里的所有ANSI控制字符。
总结
优先选第一种方法,从源头解决问题,避免后续日志再出现乱码;如果因为各种原因不能改应用代码,再用第二种脚本过滤的方式。
内容的提问来源于stack exchange,提问作者Novu
相关产品推荐
相关产品推荐

