Linux中Logrotate处理日志数据丢失

Linux中Logrotate处理日志数据丢失

我们使用 linux logrotate 来轮换我们的日志文件,

例子 :

/location/tomcat/logs/* /location/jboss/log/* {
      copytruncate
      daily
      rotate 10
      compress
      size 20M
      olddir rotated
      create 0644 test test
}

根据 LINUX 中给出的复制截断定义,

copytruncate
          Truncate  the  original log file in place after creating a copy,
          instead of moving the old log file and optionally creating a new
          one,  It  can be used when some program can not be told to close
          its logfile and thus might continue writing (appending)  to  the
          previous log file forever.  Note that there is a very small time
          slice between copying the file and truncating it, so  some  log-
          ging  data  might be lost.  When this option is used, the create
          option will have no effect, as the old log file stays in  place.

因此在旋转过程中日志文件中会出现数据丢失。我注意到大约 5 到 20 秒的日志丢失,有没有一种方法/配置可以在不丢失数据的情况下执行相同的过程?

答案1

我知道在 syslog-ng 中,您可以设置输出文件名以使用变量,包括日期等内容,因此它会在新的一天的凌晨 12:00 自动开始写入新文件,且损失为零。

不过,它需要将您的 syslog 程序更改为 syslog-ng。但灵活性听起来正是您所需要的。

答案2

您可以从日志文件记录和轮换logrotate转向journald使用systemd-cat -t indentifier cmdline.设置日志/条目大小/etc/systemd/journald.conf或使用journalctl --vacuum-size=, --vacuum-time=, --vacuum-files=

另一种方法是logrotate每天一次,使用预轮换/后轮换功能停止服务器,轮换日志并再次启动服务器。 logrotation 时间取决于您的 systemdlogrotate.timer或 (ana)cron 作业,可以定时为凌晨 4 点或流量低至零时。

prerotate
    # stop jboss/tomcat server 
endscript

daily
rotate 10
compress
size 20M

postrotate
    #start servers
endscript

答案3

这就是我对日志的处理方式Catalina

/var/log/tomcat/catalina.out {
        daily
        size 100m
        compressext .gz
        compress
        delaycompress
        compressoptions "-9"
        dateformat -%Y%m%d-%s
        ifempty
        copytruncate
        prerotate
                SIZE=$(stat --printf='%s' /var/log/tomcat/catalina.out)
                /bin/bash -c "tail -c +$SIZE -f /var/log/tomcat/catalina.out > /var/log/tomcat/tmp.log" &
        endscript
        postrotate
                pgrep tail | xargs kill -9
                cat /var/log/tomcat/tmp.log >> /var/log/tomcat/catalina.out
                rm /var/log/tomcat/tmp.log -f
        endscript
}

您可以选择指定-swithtail来减少tail命令本身的刷新间隔。而且因为您使用-c选项,所以速度很快。

相关内容