You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复CloudWatch中格式混乱的日志行?

解决CloudWatch日志显示ANSI转义码的问题

你看到的[90m、[39m这类字符是ANSI终端颜色转义序列,本地终端能解析这些代码来显示带颜色的日志,但CloudWatch日志控制台不会处理这类格式,所以直接把转义码当成文本显示出来了。以下是几种实用的解决方式:

1. 从应用层面关闭日志颜色输出

你的应用是Next.js(日志路径包含.next/server),可以针对日志库调整配置,在生产环境或日志输出到CloudWatch时禁用颜色格式:

  • 如果使用Winston日志库:在创建logger时设置colorize: false,示例配置片段:
    const logger = winston.createLogger({
      transports: [
        new winston.transports.Console({
          format: winston.format.combine(
            winston.format.timestamp(),
            winston.format.printf(info => `${info.timestamp} ${info.level} ${info.message}`)
            // 移除colorize相关配置,或显式设置colorize: false
          )
        })
      ]
    });
    
  • 如果使用Pino日志库:在生产模式下禁用颜色,示例配置:
    const pino = require('pino')({
      transport: {
        target: 'pino/file',
        options: {
          colorize: false
        }
      }
    });
    
  • 对于Next.js自带日志:检查next.config.js,确保生产环境下没有启用终端颜色输出(多数框架默认生产环境会禁用,但可以确认配置)。

2. 用CloudWatch日志转换规则清理日志

不需要修改应用,直接在CloudWatch里创建日志转换规则,自动去除ANSI转义码:

  1. 进入目标CloudWatch日志组,点击顶部的转换日志按钮
  2. 在转换编辑器中输入以下规则:
    fields @timestamp, @message
    | replace @message /\x1b\[[0-9;]*m/g with ''
    | display @timestamp, @message
    
  3. 保存这个转换配置,之后可以通过该转换视图查看清理后的日志。如果需要持久化清理后的日志,还可以配置将转换后的日志导出到S3或其他服务。

3. 在日志收集环节处理

如果使用CloudWatch Agent或Fluentd收集日志,可以在收集阶段过滤转义码:

  • CloudWatch Agent:在cwagent.conf中添加过滤器,使用正则替换。示例配置片段:
    "filters": [
      {
        "type": "modify",
        "modify": {
          "message": ["replace", "\\x1b\\[[0-9;]*m", ""]
        }
      }
    ]
    
  • Fluentd:使用record_transformer插件,在配置中添加替换规则:
    <filter **>
      @type record_transformer
      enable_ruby true
      <record>
        message ${record['message'].gsub(/\e\[[0-9;]*m/, '')}
      </record>
    </filter>
    

内容的提问来源于stack exchange,提问作者Adam A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:55:16