我有一台安装了 Apache Tomcat 7.0 的 RHEL7 服务器,最近更新到 RHEL7.1 后,所有 ${catalina.base}/logs/catalina.out 的日志记录都已停止。但是我收到了journalctl内的日志。
如果我输入journalctl -u tomcat,我就会得到日志记录。有什么方法可以让我也将日志记录到 catalina.out 吗?
cat /usr/share/tomcat/logs/catalina.out
no output
journalctl -u tomcat
Aug 20 10:07:14 server.example.com server[26435]: at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
Aug 20 10:07:14 server.example.com server[26435]: at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
Aug 20 10:07:14 server.example.com server[26435]: at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
Aug 20 10:07:14 server.example.com server[26435]: at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
Aug 20 10:07:14 server.example.com server[26435]: at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
Aug 20 10:07:14 server.example.com server[26435]: at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
Aug 20 10:07:14 server.example.com server[26435]: at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
...
答案1
Jamie 的答案是正确的,您可以强制 rsyslog 记录 tomcat 发生的情况。然而,这并不能回答为什么rhel 7 上的 tomcat 7 不会登录到 catalina.out。或者,如果确实如此,为什么它会同时记录到 catalina.out 和带有日期的 catalina(如果您没有使用 RPM 安装)。
首先,在过去的 7.0.42 左右,Red Hat 的脚本使用 catalina.out,因为他们的脚本模仿 RHEL 6 的行为。据我所知,他们使用“分叉”来提供systemd
.当 7.0.56 发布时,他们完全改变了这一点,在 /usr/libexec/tomcat 中创建新的脚本和包装器,强制 tomcat 以simple
模式而不是运行forked
,从而允许 systemd 控制 PID 并stdout
访问stderr
日志。仍然有一个catalina.$DATE.log
文件/var/log/tomcat
,但信息比正常情况更加有限catalina.out
。
其次,让我们看一下/etc/tomcat/logging.properties。您将看到它以特定方式在 catalina、localhost、manager、host-manager 之间整理日志。您还会注意到它也有 rsyslog 设施支持,以及它基本上如何“处理”它。归根结底就是ConsoleHandler
该文件中的内容。更改这些将更改 中日志的行为/var/log/tomcat
。
journalctl -u tomcat
将向您展示 catalina.out 应该拥有的一切。据我所知,在不修改 /usr/libexec/tomcat 中 Red Hat 包装器的情况下,没有一种可靠的方法可以让所有内容都转到 catalina.out。如果您确实修改了这些脚本并且出现了更新,您的更改将被覆盖。
如果您确实想要 catalina.out,请使用 Jamie 的 rsyslog 示例配置。只需知道它不仅会填充该信息,而且 systemd 日志也会有相同的信息。
答案2
创建一个包含接下来两行的新文件/etc/rsyslog.d/tomcat.conf
对我来说很有效:
programname,contains,"server" /var/log/tomcat/catalina.out
programname,contains,"server" ~
然后重新启动 rsyslog 守护进程:
service rsyslog restart
答案3
看来 rsyslog 语法随着新版本的变化而改变。在 RHEL 7.4 上运行 8.24.0,以下语法/etc/rsyslog.d/tomcat.conf
让它对我有用:
if ($programname contains "server") then {
action(type="omfile" file="/var/log/tomcat/catalina.out" flushOnTXEnd="off")
stop
}
然后,正如 Jaimie 指出的那样,需要重新启动 rsyslog:
service rsyslog restart