37

我正在尝试在 RHEL 中为 tomcat6 日志配置 logrotate。目前,logrotate 适用于 catalina.out 日志,它已正确旋转和压缩。

问题在于其中包含日期的文件,例如:

catalina.2012-01-20.log
catalina.2012-01-21.log
catalina.2012-01-22.log

这些文件没有被轮换。我知道我必须在 /etc/logrotate.d/tomcat6 文件中配置这些,其中配置了 catalina.out 的旋转。但我无法配置它。

我想要的是每天压缩这些旧文件,除了当前的日期日志文件。

任何人都可以帮我解决这个问题,拜托!!

谢谢诺曼 A。

4

11 回答 11

50

(第一次发帖,如果它看起来像一个醉酒的蜘蛛已经格式化了,那么对不起)

在使用我们的朋友 Google 之后,我不记得我在哪里使用 logrotate (而不是 cron 或其他等效项)设法实现了一些目标。

我在 /var/log/rsync/ 中有以下内容:

-rw-r--r-- 1 root root 1.1M Apr  9 08:13 2014-04-09 07:48:18.log
-rw-r--r-- 1 root root 1.4M Apr 11 15:20 2014-04-11 15:02:52.log
-rw-r--r-- 1 root root 1.6M Apr 11 15:42 2014-04-11 15:22:04.log
-rw-r--r-- 1 root root 1.8M Apr 12 08:01 2014-04-12 07:45:31.log
-rw-r--r-- 1 root root 2.0M Apr 13 08:10 2014-04-13 07:53:38.log
-rw-r--r-- 1 root root 2.2M Apr 14 08:19 2014-04-14 07:51:09.log
-rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log
-rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log

和以下 logrotate 文件:

/var/log/rsync/*.log {
       daily
       rotate 7
       compress
       delaycompress
       notifempty
       missingok
}

我认为这是完全合理的。但是在它拒绝工作并且发现它永远不会工作(由这篇文章提供)之后,我想知道是否可以捏造它使其工作。

经过大量测试和调整后,我设法通过以下方式对其进行了捏造:

/var/log/rsync/dummy {
        daily
        rotate 0
        create
        ifempty
        lastaction
                /usr/bin/find /var/log/rsync/ -mtime +7 -delete
                /usr/bin/find /var/log/rsync/ -mtime +1 -exec gzip -q {} \;
        endscript
}

进入一个名为 /etc/logrotate.d/local-rsync 的 logrotate 配置文件。然后创建虚拟日志文件:

touch /var/log/rsync/dummy

然后强制进行logrotate:

logrotate -fv /etc/logrotate.d/local-rsync

这使:

-rw-r--r-- 1 root root  71K Apr  9 08:13 2014-04-09 07:48:18.log.gz
-rw-r--r-- 1 root root  88K Apr 11 15:20 2014-04-11 15:02:52.log.gz
-rw-r--r-- 1 root root  82K Apr 11 15:42 2014-04-11 15:22:04.log.gz
-rw-r--r-- 1 root root  84K Apr 12 08:01 2014-04-12 07:45:31.log.gz
-rw-r--r-- 1 root root  87K Apr 13 08:10 2014-04-13 07:53:38.log.gz
-rw-r--r-- 1 root root  92K Apr 14 08:19 2014-04-14 07:51:09.log.gz
-rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log
-rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log
-rw-r--r-- 1 root root    0 Apr 16 12:11 dummy

现在只等明天早上...

我意识到 cron 会更整洁,但是我在 logrotate 配置文件中有另一个元素,并希望将两者保持在一起。

虚拟文件的好处是它不占用任何空间!

您可能会发现它似乎一天没有旋转任何东西。我花了一段时间才弄清楚原因,但后来它开始发芽了。find -mtime +1 是一整天(即 24 * 60 分钟),如果自上次创建日志后不到 24 小时开始每日 logrotate,则有时它似乎不起作用。如果它困扰您,那么使用 find -mmin +1380 的 23 小时可能更合适。

于 2014-04-16T11:51:19.410 回答
11

我花了很长时间阅读大量文档。Logrotate 似乎无法使用文件名中包含的日期对不同的文件进行分组。Logrotate 不能做我们需要它做的事情。

您有两个选项可以将 java / tomcat 提供的日志记录工具更改为不在文件名中包含日期。 http://tomcat.apache.org/tomcat-6.0-doc/logging.html

第二种更快的方法是使用您自己的小脚本为您完成工作,使用find. https://serverfault.com/questions/256218/logrotation-when-filenames-includes-date , https://serverfault.com/a/256231/71120

查找 /pathtologs/* -mtime +5 -exec rm {} \;

我选择了第二个选项,因为我们的开发人员已经在文件名中编码了日期。所以它需要保持这种状态。-mtime +5集合查找仅查找超过 5 天的文件。

来自find的文档。

文件的数据最后一次修改是在 n*24 小时前。请参阅 -atime 的注释以了解舍入如何影响文件修改时间的解释。

根据评论更新

查找 /pathtologs/* -mtime +5 -delete

如果您特别想删除,这是一种快速的方法。如果您需要其他命令,您可以随时将其替换为其他命令exec rm {} \;

于 2012-03-15T10:37:05.530 回答
7

/etc/cron.d/rotate_tomcat_logs 中的类似内容:

# delete every log file over 100 days old, and compress every log file over 1 day old.
00 1 * * * root ( find /opt/tomcat/logs -name \*log\* -name \*.gz -mtime +100 -exec rm -f {} \; >/dev/null 2>&1 )
05 1 * * * root ( find /opt/tomcat/logs -name \*log\* ! -name \*.gz -mtime +1 -exec gzip {} \; >/dev/null 2>&1 )
于 2014-03-24T21:40:15.977 回答
2

/path/to/logs/*.log {missingok 压缩旋转 7 }

这种事情不能正常工作,因为正如其他人指出的那样,tomcat 有自己的日志轮换。您可以使用简单的 cron 删除旧文件或关闭访问日志阀的轮换。通过关闭日志轮换(并可能更改文件名模式),上述 logrotate 和其他类似配置将正常工作。

底线是您应该使用 logrotate 或 tomcat 中的内置日志轮换,但不能同时使用两者。

于 2013-04-02T18:05:01.117 回答
2

此外,您可以添加 crons 而不是硬编码 logrotate。

1 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +30 -delete
2 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +1 -exec gzip -q {} \;

这样,您将删除超过 30 天的日志,并压缩超过 1 天的日志。

于 2018-07-02T18:55:53.300 回答
2

要在旋转文件中包含日期,您可能可以使用 'dateext' 选项。

$ cat logrotate.conf 
/var/nginx/logs/access.log {
    size 10k
    copytruncate
    dateext
    rotate 10
    compress
}

旋转的文件应该创建类似于下面

 root@nitpc:~# ls -lrt /var/nginx/logs/access.*
-rw-r--r-- 1 nginx root 5422 May 31 08:26 access.log
-rw-r--r-- 1 nginx root  466 May 31 08:26 access.log-20180531.gz

唯一的缺点是您每天无法运行它超过一次,因为该文件将具有该日期的明确名称。

上面的例子来自我在 GC 上运行在 k8s 上的 Nginx docker 容器。logrotate 版本是 3.11.0。

希望有帮助!

更新:来自手册页https://linux.die.net/man/8/logrotate

dateformat 格式字符串

使用类似于 strftime(3) 函数的符号指定 dateext 的扩展名。只允许使用 %Y %m %d 和 %s 说明符。默认值为 -%Y%m%d。请注意,将日志名称与扩展名分开的字符也是 dateformat 字符串的一部分。系统时钟必须设置在 2001 年 9 月 9 日之后,%s 才能正常工作。请注意,此格式生成的日期戳必须是词法可排序的(即,首先是年份,然后是月份,然后是日期。例如,2001/12/01 可以,但 01/12/2001 不是,因为 01/11/ 2002 会在稍后排序)。这是因为在使用旋转选项时,logrotate 会对所有旋转的文件名进行排序,以找出哪些日志文件较旧并且应该被删除。

于 2018-05-31T08:35:48.843 回答
1

可能您可以从日志文件名中删除日期,如 如何从 tomcat 日志中删除日期模式以能够使用 logrotate 规则中所述。

这至少对本地主机访问日志有用。

于 2012-07-25T07:26:19.327 回答
1

好吧,我对任何答案都不完全满意,即使那些声明logrotate不支持这个(即只是删除由其他应用程序旋转的文件)场景肯定是正确的(在该工具上提出功能请求,也许?)。

所以,我想分享一个我已经找到的替代方法。与“ find /path/to/logs -mtime +7 -delete”解决方案不同,此解决方案不会在指定时间段后删除所有旧日志。所以它来了,一个示例单行 bash 命令,它只在磁盘上留下最后 N 个日志(无论何时运行):

for f in `ls -1r | grep -E "^catalina\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.log$" | tail -n +$((N+1))`; do rm $f; done

最后,为了完全涵盖该主题,最后一个替代解决方案是不轮换日志文件(例如rotatable=false,在 Tomcat 的情况下使用 - 请参阅其文档)并logrotate像往常一样使用,但不要忘记将其与'copytruncate'一起使用选项。

欢迎提出建议...

于 2017-12-14T16:04:37.007 回答
0

在您的日志轮换文件中,使用rotate #,其中 # 是您在删除它们之前要保留的日志数量。

旋转计数

日志文件在被删除或邮寄到邮件指令中指定的地址之前会轮换几次。如果 count 为 0,则删除旧版本而不是轮换。

于 2012-01-22T16:20:07.403 回答
0

要在 tomcat [linux] 中使用 catalina 文件的日期后缀启用每日日志轮换,请执行以下更改。

下载cronolog包并安装在linux os中

wget http://pkgs.fedoraproject.org/repo/pkgs/cronolog/cronolog-1.6.2.tar.gz/md5/a44564fd5a5b061a5691b9a837d04979/cronolog-1.6.2.tar.gz

tar -zxvf cronolog-1.6.2.tar.gz
./configure
make
make install 

使用 vi 命令打开 apache-tomcat-7.0.65/bin/catalina.sh 文件并更改以下示例:/opt/apache-tomcat-7.0.65/bin/catalina.sh

shift
touch "$CATALINA_OUT"
# comment above line as below 
#touch "$CATALINA_OUT"
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
  echo "Using Security Manager"
fi
shift
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\"" \
  -Dcatalina.base="\"$CATALINA_BASE\"" \
  -Dcatalina.home="\"$CATALINA_HOME\"" \
  -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
  org.apache.catalina.startup.Bootstrap "$@" start \
  #>> "$CATALINA_OUT" 2>&1 "&"
  # comment above line and add below given line
2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" &
else
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 "&"         
  # comment above line and add below given line
2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" &
fi

完成上述更改后,保存文件并重新启动 tomcat 以应用更改。

于 2016-04-08T06:00:07.560 回答
0

当前的答案可能有效,但我发现它们使事情变得过于复杂,而不是使用 logrotate 已经可以很好地处理事情。如果 logrotate 已经处理了这个,你不需要手动指定命令。如果您只是解决 catalina 进行 logrotation 的初始问题并让 logrotate 处理它,则不需要复杂的配置。


看起来文件已经被轮换,如问题中日志文件名称中的日期所示:

catalina.2012-01-20.log
catalina.2012-01-21.log
catalina.2012-01-22.log

那么,哪个组件已经这样做了,它是在 /etc/logrotate.d/tomcat* 中配置的吗?你系统上这个文件的内容是什么?如果我没记错的话,catalina 自己可能已经这样做了:每天创建一个新的日志文件并将旧文件移动到新位置。如果您希望 logrotate 来处理此问题,则可能需要更改 tomcat / catalina 的默认行为,如本答案中所述。

在那之后,catalina 应该总是写信给catalina.log.

然后你就可以把轮换/压缩/删除完全交给logrotate来负责了。

如果要压缩旧文件,可以将compress添加到 logrotate 配置中:

例如,您有:

/somepath/catalina.log {
  # truncate file in place
  copytruncate
  # rotate daily
  daily
  # keep max 7, will delete after that
  rotate 7
  # when rotating create file with date, e.g. catalina.log-20200304
  dateext
  # compress
  compress
  # manpage: "Postpone  compression  of  the previous log file
  #   to the next rotation cycle.  
  #   This only has effect when used in combination with compress."
  delaycompress 
  # change this to correct owner and permissions of logfile
  create 750 tomcat6 tomcat6
  # do not generate an error if logfile is missing
  missingok
  # do not rotate if the file is empty
  notifempty 

}

结果你应该得到什么:

catalina.log
catalina.log-20200304
catalina.log-20200303.gz
...

如果事情不工作:

  • 使用 -v 手动执行 logrotate
  • 它还应该显示记录最后轮换的状态文件,例如 /var/lib/logrotate/status
  • 通常它将每天旋转一次(或您指定的任何内容)。您可以使用 -f 强制执行此操作。或者您可以操作状态文件(除非您知道自己在做什么,否则不要在生产中执行此操作)

一个常见的错误是人们手动运行 logrotate,然后如果没有任何更改就会感到困惑。Logrotate 只会执行它已配置执行的操作。如果您指定每日轮换,即使您根据需要多次运行它也不会再次轮换,除非您使用 -f。它将使用状态文件进行跟踪。您可以使用 -v 并且 logrotate 将报告它在做什么以及为什么。

资源:

于 2020-03-04T09:55:54.203 回答