使用Winston设置AWS Cloudwatch

时间:2018-07-18 16:23:03

标签: amazon-web-services amazon-ec2 amazon-iam amazon-cloudwatch winston

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

我的目标是使用Winston将所有ec2服务器上的console.logs /错误消息发送到Cloudwatch,这样就不会在ec2终端上记录任何日志。

混淆点:

  1. 如果我使用winston-aws-cloudwatchwinston-cloudwatch,是否仍需要在AWS上设置IAM用户,还是这些将在Cloudwatch中自动生成日志?
  2. 如果我按照AWS documentation设置Cloudwatch,会自动将任何内容作为console.logs从EC2服务器发送到Cloudwatch还是两者都做?如果是第一个,那么我不需要Winston吗?
  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');

1 个答案:

答案 0 :(得分:1)

  1. 取决于您配置的传输方式。如果仅配置CloudWatch,那么它将仅在那里结束。当前,您的代码具有2种传输方式,普通的控制台有1种传输方式,而CloudWatchTransport有两种传输方式,以及您当前的代码都具有这种传输方式。
  2. 只要您像通常使用任何AWS服务(S3,DB等)一样指定密钥,就可以将日志从本地/开发设备推送到CloudWatch。
  3. 取决于您的IAM用户是否具有特权。但是有可能。