使用 Winston 设置 AWS Cloudwatch

Bra*_*don 5 amazon-ec2 amazon-web-services amazon-iam winston amazon-cloudwatch

我一直在阅读各种文章/文档并观看有关此主题的一些视频。我的问题是它们都以一种或另一种方式发生冲突。

我的目标是使用 winston 将所有 console.logs/error 消息从我的 ec2 服务器发送到 Cloudwatch,这样就不会在 ec2 终端本身上记录日志。

混淆点:

  1. 如果我使用winston-aws-cloudwatchwinston-cloudwatch,我是否仍然需要在 AWS 上设置 IAM 用户,或者这些会在 Cloudwatch 中自动生成日志吗?
  2. 如果我按照AWS 文档设置 Cloudwatch,它会自动将任何将是 console.logs 从 EC2 服务器流式传输到 Cloudwatch 还是两者都做?如果是第一个,那么我不需要温斯顿?
  3. 我可以将日志从我的本地开发服务器发送到 Cloudwatch(仅用于测试目的,一旦确定它可以工作,然后我将测试暂存并最终将其移至生产环境)还是必须来自 EC2 实例?
  4. 我假设 AWS Cloudwatch 密钥与我用于账户其余部分的 AWS 密钥相同?

当前代码:

var winston = require('winston'),
  CloudWatchTransport = require('winston-aws-cloudwatch');

const logger = new winston.Logger({
  transports: [
    new (winston.transports.Console)({
      timestamp: true,
      colorize: true
    })
  ]
});

const cloudwatchConfig = {
  logGroupName: 'groupName',
  logStreamName: 'streamName',
  createLogGroup: false,
  createLogStream: true,
  awsConfig: {
    aws_access_key_id: process.env.AWS_KEY_I_USE_FOR_AWS,
    aws_secret_access_key: process.env.AWS_SECRET_KEY_I_USE_FOR_AWS,
    region: process.env.REGION_CLOUDWATCH_IS_IN
  },
  formatLog: function (item) {
    return item.level + ': ' + item.message + ' ' + JSON.stringify(item.meta)
  }
};

logger.level = 3;

if (process.env.NODE_ENV === 'development') logger.add(CloudWatchTransport, cloudwatchConfig);

logger.stream = {
  write: function(message, encoding) {
    logger.info(message);
  }
};

logger.error('Test log');
Run Code Online (Sandbox Code Playgroud)

spa*_*900 5

  1. 是的
  2. 取决于您配置的传输。如果您仅配置 CloudWatch,那么它只会出现在那里。目前,您的代码有 2 种传输,即普通的 Console 传输和 CloudWatchTransport,因此对于您当前的代码来说,两者都有。
  3. 只要您像通常使用任何 AWS 服务(S3、DB...)一样指定密钥,您就可以将日志从本地/开发设备推送到 CloudWatch。
  4. 取决于您的 IAM 用户是否有权限。但有可能是的。