【问题标题】:Logrotate files with date in the file nameLogrotate 文件名中带有日期的文件
【发布时间】:2012-02-16 06:17:21
【问题描述】:

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

【问题讨论】:

  • 同样的问题,tomcat。 log-rotate 将每个 catalina.[date].log 视为不同的文件。它不会将它们分组为 catalina.log。它没有旋转它们。每个文件都以 catalina.[data].log.1.gz 的形式出现。所以我最终得到了 200 个文件,最后是 log.1.gz。

标签: tomcat date redhat logrotate


【解决方案1】:

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

在使用我们的朋友 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 分钟),如果自上次 / 时间创建日志以来每日 logrotate 在不到 24 小时内启动,那么它有时似乎不起作用。如果它困扰您,那么使用 find -mmin +1380 的 23 小时可能更合适。

【讨论】:

  • 使用lastaction/endscript 选项你救了我!谢谢
  • 我只为第一行投票了答案......甚至没有进一步阅读以验证解决方案是否正确。
【解决方案2】:

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

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

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

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

我选择了第二个选项,因为我们的开发人员已经在文件名中对日期进行了编码。所以它需要保持这种状态。 -mtime +5 将 find 设置为仅查找 5 天之前的文件。

来自find 的文档。

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

根据评论更新

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

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

【讨论】:

  • 除了-exec rm {} \;,您还可以在find 的许多版本中简单地使用-delete。我认为它更清楚。
  • @LászlóvandenHoek 请确保您正在做同样的事情。 -delete 不是 rm-delete 暗示 -depth。与rm 不同,如果目录为空(或被命令清空),它将删除目录。不过我同意,-delete 很好。不知道它的存在。谢谢。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    要在旋转文件中包含日期,您可能可以使用 '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

    日期格式 格式字符串

    使用类似于 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 会对所有旋转的文件名进行排序,以找出哪些日志文件较旧并且应该删除。

    【讨论】:

    • 这不是问题的重点。生成的日志文件已经具有日期格式。这个想法不是添加日期,而是管理已经生成的带有日期的文件。
    • 你说得对。感谢您指出我的回复没有直接回答问题。尽管如此,可以使用其中提到的内容,因此不会对其进行更新。
    【解决方案5】:

    /path/to/logs/*.log { 失踪的 压缩 旋转 7 }

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

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

    【讨论】:

      【解决方案6】:

      另外,您可以添加 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 天的日志。

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          好吧,我对任何答案都不完全满意,即使那些说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' 选项一起使用。

          欢迎提出建议...

          【讨论】:

            【解决方案9】:

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

            旋转计数

            日志文件在被删除或 邮寄到邮件指令中指定的地址。如果计数是 0,旧版本被删除而不是旋转。

            【讨论】:

            • 感谢保罗的回复。我将文件名作为 /var/log/tomcat6/catalina*.log 传递。因为日志文件名称不一致(其中包含日期)。 juli(tomcat的默认)默认每天滚动这些文件。我只想使用 logrotate 压缩它们,保持当前日期日志保持不变和未压缩。希望我的查询很清楚。再次感谢您的回复!
            • 当天的日志应始终保持不变。这就是 logrotate 所做的。通过设置rotate #,它将在# many 被轮换出来后删除旧的。如果您还想压缩它们,请在您的旋转脚本中使用compress 命令。 linuxcommand.org/man_pages/logrotate8.html
            • 嗨,保罗,很抱歉迟到的评论,但我正在测试这个。所以我的配置是 /var/log/tomcat6/catalina*.log { daily rotate 30 compress missingok nocreate nodateext } 所以我假设日志应该被轮换,但它没有被轮换。当我以详细模式手动运行 logrotate 时,得到以下输出:“考虑日志 /var/log/tomcat6/catalina.2012-01-23.log 日志不需要旋转考虑日志 /var/log/tomcat6/catalina.2012 -01-24.log 日志不需要轮换我做错了吗?
            【解决方案10】:

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

            下载cronolog包并安装在linux os中

            wgethttp://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 以应用更改。

            【讨论】:

            • 这个答案有复杂的变化,并没有解释做什么和为什么要做。
            【解决方案11】:

            当前的答案可能有效,但我发现它们使事情变得过于复杂,而不是使用 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 的默认行为,如this answer 首先所述。

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

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

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

            例如,您有:

            /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 将报告它在做什么以及为什么。

            资源:

            【讨论】:

              猜你喜欢
              • 2013-01-29
              • 2014-07-18
              • 2012-03-22
              • 1970-01-01
              • 2011-06-05
              • 2017-07-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多