用 rotatelogs 旋转 catalina.out?

Rotate catalina.out with rotatelogs?

我正在尝试轮换 catalina.out 当它超过我帮助开发的专用安全设备的最大尺寸时。我们目前使用 logrotate 来完成这项任务,但我试图让文件在达到大小限制时立即旋转,而不是依赖于每天的 cron 作业。

根据the Tomcat FAQ, I should try patching catalina.sh to pipe output to a command, like so。我们在这个设备上没有 cronolog,但是我们有 httpd 所以我决定使用 rotatelogs:

CATALINA_OUT_CMD="/usr/sbin/rotatelogs -f $CATALINA_OUT 100M >/dev/null 2>&1"

问题是 catalina.out 甚至没有在那里创建。我该怎么办?

这是 my 版本的补丁文件的一部分,它启用了管道命令:

@@ -33,6 +33,13 @@
#                   will be redirected.
#                   Default is $CATALINA_BASE/logs/catalina.out
#
+#   CATALINA_OUT_CMD (Optional) Command which will be executed and receive
+#                   as its stdin the stdout and stderr from the Tomcat java
+#                   process.  Only used if CATALINA_OUT is not defined.
+#                   No default.
+#                   Example (all one line)
+#                   CATALINA_OUT_CMD="cronolog $CATALINA_BASE/logs/catalina.%Y-%m-%d.out >/dev/null 2>&1"
+#
#   CATALINA_OPTS   (Optional) Java runtime options used when the "start",
#                   "run" or "debug" command is executed.
#                   Include here and not in JAVA_OPTS all options, that should
@@ -367,13 +374,22 @@ elif [ "" = "start" ] ; then
fi

shift
-  touch "$CATALINA_OUT"
+  if [ -z "$CATALINA_OUT_CMD" ] ; then
+    catalina_out_command=">> \"$CATALINA_OUT\" 2>&1"
+  else
+    catalina_out_command="| $CATALINA_OUT_CMD"
+  fi
+  if [ ! -z "$CATALINA_PID" ]; then
+    catalina_pid_file="$CATALINA_PID"
+  else
+    catalina_pid_file=/dev/null
+  fi
if [ "" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
-    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
+    eval \{ "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Djava.security.manager \
-Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
@@ -381,21 +397,17 @@ elif [ "" = "start" ] ; then
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
-      >> "$CATALINA_OUT" 2>&1 "&"
+      2\>\&1 \& echo $! \>\"$catalina_pid_file\" \; \} $catalina_out_command "&"

else
-    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
+    eval \{ "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
-      >> "$CATALINA_OUT" 2>&1 "&"
-
-  fi
+      2\>\&1 \& echo $! \>\"$catalina_pid_file\" \; \} $catalina_out_command "&"

-  if [ ! -z "$CATALINA_PID" ]; then
-    echo $! > "$CATALINA_PID"
fi

echo "Tomcat started."

P.S。以防万一,我正在使用以下修改后的 "out command" 测试轮换,这样我就不必等待日志填满:

CATALINA_OUT_CMD="/usr/sbin/rotatelogs -f $CATALINA_OUT 1M >/dev/null 2>&1"

P.P.S。如果你们让我再次尝试 log4j,我愿意再次尝试,但我上次尝试时没能成功。

好问题。我不知道以特定文件大小强制旋转的方法。这是有道理的,因为它意味着应用程序必须不断 运行 并检查......但是,您可以增加 logrotate 运行的频率并设置大小限制。如果它每 15 分钟运行一次,最大允许大小为 50MB,则最多只能超过 50MB 15 分钟。

您可以设置它在 cron 中运行的频率。