对于 wildfly(在 Linux 上),我需要以下日志记录方案:每日轮换server.log
并删除超过 90 天的旧日志文件。我没有看到在 wildfly/log4j 中配置此功能的方法(问题在于删除旧日志文件,但我很乐意提供直接使用 wildfly 配置执行此操作的提示)。因此我必须为此使用 linux logrotate。我有以下 logrotate 配置文件:
/var/log/wildfly/capp/*.log {
missingok
daily
notifempty
rotate 90
maxage 90
dateext
dateformat -%Y%m%d
}
将server.log
在清晨成功轮换。但是:wildfly 仍在将日志消息写入已轮换的文件中(查看上次写入访问的时间戳):
#> ls -la
-rw-r--r-- 1 wildfly-capp wildfly-capp 0 4. Apr 03:40 server.log
-rw-r--r-- 1 wildfly-capp wildfly-capp 368909 4. Apr 07:00 server.log-20190404
有没有办法强制 wildfly 使用该server.log
文件而不是已经轮换的文件(无需重新启动 wildfly)?或者是否可以更改 wildfly 日志配置以删除超过x
几天的日志文件?
wildfly 日志记录配置为:
<subsystem xmlns="urn:jboss:domain:logging:5.0">
<console-handler name="CONSOLE">
<level name="INFO"/>
<formatter>
<named-formatter name="COLOR-PATTERN"/>
</formatter>
</console-handler>
<file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<append value="true"/>
</file-handler>
<logger category="com.arjuna">
<level name="WARN"/>
</logger>
<logger category="org.jboss.as.config">
<level name="DEBUG"/>
</logger>
<logger category="sun.rmi">
<level name="WARN"/>
</logger>
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
<formatter name="PATTERN">
<pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
<formatter name="COLOR-PATTERN">
<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
</subsystem>
答案1
旋转日志后,您需要告诉 wildfly 日志已旋转,并且它应该开始写入新日志文件。通常,这是通过向守护进程发送 HUP 信号来完成的,或者您可以重新启动它。否则,守护进程将保留打开文件的文件句柄,并将写入旧文件。这是通过添加 postrotate 部分来完成的,该部分告诉日志旋转后需要做什么。查看 logrotate 配置文件中 postrotate 部分的示例。以下是我的计算机上针对 ufw 和 samba 的一些示例:
postrotate
invoke-rc.d rsyslog rotate >/dev/null 2>&1 || true
endscript
postrotate
if [ -d /run/systemd/system ] && command systemctl >/dev/null 2>&1 && systemctl is-active --quiet samba-ad-dc; then
systemctl kill --kill-who all --signal=SIGHUP samba-ad-dc
elif [ -f /var/run/samba/samba.pid ]; then
# This only sends to main pid, See #803924
kill -HUP `cat /var/run/samba/samba.pid`
fi
endscript
对于 wildfly,您必须编写自己的命令来使 wildfly 重新打开日志文件。
答案2
重点是我不想重启 wildfly。感谢“nobody”的回答。但现在我知道 logrotate 不适合我的情况。
一种解决方法是在 wildfly 中使用“size-rotating-file-handler”(而不是“file-handler”)。要切换到 size rotation handler,我必须编辑并将部分standalone.xml
替换为:<file-handler name="FILE" autoflush="true">
<subsystem xmlns="urn:jboss:domain:logging:5.0">
<size-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<append value="true"/>
<rotate-size value="1M"/>
<max-backup-index value="10"/>
</size-rotating-file-handler>
server.log
当日志文件大于 1MB 时,这将轮换文件,并且仅保留 10 个日志备份文件。所有较旧的日志文件都将被删除。
我认为,如果您想要一个每日轮换日志文件附加器来删除超过几天的日志文件x
,您必须编写一个自己的附加器DailyRotateFileAppender
,它也可以删除旧的日志文件。然后,您必须将新的文件附加器集成到 wildfly 中(wildfly 必须找到类文件,并且standalone.xml
必须更改配置,以便 wildfly 将使用新的文件附加器)。我认为这应该可行。然而,对我来说,这样做所需的时间太长了……
答案3
您可以将 logrotate 和 JBOSS 选项结合起来吗?对于独立配置更改logging.properties
:
logger.handlers=FILE
handler.log_rotation.suffix=-yyyyMMdd
-
并且仅对文件名中带有以下内容的文件使用 logrotate :
/var/log/wildfly/capp/*.log-* {