【问题标题】:Elastic Beanstalk with CloudWatch logs and Nginx带有 CloudWatch 日志和 Nginx 的 Elastic Beanstalk
【发布时间】:2017-11-05 06:11:05
【问题描述】:

我已在我的 EBS 应用程序中激活 CloudWatch 日志。我已启用,如附加的屏幕截图:

但是当我查看 awslogs.log 时,我总是可以找到这个错误:

cwlogs.push.stream - WARNING - 3317 - Thread-1 - No file is found with given path '/var/log/httpd/error.log*'.
cwlogs.push.stream - WARNING - 3317 - Thread-1 - No file is found with given path '/var/log/httpd/access.log*'.

我不知道为什么,因为 httpd 是来自 Apache 的服务,而我正在使用 Nginx(以 Node.js 作为源)。

如何禁用/删除此错误?

谢谢。

【问题讨论】:

  • 我对 catalina.out 文件有同样的错误。它位于 awslogs.config 中指定的位置,但代理说:找不到具有给定路径的文件。但是当我手动打开文件(catalina.out)并在开头添加一些内容并保存时,代理开始看到它并流式传输日志。有什么想法吗?
  • @hyeganeh 触摸 catalina.out 文件将解决该问题。我不知道这是否是弹性豆茎中的错误,但我建议在我的回答中使用 .ebextensions 解决方法。

标签: amazon-web-services nginx amazon-elastic-beanstalk amazon-cloudwatch


【解决方案1】:

发生这种情况是因为您的 EC2 实例上的 awslogs 应用程序正在寻找这些文件以发送到 CloudWatch。

您可以检查和编辑位于以下位置的配置文件:

/etc/awslogs/awslogs.conf

确保重启服务:

sudo service awslogs restart

您可以在那里指定您自己的文件,并创建不同的组等等。

资源:

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html

【讨论】:

    【解决方案2】:

    您可以使用以下.ebextensions/awslog.config

    container_commands:
      touch_logs:
        command: touch /var/log/nodejs/nodejs.log /var/log/nginx/access.log /var/log/nginx/error.log /var/log/httpd/access_log /var/log/httpd/error_log
    

    这可确保您永远不会看到任何这些文件的“没有找到具有给定路径的文件”。

    注意:如果您使用的是节点以外的容器,则可以将 /var/log/nodejs.log 替换为 beanstalklogs.conf 中的任何内容...


    awslogs 配置文件为/etc/awslogs/config/beanstalklogs.conf,默认(用于节点):

    [/var/log/nodejs/nodejs.log]
    log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/nodejs/nodejs.log
    log_stream_name={instance_id}
    file=/var/log/nodejs/nodejs.log*
    
    [/var/log/nginx/error.log]
    log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/nginx/error.log
    log_stream_name={instance_id}
    file=/var/log/nginx/error.log*
    
    [/var/log/nginx/access.log]
    log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/nginx/access.log
    log_stream_name={instance_id}
    file=/var/log/nginx/access.log*
    
    [/var/log/httpd/error_log]
    log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/httpd/error_log
    log_stream_name={instance_id}
    file=/var/log/httpd/error_log*
    
    [/var/log/httpd/access_log]
    log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/httpd/access_log
    log_stream_name={instance_id}
    file=/var/log/httpd/access_log*
    
    [/var/log/eb-activity.log]
    log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/eb-activity.log
    log_stream_name={instance_id}
    file=/var/log/eb-activity.log*
    

    如您所见,这有 nginx 和 httpd 行。

    可以: 1.删​​除这些httpd块。 2. 触摸这些文件。

    触摸这些文件的侵入性似乎较小,并且会抑制错误消息,因此不会将任何内容发布到 cloudwatch 日志:

    sudo touch /var/log/httpd/error_log /var/log/httpd/access_log
    

    注意:当 EB 首次启动时,您会收到 httpd、nginx 和 nodejs.log 的错误!因此,在启动时触摸所有这些文件似乎更容易,这就是上面的 awslog.config 文件所做的。

    【讨论】:

    • 我用我们的 java elastic beanstalk 应用程序测试了这个答案,它可以工作(用 /var/log/tomcat8/debug.log 替换 /var/log/nodejs/nodejs.log)。
    • 我在一个节点实例上测试了这个答案,它没有用,只是一直显示相同的错误
    【解决方案3】:

    解决此问题的另一种方法是更改​​/etc/awslogs/config/beanstalklogs.conf 文件。

    您可以创建一个包含以下内容的.ebextensions/myconfig.config 文件:

    files:
      "/etc/awslogs/config/beanstalklogs.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
          [/var/log/nodejs/nodejs.log]
          log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/nodejs/nodejs.log
          log_stream_name={instance_id}
          file=/var/log/nodejs/nodejs.log*
    
          [/var/log/nginx/error.log]
          log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/nginx/error.log
          log_stream_name={instance_id}
          file=/var/log/nginx/error.log*
    
          [/var/log/nginx/access.log]
          log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/nginx/access.log
          log_stream_name={instance_id}
          file=/var/log/nginx/access.log*
    
          # [/var/log/httpd/error_log]
          # log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/httpd/error_log
          # log_stream_name={instance_id}
          # file=/var/log/httpd/error_log*
    
          # [/var/log/httpd/access_log]
          # log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/httpd/access_log
          # log_stream_name={instance_id}
          # file=/var/log/httpd/access_log*
    
          [/var/log/eb-activity.log]
          log_group_name=/aws/elasticbeanstalk/YOUR_ENV/var/log/eb-activity.log
          log_stream_name={instance_id}
          file=/var/log/eb-activity.log*
    commands:
      01-remove-default-beanstalklogs:
        command: rm /etc/awslogs/config/beanstalklogs.conf.bak
      02-restart-awslogs:
        command: service awslogs restart
    

    请注意,我已经注释掉了上传/var/log/httpd/error.log*/var/log/httpd/access.log* 文件的行。因此 CloudWatch 代理将停止查找这些文件。

    Awslogs 在运行myconfig.config 中的命令之前使用@AndyHayden 提到的默认beanstalklogs.conf。这就是为什么我在 beanstalklogs.conf 文件更改后要求 awslogs 重新启动。

    .ebextensions/myconfig.config 放在您上传到弹性beantalk 的*.zip 文件中。然后elastic beanstalk会执行myconfig.config中的命令。

    这里是commands的使用文档:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-commands

    【讨论】:

      【解决方案4】:

      我在我的一个环境中也遇到了这个问题,我在配置了实例的自动缩放的环境中遇到了这个问题,并且在发生过于频繁的缩放的环境中也遇到了这个问题。

      查看 /var/logs 目录中的 awslogs 并出现此错误

      cwlogs.push.stream - 警告 - 3317 - 线程 1 - 找不到给定路径 '/var/log/production.log*' 的文件。

      我尝试使用命令创建文件

      sudo touch /var/log/production.log

      但这停止了错误,但即使在重新启动后也没有流式传输日志。

      最后查看正确流式传输日志的其他实例,它是指向返回实际日志的文件的符号链接,因此通过容器命令从 ebextension 创建了一个符号链接

      commands:
        "01":
          command: ln -sf /var/app/current/log/production.log /var/log/production.log
      

      这终于对我有用了。

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 2016-07-26
        • 2017-09-19
        • 2019-01-23
        • 2017-10-18
        • 1970-01-01
        • 2015-01-14
        • 2017-07-27
        • 2019-12-20
        相关资源
        最近更新 更多