Logrotate files with date in the file name

后端 未结 11 760
孤城傲影
孤城傲影 2020-12-13 05:08

I am trying to configure logrotate in RHEL for tomcat6 logs. Currently, logrotate works fine for catalina.out log, it is rotated and compressed properly.

The problem

相关标签:
11条回答
  • 2020-12-13 05:16

    I spent a quite a while reading a lot of documentation. Logrotate does not seem to be able to group the different files with dates included in the name of the file. Logrotate can not do what we need it to do.

    You have two options change the logging facility provided by java / tomcat to not include the date in the file name. http://tomcat.apache.org/tomcat-6.0-doc/logging.html

    The second and quicker way is to use your own little script to do the work for you, using find. https://serverfault.com/questions/256218/logrotation-when-filenames-includes-date, https://serverfault.com/a/256231/71120

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

    I went with the second option, because our developers have coded for dates in the files names. So it needs to stay that way. The -mtime +5 sets find to only look for files who are older then 5 days.

    From find's documentation.

    File's data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretation of file modification times.

    Updated as per comment

    find /pathtologs/* -mtime +5 -delete

    If you specifically want to delete, this is a quick way to do it. If you need to some other command you can always replace the exec rm {} \; with something else.

    0 讨论(0)
  • 2020-12-13 05:16

    To enable daily log rotation in tomcat [linux] with postfix of date to catalina file, do the below changes.

    Download cronolog package and install in 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 
    

    open apache-tomcat-7.0.65/bin/catalina.sh file using vi command and change the lines as given below example : /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
    

    After the above changes save the file and restart the tomcat to apply changes.

    0 讨论(0)
  • 2020-12-13 05:18

    Probably you can remove the date from the log file names as described in How to remove the date pattern from tomcat logs to be able to use logrotate rules.

    This worked for me at least for localhost access log.

    0 讨论(0)
  • 2020-12-13 05:23

    (First post ever so if it looks like a drunk spider has formatted it then sorry)

    After using our friend Google, here and I can't remember where else I managed to achieve something using logrotate (rather than cron or some other equivalent).

    I have a the following in /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
    

    and the following logrotate file:

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

    which I thought was perfectly reasonable. But after it refused to work and on finding out that it would never work (courtesy of this post) I wondered if it could be fudged to make it work.

    After much testing and tweaking I managed to fudge it the following way:

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

    into a logrotate config file called /etc/logrotate.d/local-rsync. Then create the dummy log file:

    touch /var/log/rsync/dummy
    

    then force a logrotate with:

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

    which gives:

    -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
    

    Now just wait for tomorrow morning...

    I realise that cron would be tidier however I have another element in the logrotate config file and wanted to keep the two together.

    Bonus with the dummy file is that it doesn't take up any space!

    You may find that it does not appear to have rotated anything one day. It took me while to work out why but then it twigged. find -mtime +1 is whole days (i.e. 24*60 minutes) and if the daily logrotate kicked in less than 24 hours since the last time/time the logs were created then it sometimes appears not to have worked. If it bothers you then using 23 hours with find -mmin +1380 might be more appropriate.

    0 讨论(0)
  • 2020-12-13 05:23

    To include a date in the rotated file, you can probably use 'dateext' option.

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

    The rotated file should get created similar to below

     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
    

    The only downside is you won't be able to run it more than once per day as the file would have a definite name for that date.

    The above example is from my Nginx docker container running in k8s on GC. The logrotate version is 3.11.0.

    Hope that helps!

    Update: From man pages https://linux.die.net/man/8/logrotate

    dateformat format string

    Specify the extension for dateext using the notation similar to strftime(3) function. Only %Y %m %d and %s specifiers are allowed. The default value is -%Y%m%d. Note that also the character separating log name from the extension is part of the dateformat string. The system clock must be set past Sep 9th 2001 for %s to work correctly. Note that the datestamps generated by this format must be lexically sortable (i.e., first the year, then the month then the day. e.g., 2001/12/01 is ok, but 01/12/2001 is not, since 01/11/2002 would sort lower while it is later). This is because when using the rotate option, logrotate sorts all rotated filenames to find out which logfiles are older and should be removed.

    0 讨论(0)
  • 2020-12-13 05:26

    In your log rotate file, use rotate #, where # is the number of logs you want to keep before removing them.

    rotate count

    Log files are rotated times before being removed or mailed to the address specified in a mail directive. If count is 0, old versions are removed rather then rotated.

    0 讨论(0)
提交回复
热议问题