tomcat 9 秒实例记录到默认 catalina.out 位置

tomcat 9 second instance logging to default catalina.out location

在我的 debian 服务器上,我有多个 tomcat 安装。对于版本 8,这 100% 有效,现在我正在升级到版本 9,tomcat 的第二个实例正在记录到默认的 catalina.out 文件。我希望它登录到自己的位置。我试图更改 logging.proprties 中的日志记录,但这似乎不起作用。 localhost 和 catalina 翻转日志在正确的位置,所以第二个实例有自己的。

这是我的 logging.properties 第二个实例:

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

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

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.SystemdFormatter

我尝试添加:

java.util.logging.ConsoleHandler.directory = ${catalina.base}/logs

但这似乎没有帮助。

所以有人知道如何配置位置以便 catalina.out 转到 catalina。base/logs 位置?

对问题的回应: 我已经安装了 tomcat9 和 apt install tomcat9 以及 tomcat9-instance-create -c 8009 staging

的实例

这是我的 tomcat9_staging.service 启动服务 tomcat9_staging start/restart

#
# Systemd unit file for Apache Tomcat
#

[Unit]
Description=Apache Tomcat 9 Web Application Server - For Staging
Documentation=https://tomcat.apache.org/tomcat-9.0-doc/index.html
After=network.target
RequiresMountsFor=/var/log/tomcat9 /var/lib/tomcat9

[Service]

# Configuration
Environment="CATALINA_HOME=/usr/share/tomcat9"
Environment="CATALINA_BASE=/app/tomcat9/staging"
Environment="CATALINA_TMPDIR=/tmp"
Environment="JAVA_OPTS=-Djava.awt.headless=true"

# Lifecycle
Type=simple
ExecStartPre=+/usr/libexec/tomcat9/tomcat-update-policy.sh
ExecStart=/bin/sh /usr/libexec/tomcat9/tomcat-start.sh
SuccessExitStatus=143
Restart=on-abort

# Logging
SyslogIdentifier=tomcat9_staging

# Security
User=tomcat
Group=tomcat
PrivateTmp=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
CacheDirectory=tomcat9_staging
CacheDirectoryMode=750
ProtectSystem=strict
ReadWritePaths=/app/tomcat9/staging/
ReadWritePaths=/etc/tomcat9/Catalina/
ReadWritePaths=/var/lib/tomcat9/webapps/
ReadWritePaths=/var/log/tomcat9/

[Install]
WantedBy=multi-user.target

tomcat-start.sh:

#!/bin/sh
#
# Startup script for Apache Tomcat with systemd
#

set -e

# Load the service settings
. /etc/default/tomcat9

# Find the Java runtime and set JAVA_HOME
. /usr/libexec/tomcat9/tomcat-locate-java.sh

# Set the JSP compiler if configured in the /etc/default/tomcat9 file
[ -n "$JSP_COMPILER" ] && JAVA_OPTS="$JAVA_OPTS -Dbuild.compiler=\"$JSP_COMPILER\""

export JAVA_OPTS

# Enable the Java security manager?
SECURITY=""
[ "$SECURITY_MANAGER" = "true" ] && SECURITY="-security"


# Start Tomcat
cd $CATALINA_BASE && exec $CATALINA_HOME/bin/catalina.sh run $SECURITY

问题似乎是启动脚本 运行s tomcat 使用 run 而不是 start.

start 和 运行 之间存在差异。开始评估将是:

eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
  -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
  -classpath "\"$CLASSPATH\"" \
  -Djava.security.manager \
  -Djava.security.policy=="\"$CATALINA_BASE/policy/catalina.policy\"" \
  -Dcatalina.base="\"$CATALINA_BASE\"" \
  -Dcatalina.home="\"$CATALINA_HOME\"" \
  -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
  org.apache.catalina.startup.Bootstrap "$@" start \
  >> "$CATALINA_OUT" 2>&1 "&"

与 运行:

eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
  -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
  -classpath "\"$CLASSPATH\"" \
  -Djava.security.manager \
  -Djava.security.policy=="\"$CATALINA_BASE/policy/catalina.policy\"" \
  -Dcatalina.base="\"$CATALINA_BASE\"" \
  -Dcatalina.home="\"$CATALINA_HOME\"" \
  -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
  org.apache.catalina.startup.Bootstrap "$@" start

不确定这背后的想法是什么,但结果是日志记录的位置不同。

我现在的问题是,通过该服务,它不会以 start 启动,只能以 run

启动

那么为什么 运行 没有设置为与开始时相同的日志?

java.util.logging.ConsoleHandler.directory = ${catalina.base}/logs没用,。因为 ConsoleLogger 总是登录到控制台,所以目录上的设置没有意义。

catalina.out 是由 catalina.sh 中的重定向创建的,如对此 question 的回答中所述。此文件的内容可能在 Tomcat 8 和 9 之间发生了变化。您应该根据需要检查和编辑它。

编辑:

我想我知道发生了什么。您的设置用于启动 Tomcat 的脚本调用 catalina.sh run.

根据 source code for Tomcat 9.x 如果你开始 Tomcat 这样系统变量 CATALINA_OUT 被忽略并且输出被发送到标准输出和标准错误文件。

run 更改为 start,它应该可以按照您希望的方式工作,并在指定目录中创建文件 catalina.out

编辑 2:

我发现 this article about running Tomcat using systemd and this 关于直接使用 systemd 将 stdout 和 stderr 重定向到文件。我希望他们会有所帮助。

重定向可以像添加这个一样简单:

StandardOutput=append:/app/log/tomcat9_staging_catalina.out
StandardError=append:/app/log/tomcat9_staging_error.out
ReadWritePaths=/app/log/

至:/lib/systemd/system/tomcat9_staging.service