首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Amazon 2在ElasticBean秸秆上输出JSON日志

用Amazon 2在ElasticBean秸秆上输出JSON日志
EN

Server Fault用户
提问于 2020-05-20 18:12:41
回答 4查看 3.8K关注 0票数 10

我们正在尝试将Java应用程序从当前的Elastic 8平台迁移到在Amazon 2上运行Corretto 11的新平台。该应用程序运行良好,但日志处理方式发生了变化。web进程的输出现在存储在/var/log/web.stdout.log中,每一行都以时间戳和进程名作为前缀,即:

代码语言:javascript
复制
May 20 17:00:00 ip-10-48-41-129 web: {"timestamp":"2020-05-20T17:00:00.035Z","message":"...","logger":"...","thread":"MessageBroker-2","level":"INFO"}

我们怎么才能去掉前缀?这些日志被流到CloudWatch中,我们将它们输出到JSON中的stdout,以便以后可以使用logs查询它们。但是使用前缀,Insight并不会“看到”JSON,而只是将整行视为文本blob。

我在AWS上找不到这方面的文件。几乎所有ElasticBean秸秆的文档都提到了Amazon的第一个版本。

EN

回答 4

Server Fault用户

回答已采纳

发布于 2020-05-21 07:17:13

我找到了一个效果很好的解决方案,所以我会把它发到这里供后人参考。如果有人能提出更好的建议,请这样做。

Amazon 2上的弹性Bean秸秆依赖于rsyslog进行日志处理和输出。在/opt/elasticbeanstalk/config/private/rsyslog.conf中有一个文件在部署期间被复制到/etc/rsyslog.d/web.conf,它是将web应用程序的所有输出定向到/var/log/web.stdout.log的文件。

该文件不包括任何自定义模板。它依赖于rsyslog的S默认模板,该模板以时间戳和$programname (在本例中为web )作为任何%msg%的前缀。

我试图通过一个.ebextensions配置替换这个文件,但是这不起作用,因为ElasticBean秸秆似乎是在.ebextensions运行后覆盖这个文件。因此,我添加了一个删除文件的附加平台钩,保留了我添加的自定义文件。

下面是.ebextensions/logs.config文件:

代码语言:javascript
复制
files:
  "/etc/rsyslog.d/web-files.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      template(name="WebTemplate" type="string" string="%msg%\n")

      if $programname == 'web' then {
        *.=warning;*.=err;*.=crit;*.=alert;*.=emerg; /var/log/web.stderr.log;WebTemplate
        *.=info;*.=notice /var/log/web.stdout.log;WebTemplate
      }

commands:
  remove-.bak-rsyslog:
    command: rm -f *.bak
    cwd: /etc/rsyslog.d

.platform/hooks/predeploy/remove-default-rsyslog-conf.sh (确保您chmod +x这个):

代码语言:javascript
复制
#!/bin/sh
rm /etc/rsyslog.d/web.conf
systemctl restart rsyslog.service
票数 4
EN

Server Fault用户

发布于 2021-08-06 22:15:25

我使用平台钩来完成这个任务。唯一的问题是在应用程序部署和配置部署中都替换了/etc/rsyslog.d/web.conf,因此需要为两者都设置一个挂钩。

这种方法避免了在/opt/elasticbeanstalk/config/private中干扰ElasticBean秸秆的内部文件(自从以前的答案-- rsyslog.conf不再存在以来,这些文件已经改变了)。此外,平台挂钩现在是首选的now扩展。

如果使用CodeBuild,请不要忘记在输出工件中包含platformFiles目录(或放置文件的位置)。

注意:这段代码假定进程的名称是web。如果您在Procfile中定义了不同的进程名,请使用它。但是,我认为rsyslog配置应该始终位于/etc/rsyslog.d/web.conf,而不考虑进程名。

确保所有的.sh文件都是使用chmod +x执行的。

.platform/hooks/predeploy/10_logs.sh

代码语言:javascript
复制
#!/bin/sh
sudo platformFiles/setupLogs.sh

.platform/confighooks/predeploy/10_logs.sh

代码语言:javascript
复制
#!/bin/sh
sudo platformFiles/setupLogs.sh

platformFiles/setupLogs.sh

代码语言:javascript
复制
#!/bin/sh
# By default logs output to /var/log/web.stdout.log are prefixed. We want just the raw logs from the app.
# This updates the rsyslog config. Also grants read permissions to the log files.

set -eu

mv platformFiles/rsyslogWebConf.conf /etc/rsyslog.d/web.conf

touch /var/log/web.stdout.log
touch /var/log/web.stderr.log
chmod +r /var/log/web.stdout.log
chmod +r /var/log/web.stderr.log

systemctl restart rsyslog.service

platformFiles/rsyslogWebConf.conf

代码语言:javascript
复制
# This file is created from Elastic Beanstalk platform hooks.

template(name="WebTemplate" type="string" string="%msg%\n")

if $programname == 'web' then {
  *.=warning;*.=err;*.=crit;*.=alert;*.=emerg; /var/log/web.stderr.log;WebTemplate
  *.=info;*.=notice /var/log/web.stdout.log;WebTemplate
}

猜想

看起来/opt/elasticbeanstalk/config/private/rsyslog.conf/opt/elasticbeanstalk/config/private/rsyslog.conf.template取代了:

代码语言:javascript
复制
# This rsyslog file redirects Elastic Beanstalk platform logs.
# Logs are initially sent to syslog, but we also want to divide
# stdout and stderr into separate log files.

{{range .ProcessNames}}if $programname  == '{{.}}' then {
  *.=warning;*.=err;*.=crit;*.=alert;*.=emerg /var/log/{{.}}.stderr.log
  *.=info;*.=notice /var/log/{{.}}.stdout.log
}
{{end}}

在此基础上,我推测弹性豆柄使用此模板生成单个/etc/rsyslog.d/web.conf文件,其中包含每个定义的进程名的块。因为应用程序和配置部署都可以更改定义的进程,因此在两者之后重新创建该文件是有意义的。

票数 5
EN

Server Fault用户

发布于 2020-06-24 14:36:54

我将把我的解决方案放在这里,尽管这是一个与op不同的问题--它与op大致相同,并希望回答其他一些关于nodejs的评论问题。

这是针对运行Amazon 12.xAmazon Linux 2的

<#>问题:nodejs标准日志与nginx日志混合在"web“下,格式很差。

以前,在运行Nodejs的Amazon 1中,这些日志被分离为/var/log/nodejs/nodejs.log/var/log/nginx/access.log。将它们组合在一起并加上ip地址的前缀,只会使他们一塌糊涂。

我遵循了提出的解决方案,并对其进行了一些修改。

  1. .ebextension配置,它修改rsyslog.conf以将日志拆分为两个不同的文件。我正在筛选我在日志文件中看到的模式,但是您可以使用与RainerScript兼容的任何正则表达式。

我不确定他们是否想让你编辑这个文件,就像另一位评论者指出的那样,因为is是私人的。如果您对此不满意,我建议您编写自己的日志文件,而不是stdout。那样你就有更多的控制权了。

代码语言:javascript
复制
files:
  "/opt/elasticbeanstalk/config/private/rsyslog.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
        template(name="WebTemplate" type="string" string="%msg%\n")

        if $programname  == 'web' and $msg startswith '#033[' then {
            *.=warning;*.=err;*.=crit;*.=alert;*.=emerg; /var/log/web.stderr.log
            *.=info;*.=notice /var/log/web.stderr.log;
        } else if( $programname == 'web') then /var/log/node/nodejs.log;WebTemplate
  1. 现在,我已经有了一个新的日志文件,它或多或少只是节点stdout,它需要流到cloudwatch,并包含在日志包中。这些信息都有文档记录(虽然没有为Amazon 2更新)。这里没有覆盖任何内容,它们只是简单地添加了新的配置。
代码语言:javascript
复制
files:
  "/opt/elasticbeanstalk/config/private/logtasks/bundle/node.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
      /var/log/node/nodejs.log
代码语言:javascript
复制
files:
  "/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/node.json" :
    mode: "000755"
    owner: root
    group: root
    content: |
        {
            "logs": {
                "logs_collected": {
                    "files": {
                        "collect_list": [
                           
                            {
                                "file_path": "/var/log/node/nodejs.log",
                                "log_group_name": "/aws/elasticbeanstalk/[environment_name]/var/log/node/nodejs.log",
                                "log_stream_name": "{instance_id}"
                            }
                        ]
                    }
                }
            }
        }

commands:
    append_and_restart:
        command: /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a append-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/node.json -s
票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1017974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档