Docker,Tomee,日志记录,STDOUT,AWS

时间:2020-06-22 17:18:25

标签: 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中可以看到应用程序的日志?

1 个答案:

答案 0 :(得分:1)

经过大量研究,我发现在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" />

OR

<Valve className="[...].AccessLogValve" directory="/dev"
    prefix="stdout" suffix="" fileDateFormat=""
    pattern="%h %l %u %t &quot;%r&quot; %s %b"
/>

根据Tomcat / Tomee的版本,这两种方法都可以很好地工作,而无需将实际日志软链接到/dev/stdout