使用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为例:
- 安装依赖:
npm install winston winston-cloudwatch
- 代码实现:
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
相关产品推荐
相关产品推荐

