Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tomcat Logrotate文件名中包含日期的文件_Tomcat_Date_Redhat_Logrotate - Fatal编程技术网

Tomcat Logrotate文件名中包含日期的文件

Tomcat Logrotate文件名中包含日期的文件,tomcat,date,redhat,logrotate,Tomcat,Date,Redhat,Logrotate,我正在尝试在RHEL中为tomcat6日志配置logrotate。目前,logrotate对于catalina.out log工作正常,它被正确地旋转和压缩 问题在于其中包含日期的文件,如: catalina.2012-01-20.log catalina.2012-01-21.log catalina.2012-01-22.log 这些文件没有被旋转。我知道我必须在/etc/logrotate.d/tomcat6文件中配置这些文件,其中配置了catalina.out的旋转。但我无法配置它 我

我正在尝试在RHEL中为tomcat6日志配置logrotate。目前,logrotate对于catalina.out log工作正常,它被正确地旋转和压缩

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

catalina.2012-01-20.log
catalina.2012-01-21.log
catalina.2012-01-22.log
这些文件没有被旋转。我知道我必须在/etc/logrotate.d/tomcat6文件中配置这些文件,其中配置了catalina.out的旋转。但我无法配置它

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

有谁能帮我一下吗

谢谢
正常A.

在日志旋转文件中,使用
旋转#
,其中#是删除日志之前要保留的日志数

轮换计数

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


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

有两个选项可以更改java/tomcat提供的日志记录功能,使其在文件名中不包含日期。

第二种也是更快的方法是使用自己的小脚本为您完成工作,使用
find

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

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

查找
的文档

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

根据评论更新

find/pathtologs/*-mtime+5-删除

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

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

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

/path/to/logs/*.log{ 米森戈克 压缩 轮换7次 }

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


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

类似于/etc/cron.d/rotate\u tomcat\u 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 )
(有史以来的第一篇帖子,如果它看起来像喝醉了的蜘蛛格式化了它,那么很抱歉)

在使用了我们的朋友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
以及以下日志文件:

/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 -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小时内启动,则它有时似乎不起作用。如果您感到困扰,那么使用find-mmin+1380使用23小时可能更合适。

要在tomcat[linux]中启用每日日志循环,并将日期后缀添加到catalina文件,请执行以下更改

下载cronolog包并在linux操作系统中安装

wget

使用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以应用更改。

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

因此,我想与大家分享我的另一种方法。与“
find/path/to/logs-mtime+7-delete
”解决方案不同,此解决方案不会在指定的时间段后删除所有旧日志。因此,下面是一个示例one-liner bash命令,它只在磁盘上留下最后N个日志(无论何时运行):

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


欢迎您提出建议…

要在旋转文件中包含日期,您可能可以使用“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
唯一的缺点是你不会
$ 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
1 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +30 -delete
2 0 * * * /usr/bin/find /var/log/tomcat/ -mtime +1 -exec gzip -q {} \;
catalina.2012-01-20.log
catalina.2012-01-21.log
catalina.2012-01-22.log
/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
...