tomcat 9 第二个实例记录到默认的 catalina.out 位置

问题描述 投票:0回答:2

在我的 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 位置吗?

针对问题的回应: 我已经安装了带有

apt install tomcat9
的 tomcat9 和带有
tomcat9-instance-create -c 8009 staging

的实例

这是我的 tomcat9_staging.service,通过服务 tomcat9_staging 启动/重新启动来启动

#
# 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

问题似乎是启动脚本使用

run
运行 tomcat,而不是使用
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

启动

那么为什么 run 不设置为与 start 一样记录?

tomcat9
2个回答
1
投票

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

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

编辑:

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

catalina.sh run

根据 Tomcat 9.x 的 源代码,如果您以这种方式启动 Tomcat,系统变量

CATALINA_OUT
将被忽略,输出将发送到标准输出和标准错误文件。

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

编辑2:

我找到了关于使用 systemd 运行 Tomcat 的这篇文章和关于直接使用 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


0
投票

Debian 使用 systemd,它以

catalina.sh run
启动 tomcat。日志输出通过 syslog 配置
/etc/rsyslog.d/tomcat9.conf
进行配置,默认重定向到
/var/log/tomcat9/catalina.out
'tomcat9'。您只需更改 tomcat9_staging.service 中的
SyslogIdentifier
并创建自定义的
SyslogIdentifier
    

© www.soinside.com 2019 - 2024. All rights reserved.