logrotate 不旋转 catalina.out

Posted

技术标签:

【中文标题】logrotate 不旋转 catalina.out【英文标题】:logrotate doesn't rotate catalina.out 【发布时间】:2019-05-12 18:33:10 【问题描述】:

我正在尝试使用 logrotate 每天自动轮换 tomcat 的 catalina.out,即使我可以手动调用 logrotate 并且它工作正常。我正在使用我已经尝试了所有解决方案,但我无法让它旋转。我在 Oracle Linux 7.5 上,基本上是 RHEL 7。

以下是我采取的步骤:

我创建了一个文件 /etc/logrotate.d/tomee.conf,如下所示:

    /apache-tomee-plus-7.0.4/logs/catalina.out
    
        su opc opc
        daily
        rotate 7
        compress
        notifempty
        missingok
        copytruncate
    

我可以手动执行 logrotate 并且使用 sudo /usr/sbin/logrotate /etc/logrotate.conf 可以正常工作

我也尝试使用sudo /usr/sbin/logrotate -d /etc/logrotate.conf进行调试,输出没有错误

    ...
    rotating pattern: /apache-tomee-plus-7.0.4/logs/catalina.out
     after 1 days (7 rotations)
    empty log files are not rotated, old logs are removed
    switching euid to 1000 and egid to 1000
    considering log /apache-tomee-plus-7.0.4/logs/catalina.out
      log needs rotating
    rotating log /apache-tomee-plus-7.0.4/logs/catalina.out, log->rotateCount is 7
    dateext suffix '-20181211'
    glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    copying /apache-tomee-plus-7.0.4/logs/catalina.out to /apache-tomee-plus-7.0.4/logs/catalina.out-20181211
    truncating /apache-tomee-plus-7.0.4/logs/catalina.out
    compressing log with: /bin/gzip
    switching euid to 0 and egid to 0
    ...

但它仍然不会每天自动执行。

我也知道 logrotate 正在运行,因为根据/var/lib/logrotate/logrotate.status,正在轮换其他日志,但不是 catalina.out

    cat /var/lib/logrotate/logrotate.status
    logrotate state -- version 2
    "/var/log/yum.log" 2018-11-29-18:44:14
    "/var/log/up2date" 2018-9-17-19:0:0
    "/apache-tomee-plus-7.0.4/logs/catalina.out" 2018-12-8-0:37:14
    "/var/log/chrony/*.log" 2018-9-17-19:0:0
    "/var/log/wtmp" 2018-12-3-17:48:49
    "/var/log/spooler" 2018-11-29-18:44:14
    "/var/log/btmp" 2018-12-3-17:48:49
    "/var/log/iscsiuio.log" 2018-9-17-19:0:0
    "/var/log/maillog" 2018-12-11-3:7:1
    "/var/log/secure" 2018-12-11-3:7:1
    "/var/log/messages" 2018-12-11-3:7:1
    "/var/account/pacct" 2018-9-17-19:0:0
    "/var/log/cron" 2018-12-11-3:7:1

请注意,有多个条目说它在 12-11 进行了轮换,但 catalina.out 从 12-8 开始就没有轮换,但它仍然没有轮换。

非常感谢任何帮助。谢谢。

【问题讨论】:

您的配置中有“notifempty”。你的 catalina.out 文件不是空的吗? (如果您配置日志记录属性,该文件应该是空的。-我的意思是如果您将系统配置为将所有内容记录到正确的文件而不是写入 System.out/System.err/Console)。 肯定不是空的,我调试的时候可以看到,说日志需要轮换 您以哪个用户的身份运行 logrotate 手册? logrotate 服务作为哪个用户运行?尝试以服务运行的同一用户身份手动执行它,并将“-verbose”标志添加到命令中以获取更多详细信息! 我尝试以用户定义的su opc opc 运行,并且日志正确旋转 【参考方案1】:

使用来自 Apache 的 rotatelogs 很容易。 只需设置 env 属性:

CATALINA_OUT_CMD="/usr/sbin/rotatelogs -f $CATALINA_BASE/logs/catalina.out.%Y-%m-%d.log 86400"

它将创建一个命名管道 catalina.out,这样它就可以在不重新启动 Tomcat 的情况下进行轮换。

有关更多信息,请参阅 catalina.sh 文件。

【讨论】:

【参考方案2】:

这是一个老案例,我明白了,但我觉得我应该添加我的解决方案,因为它确实会旋转日志,这是最初的问题。

就我而言,我设置 /etc/logrotate.d/tomcat 文件的方式与 Justin 在最初的问题中所做的大致相同:

/<apache-location>/tomcat/logs/catalina.out 
  daily    
  copytruncate
  rotate 180
  compress
  missingok
  maxsize 200M

(我的 apache 位置很奇怪,所以酌情替换。rotate 180 将我的日志保留大约 30 天,如果我的数学不是太远(24 小时 * 30 天 = 720 小时 --> 如果每 4 次轮换一次小时,产生 720 / 4 = 180 次 --> 保留 180 个日志文件)。)

但我从正常的 cronjob 触发执行,如下所示:

0 */4 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat >> /var/log/cut.log 2>&1

要每天轮换,只需将 cronjob 的第一部分调整为例如0 0 * * *(每天午夜)。

-vf 选项用于打开详细信息(用于记录 cron)并强制执行轮换。 /var/log/cut.log 是我专门为记录 cron 作业而添加的文件。 &gt;&gt; /var/log/cut.log 2&gt;&amp;1 当然可以删除。

我正在以 root 用户身份运行轮换/cron 作业。

这似乎在我的系统上工作,在最初遇到 很多 麻烦之后。不确定这是理想的解决方案,但至少我已经避免catalina.out 长到天上,这是我的主要目标,我也怀疑原来的目标问题...

【讨论】:

【参考方案3】:

由于这获得了很多意见,我将让大家知道我找到的解决方案。

我无法让 logrotate 在 catalina.out 上工作,很抱歉,如果这是您要找的。​​p>

我能够做的是阻止 catalina.out 生成。为此,我在 apache-tomee-plus-7.0.4/bin 中创建了一个名为 setenv.sh 的文件,并将这一行放入其中

export CATALINA_OUT="/dev/null"

tomee 启动时,在 catalina.sh 中看起来像这样

eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
  -classpath "\"$CLASSPATH\"" \
  -Djava.security.manager \
  -Djava.security.policy=="\"$CATALINA_BASE/conf/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 "&"

所以输出到一个文件似乎有必要在后台运行这个 tomee。输出到 /dev/null 让它在某处输出,但它无处可去

【讨论】:

【参考方案4】:

从 logrotate.status 的输出可以看出 catalina.out 并没有被 logrotate 控制。

在文件/etc/logrotate.conf中,请检查该行

include /etc/logrotate.d

如果此行不存在,请添加它。 仅当此行存在时,才会考虑添加到 /etc/logrotate.d 中的配置。

【讨论】:

这个片段怎么样considering log /apache-tomee-plus-7.0.4/logs/catalina.out log needs rotating

以上是关于logrotate 不旋转 catalina.out的主要内容,如果未能解决你的问题,请参考以下文章

Logrotate - nginx 日志不在 docker 容器内旋转

旋转异常日志的logrotate问题

tomcat Catalina.ou按日保存日志文件分割方法

在 logrotate 之后不写 MariaDB 慢日志

我一直在尝试使用 logrotate 实用程序并将压缩日志移动到 s3,但是,它仅在强制完成时才会旋转

python WatchedFileHandler 在旋转后仍然写入旧文件