记录文件名中包含日期的文件

时间:2012-01-22 16:13:04

标签: tomcat date redhat logrotate

我正在尝试在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。

11 个答案:

答案 0 :(得分:35)

(如果它看起来像醉酒的蜘蛛已经格式化了那么就是第一篇帖子那么抱歉)

在使用我们的朋友谷歌之后,在这里我无法记住我在哪里使用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分钟),如果每日logrotate在上次创建日志的时间或时间后不到24小时内启动,那么它有时似乎没有工作。如果它困扰你,那么使用23小时查找-mmin +1380可能更合适。

答案 1 :(得分:11)

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

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

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

  

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

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

来自find的文档。

  

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

根据评论更新

  

find / pathtologs / * -mtime +5 -delete

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

答案 2 :(得分:5)

/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 )

答案 3 :(得分:2)

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

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

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

答案 4 :(得分: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年会更低,而在以后)。这是因为在使用rotate选项时,logrotate会对所有旋转的文件名进行排序,以找出哪些日志文件较旧并应删除。

答案 5 :(得分: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以上的日志。

答案 6 :(得分:1)

可能您可以从日志文件名中删除日期,如中所述 How to remove the date pattern from tomcat logs能够使用logrotate规则。

至少对于localhost访问日志,这对我有用。

答案 7 :(得分: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

最后,为了完全涵盖这个主题,最后一个替代解决方案不是旋转日志文件(例如,在Tomcat的情况下使用rotatable=false - 查看其文档)并通常使用logrotate,但不要忘记将其与'copytruncate'选项一起使用。

欢迎提出意见......

答案 8 :(得分:0)

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

  

旋转计数

     

日志文件在被删除之前会被轮换一次或      邮寄到mail指令中指定的地址。如果算数是      0,删除旧版本而不是旋转。

答案 9 :(得分: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以应用更改。

答案 10 :(得分:0)

当前答案可能有用,但我发现它们使事情变得过于复杂,而不是使用logrotate来很好地处理事情。如果logrotate已处理此命令,则无需手动指定命令。如果仅解决卡塔琳娜(catalina)进行对数旋转的最初问题并让logrotate处理它,就不需要复杂的配置。


问题日志文件名称中的日期似乎表明文件已经被旋转:

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

那么,哪个组件已经在执行此操作,它是在/etc/logrotate.d/tomcat*中配置的吗?该文件当前在您的系统上的内容是什么?如果我没记错的话,catalina可能已经这样做了:每天创建一个新的日志文件,并将较旧的文件移到新位置。如果要使用logrotate代替它来处理,则可能要更改tomcat / catalina的默认行为,如第this answer条所述。

此后,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将报告它在做什么以及原因。

资源: