Docker、Tomee、日志记录、标准输出、AWS

标签 docker tomcat stdout amazon-cloudwatch macos-catalina

首先让我说我不是 Tomee/TomCat 专家。
我有一个应用程序 (.war) 在 AWS 上的 ECS/Fargate 上基于 Tomee 的 Docker 容器中运行。我正在尝试让 Tomee 将所有日志发送到 STDOUT以便应用程序的日志将发送到 AWS 中的 CloudWatch。我已经尝试了建议/答案in this question但即使在本地测试时我仍然看不到应用程序日志:

docker logs -f myapp
这是添加了 java.util.logging.ConsoleHandler 的 logging.properties 文件:
handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, org.apache.tomee.jul.formatter.AsyncConsoleHandler
.handlers = 1catalina.org.apache.juli.AsyncFileHandler, org.apache.tomee.jul.formatter.AsyncConsoleHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90
1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8

2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
2localhost.org.apache.juli.AsyncFileHandler.maxDays = 90
2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8

3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
3manager.org.apache.juli.AsyncFileHandler.maxDays = 90
3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8

4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
4host-manager.org.apache.juli.AsyncFileHandler.maxDays = 90
4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8

org.apache.tomee.jul.formatter.AsyncConsoleHandler.level = FINE
org.apache.tomee.jul.formatter.AsyncConsoleHandler.formatter = org.apache.juli.OneLineFormatter
org.apache.tomee.jul.formatter.AsyncConsoleHandler.encoding = UTF-8


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
我已按照 /usr/local/tomee/bin/ 中的建议添加了一个环境变量:
#!/bin/bash
CATALINA_OUT=/dev/stdout
发送到STDOUT的所有日志会自动发送到 AWS Cloudwatch(我可以从那里的 Catalina 日志中看到信息),但访问/错误日志不是。
我在这里错过了什么吗?或者是否有更简单的方法来确保在 CloudWatch 中看到应用程序的日志?

最佳答案

经过大量研究,我发现在 server.xml 中使用以下语句将使用 AccessLogValve 将日志发送到 STDOUT :

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/dev/stdout"
   prefix="" suffix="" rotatable="false"
   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
或者
<Valve className="[...].AccessLogValve" directory="/dev"
    prefix="stdout" suffix="" fileDateFormat=""
    pattern="%h %l %u %t &quot;%r&quot; %s %b"
/>
取决于 Tomcat/Tomee 的版本,这两个都可以正常工作,无需将实际日志软链接(soft link)到 /dev/stdout

关于Docker、Tomee、日志记录、标准输出、AWS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62519985/

相关文章:

Dockerfile:我的 EXPOSE 位置是否正确?

maven-2 - Maven tomcat :redeploy packages needlessly

c - 读取字符串中的 gcc 输出

c# - 在 log4j/log4net 中捕获标准输出

c++ - 使用 C++ 从控制台应用程序收集 stdout 输出

azure - Azure DevOps 发布管道中缺少“初始化代理”步骤

mysql - Docker - 无法连接到远程数据库

docker - 如何在 docker-compose.yml 中重建 docker 容器?

hibernate - 多环境配置的maven应用无法部署到tomcat上

java - Tomcat 8 + MySQL + Spring + JPA - 无法为连接 URL '' 创建类 'null' 的 JDBC 驱动程序