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

使用AWS JavaScript SDK v3的@aws-sdk/client-cloudwatch-logs如何设置日志级别?

关于@aws-sdk/client-cloudwatch-logs日志级别的说明与优化方案

@aws-sdk/client-cloudwatch-logs本身不提供内置的日志级别字段——因为CloudWatch Logs的PutLogEvents API定义的logEvents结构仅包含timestamp和message两个核心属性,没有专门用于标记日志级别的字段。不过你可以通过以下几种方式优雅地实现日志级别的管理:

方案一:使用结构化日志(推荐)

将日志级别作为结构化数据的一部分嵌入message,用JSON格式存储,这样后续可以通过CloudWatch Insights方便地按级别过滤、查询日志,比纯文本前缀更可靠。

修改你的代码如下:

import {CloudWatchLogsClient, PutLogEventsCommand} from '@aws-sdk/client-cloudwatch-logs'

const cloudWatchLogsClient = new CloudWatchLogsClient({region: REGION})

// 重构日志函数,支持传入级别和消息
const logToCloudWatch = async (level, message) => {
    // 构建结构化日志内容
    const structuredLog = JSON.stringify({
        level: level.toUpperCase(),
        message: typeof message === 'string' ? message : message.stack || message.message,
        timestamp: new Date().toISOString()
    })
    
    await cloudWatchLogsClient.send(new PutLogEventsCommand({
        logEvents: [{
            timestamp: Date.now(),
            message: structuredLog
        }],
        logGroupName: 'my_group',
        logStreamName: 'my_stream'
    }))
}

// 使用示例
await logToCloudWatch('info', `App started with env: ${JSON.stringify(process.env, null, 2)}`)

try {
    dosomething()
} catch (err) {
    await logToCloudWatch('error', err)
}

后续在CloudWatch Insights中查询错误日志时,可以用如下语句:

parse @message as json log | filter log.level = "ERROR"

方案二:结合第三方日志库

使用Winston、Pino这类成熟的日志库,它们内置完善的日志级别管理,并且有现成的CloudWatch传输插件,能自动处理日志格式化、批量发送等细节,无需手动调用PutLogEvents。

以Winston为例:

  1. 安装依赖:
npm install winston winston-cloudwatch
  1. 代码实现:
import winston from 'winston'
import WinstonCloudWatch from 'winston-cloudwatch'

const logger = winston.createLogger({
    level: 'info', // 默认日志级别
    format: winston.format.json(),
    transports: [
        new WinstonCloudWatch({
            logGroupName: 'my_group',
            logStreamName: 'my_stream',
            awsRegion: REGION,
            jsonMessage: true
        })
    ]
})

// 使用示例
logger.info(`App started with env: ${JSON.stringify(process.env, null, 2)}`)

try {
    dosomething()
} catch (err) {
    logger.error(err)
}

方案三:封装级别快捷方法(轻量方案)

如果不想引入第三方库,也可以封装不同级别的快捷方法,让调用更简洁:

import {CloudWatchLogsClient, PutLogEventsCommand} from '@aws-sdk/client-cloudwatch-logs'

const cloudWatchLogsClient = new CloudWatchLogsClient({region: REGION})

const baseLog = async (level, message) => {
    await cloudWatchLogsClient.send(new PutLogEventsCommand({
        logEvents: [{
            timestamp: Date.now(),
            message: `${level.toUpperCase()}: ${typeof message === 'string' ? message : message.stack || message.message}`
        }],
        logGroupName: 'my_group',
        logStreamName: 'my_stream'
    }))
}

// 封装不同级别的日志方法
const logger = {
    info: (msg) => baseLog('info', msg),
    error: (msg) => baseLog('error', msg),
    warn: (msg) => baseLog('warn', msg),
    debug: (msg) => baseLog('debug', msg)
}

// 使用示例
await logger.info(`App started with env: ${JSON.stringify(process.env, null, 2)}`)

try {
    dosomething()
} catch (err) {
    await logger.error(err)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:13:27