使用 Logback 进行 AWS Elastic Beanstalk 应用程序日志记录

Posted

技术标签:

【中文标题】使用 Logback 进行 AWS Elastic Beanstalk 应用程序日志记录【英文标题】:AWS Elastic Beanstalk Application Logging with Logback 【发布时间】:2021-03-09 01:57:51 【问题描述】:

编辑:添加图像(问题看起来像日志文件未写入)

我正在 AWS Elastic Beanstalk 上运行 spring mvc(不是 springboot)WAR 文件,该文件位于“Tomcat 8.5 和 Corretto 11 在 64 位 Amazon Linux 2/4.1.3”环境中运行。

除了我使用 slf4j/logback 编写的应用程序日志之外,一切都按预期工作。

以下是我的logback.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE xml>
<configuration debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %dyyyy-MM-dd'T'HH:mm:ss.SSSZ [%thread] %-5level %logger36 - %msg%n
            </pattern>
        </encoder>
    </appender>
    <appender name="APPLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/java.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>/var/log/java_%dyyyy-MM-dd_%i.log</FileNamePattern>
            <!-- keep 14 days' worth of history -->
            <maxHistory>14</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the File size reaches 10MB -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%dyyyy-MM-dd'T'HH:mm:ss.SSSZ [%thread][%XremoteHost] %-5level %c1 - %msg%n</pattern>
            <!-- <pattern>%d %-5p %c1 - %m%n</pattern> -->
        </encoder>
    </appender>
    <logger name="com.personal.service.layer.mongodb" level="INFO"
        additivity="false">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLOG" />
    </logger>

    <logger name="org.springframework" level="INFO"
        additivity="false">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLOG" />
    </logger>

    <logger name="spring.web" level="INFO" additivity="false">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLOG" />
    </logger>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="APPLOG" />
    </root>

</configuration>

搜索 google/*** 后,我添加了一个带有配置文件的 ebextensions 文件夹,以将我的日志与尾部日志和捆绑包一起包含如下:

files:
  "/opt/elasticbeanstalk/tasks/bundlelogs.d/applogs.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
      /var/log/*.log

  "/opt/elasticbeanstalk/tasks/taillogs.d/applogs.conf" :
    mode: "000755"
    owner: root
    group: root
    content: |
      /var/log/*.log

经过网上的一些研究,我尝试了一些其他的组合。例如,我尝试将 logback.xml 中的日志文件设置为 /var/app/current/logs/applog.log,并在 conf 文件中使用 /var/log/current/logs/*.log,而不是上面显示的内容,但它们也不起作用。所以我觉得我错过了一些关于使用 Logback 登录到 AWS 的内容。

我也愿意接受有关使用其他东西(log4j、java 日志等)进行日志记录的(工作)建议。

编辑:终于弄清楚了 aws/eb 的混乱,并且能够通过 ssh 连接到环境。我没有看到在 var/log 文件夹(或任何其他相关文件夹)下创建了 java.log。

为什么 logback 不会写入日志?那个日志路径/var/log/java.log 不可用吗?

【问题讨论】:

日志文件是否保存在您认为的位置?您可以通过 ssh 进入 EB 实例并检查日志吗? 我正在尝试但做不到。刚刚在我的 Windows 计算机上安装了 aws 和 eb,但还没有弄清楚如何通过 ssh 连接到现有环境。当我执行 eb init (docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-init.html) 时,它没有列出我现有的应用程序。我已经添加了 API 密钥,但仍然无法正常工作。现在会继续挖掘。 eb ssh 通常就足够了,假设您在创建环境时启用了 ssh。 更新了更多细节的问题。看起来问题在于日志写入而不是检索,知道吗? 【参考方案1】:

这对我有用,感谢Logback with Elastic Beanstalk 中接受的答案,我也问过。

我想在这里结合我从这两个问题中学到的知识,因为这个问题是关于阅读日志的,而这个问题是关于写日志的,如果在一个地方有完整的答案会很好。

以下是我对问题中提到的 logback.xml 和 ebextensions 配置文件所做的更改:

(1) 在logback.xml中,将&lt;file&gt;/var/log/java.log&lt;/file&gt;更新为&lt;file&gt;/var/log/tomcat/java.log&lt;/file&gt;

(2) 在ebextensions配置文件中,将/var/log/*.log更新为/var/log/tomcat/*.log(这是可选的,即使保留为/var/log/*.log也可以)

它在/var/log 文件夹中不起作用的原因是对该文件夹的权限。当我 ssh 到该文件夹​​时,我发现该文件夹的权限仅限于 root 用户。

但是,当应用程序与 Tomcat 一起运行时,它以用户 tomcat 的身份运行,该用户无权写入该文件夹。但是,用户tomcat 有权写入/var/log/tomcat 文件夹。

我发现tomcat 用户可以访问的另一个文件夹是为应用程序/var/app 创建的文件夹。因此,如果日志文件位置设置在 logback.xml 中的该文件夹内,它也可以正常工作(还需要更新 ebextensions 配置文件以指向该位置)。

我花了几天时间终于弄明白了,希望它也能对其他人有所帮助。

附:我从 logback.xml 中取出了ConsoleAppender,它什么也没做。

【讨论】:

以上是关于使用 Logback 进行 AWS Elastic Beanstalk 应用程序日志记录的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk Worker - 根据可用队列消息的数量进行扩展

使用 AWS Elastic Beanstalk 进行部署时,是不是应该将静态文件存储在单独的 S3 中?

如何让 AWS S3 存储桶中的 Angular 应用程序对 AWS Elastic Beanstalk 中的服务进行 API 调用

使用 AWS Elastic Beanstalk 部署 Rails ActionCable

使用 AWS Elastic MapReduce 获取时间序列数据的 Hive、HBase 和 Pig

AWS Elastic Beanstalk 使用 PHP 和私有 Composer 存储库