在以前的版本中,我看到 catalina.out 文件是在 /var/log/tomcat8/catalina.out 位置创建的。
当我研究当前安装的 Ubuntu 18.10 和最新的软件包版本时,我发现这个文件始终是空的。
我研究了 Tomcat8 配置,发现此输出由文件 /etc/tomcat8/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.
这意味着每天都会在 /var/log/tomcat8 中创建一个新文件,文件名名为 catalina.2018-11-30。
此外,logrorate 配置仍然存在,但配置在 /var/log/tomcat8/catalina.out 上。因此没有影响。
此外,logrotate 配置能够使用 adm 更改文件的组名。现在,所有者设置为 tomcat8:tomcat8
这是预期的行为还是 tomcat8 包的配置集中缺少某些内容?
问候
艾蒂安·朱万
答案1
似乎 catalina.out 日志记录在 18.10 中被破坏了。tomcat8 通过 rsyslog 记录到 catalina.out,正如您在包的 /etc/rsyslog.d/tomcat8.conf 中看到的那样
$template TomcatFormat,"[%timegenerated:::date-year%-%timegenerated:::date-
month%-%timegenerated:::date-day% %timegenerated:::date-
hour%:%timegenerated:::date-minute%:%timegenerated:::date-second%]
[%syslogseverity-text%]%msg%\n"
:programname, startswith, "tomcat8" {
/var/log/tomcat8/catalina.out;TomcatFormat
stop
}
不幸的是,Ubuntu 18.10 上 rsyslog 的权限似乎不正确,无法实现此功能。我在我的系统日志中发现了这一点:
rsyslogd:文件'/var/log/tomcat8/catalina.out':打开错误:权限被拒绝[v8.32.0尝试http://www.rsyslog.com/e/2433]
这会导致 rsyslog 将所有 tomcat8 日志发送到 /var/log/syslog
副作用是,这导致 catalina.out 上的 logrotate 看起来“毫无意义”。它可能仍打算继续工作。
您应该确保组 syslog 对 catalina.out 文件具有写入权限,然后重新启动 rsyslog。从此时起,日志记录应该可以正常运行。
确保此权限的一种(简单)方法:
sudo service tomcat8 stop
sudo touch /var/log/tomcat8/catalina.out
sudo chown tomcat8:syslog /var/log/tomcat8 -R
sudo chmod g+rwx /var/log/tomcat8
sudo chmod g+rw /var/log/tomcat8 -R
sudo chmod g+s /var/log/tomcat8 -R
sudo service rsyslog restart
sudo service tomcat8 start
答案2
(这主要是评论 - 但在评论部分发布有点长 - 我讨厌那些只是说“我这样做了并且有效”的答案)
Tomcat9 日志在 Ubuntu 18.10 上也同样混乱
我还将网络访问日志写入 /var/log/tomcat9。
虽然我看到了@Christina 描述的文件,但其中没有提到 localhost_access_log.YYYY-MM-DD.txt 文件。
尽管 catalina*.out 文件以日期命名,即文件创建的日期,但它们不会被轮换。
然而某物稍后会压缩它们。这实际上是 cron 作业 (/etc/cron.daily/tomcat9)。这与 Tomcat 日志配置中使用的文件命名一致,但不会强制 Tomcat 刷新和关闭日志。
日志文件归 tomcat 用户所有(意味着这些文件不由 rsyslog 维护),当我检查时,fuser
是 tomcat 具有打开的文件句柄,而不是 rsyslog。
在我看来,/var/log/syslog 中报告拒绝向 rsyslog 提供权限的错误是转移注意力的借口 - 有一个 rsyslog 配置,但默认的 Tomcat 配置不会向 syslog 发送任何日志。事实上,由于它使用的是 java.util.logging,因此无法直接将 syslog 数据发送到 rsyslog。
logrotate 脚本也损坏了/与 tomcat9 的日志配置无关。它使用了错误的文件模式,并且没有告诉 tomcat 刷新/重新打开其日志文件。
因此,我们在包中提供了三种不同的日志管理机制,但它们都无法解决日志轮换问题,而且实际上会破坏日志文件的完整性。
由于我计划实现日志聚合,因此我选择从根本上着手将数据发送到 syslog,而不是修复文件机制。Ubuntu 上 Tomcat 的默认版本使用 java.util.logging 来提供日志记录功能。虽然它支持基于网络套接字的日志记录,但它不实现 syslog 消息协议。但是,tomcat 进程由 systemd 管理,默认的 tomcat 配置会将日志消息发送到 stdout 和文件,因此我进行了修改,/lib/systemd/system/tomcat9.service
添加了以下几行:
StandardOutput=syslog
StandardError=syslog
请注意 已有一个条目SyslogIdentifier=tomcat
。
这样就可以将数据导入 rsyslog。下一步是将数据从 rsyslog 导出到文件中。我添加了一个新文件 (/etc/rsyslog.d/10-symcbean.conf),其中包含:
$CreateDirs on
template(name="myfile" type="string"
string="/var/log/apps/%programname%.log")
if ($programname startswith "tomcat") then {
action(type="omfile" dynaFile="myfile")
stop
}
(这里“startswith”字符串指的是 systemd 配置中的“SyslogIdentifier”)。
我还创建了 tomcat:syslog 拥有的目录 /var/log/apps(tomcat 用户不需要访问此目录来访问现在由 rsyslog 处理的标准日志,但我也会在其中写入垃圾收集日志)。
然后只需重新启动 rsyslog 和 tomcat 即可,我看到 /var/log/apps/tomcat.log 中出现的日志条目与写入 /var/log/tomcat9 的日志条目相同。下一步是通过编辑 /var/lib/tomcat9/conf/logging.properties 来退出 /var/log/tomcat9 中直接写入的日志,如下所示:
# handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
handlers = java.util.logging.ConsoleHandler
# .handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
.handlers = java.util.logging.ConsoleHandler
我不需要 Web 访问日志,因为 HTTP 流量由处理所需日志的 nginx 代理进行调解。我在 conf/server.xml 中注释掉了这些条目。
难题的最后一部分是启用日志轮换。这是 /etc/logrotate.d 中的一个新文件,其中包含:
/var/log/apps/tomcat*.log
{
rotate 20
su syslog syslog
create 0644 syslog syslog
daily
dateext
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
(文件名上的通配符允许不同的日志流/多个日志文件)。