• journal/rsyslog日志丢失问题解决


    问题

    rsyslogd写日志丢失的问题

    经常会遇到rsyslogd保存日志时丢失的问题,/var/log/messages 打印如下:

    Nov 18 01:58:53 XXXX rsyslogd: imjournal: 28062 messages lost due to rate-limiting
    
    • 1

    原来是rsyslogd限制了打印的信息长度。

    cat /var/log/messages |grep -i rate-limiting  查看
    或者 systemctl status rsyslog
    
    • 1
    • 2

    原理

    所谓Rate limit就是指,在某个固定的时间段内,syslog最多允许打印的log信息数量(多出的log信息将被丢弃)。由配置文件/etc/rsyslog.conf中以下两个配置项决定:

    $SystemLogRateLimitInterval [Number1]: Number1 为设定的限制的时间间隔大小
    $SystemLogRateLimitBurst [Number2]: Number2 为在设定的限制的时间间隔内,最多输出的log信息数量。
    
    • 1
    • 2

    在设定完后,则表示在每一个Number1时间间隔内,如果超过Number2个数的log信息将会被去除。默认Number1为5秒钟,Number2为200.

    解决方法

      1. 清除旧 syslog 配置
    
        sed -i '/^RateLimitInterval=/d' /etc/systemd/journald.conf
        sed -i '/^RateLimitBurst=/d' /etc/systemd/journald.conf
        sed -i '/^\$SystemLogRateLimitInterval/Id' /etc/rsyslog.conf
        sed -i '/^\$SystemLogRateLimitBurst/Id' /etc/rsyslog.conf
        sed -i '/^\$imjournalRatelimitInterval/Id' /etc/rsyslog.conf
        sed -i '/^\$imjournalRatelimitBurst/Id' /etc/rsyslog.conf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 2)设置 syslog 配置
      取消限速,如下所示:
        echo 'RateLimitInterval=0' >> /etc/systemd/journald.conf
        echo 'RateLimitBurst=0' >> /etc/systemd/journald.conf
        echo '$SystemLogRateLimitInterval 0' >> /etc/rsyslog.conf
        echo '$SystemLogRateLimitBurst 0' >> /etc/rsyslog.conf
        echo '$imjournalRatelimitInterval 0' >> /etc/rsyslog.conf
        echo '$imjournalRatelimitBurst 0' >> /etc/rsyslog.conf
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1s限速1000,如下所示:

    
        echo 'RateLimitInterval=1' >> /etc/systemd/journald.conf
        echo 'RateLimitBurst=1000' >> /etc/systemd/journald.conf
        echo '$SystemLogRateLimitInterval 1' >> /etc/rsyslog.conf
        echo '$SystemLogRateLimitBurst 1000' >> /etc/rsyslog.conf
        echo '$imjournalRatelimitInterval 1' >> /etc/rsyslog.conf
        echo '$imjournalRatelimitBurst 1000' >> /etc/rsyslog.conf    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 3) 设置日志分割
        cat > ${LOGROTATE_CONF} << EOF
    ${XXX_LOG_PATH} {
        daily
        rotate 60
        copytruncate
        missingok
        notifempty
        size 4G
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    更改完配置文件之前,之后执行下面的命令:

    systemctl status 	rsyslog
    systemctl restart 	rsyslog
    systemctl status 	rsyslog
    
    
    • 1
    • 2
    • 3
    • 4

    常用 命令

    journalctl

    参见:systemd-journald 讲解

    systemctl

    systemctl status rsyslog
    systemctl status systemd-journald
    systemctl restart rsyslog
    systemctl restart systemd-journald

    范例

    • 问题
      在我们的docker应用中,配置了rsyslog作为日志输出;当应用产生的日志在某段时间内量比较大时,就发现会丢日志。

    • 原因
      日志的输出路径,应用程序把日志输出到system journal,然后system journal再输出到rsyslog,最后由rsyslog把日志持久化存储到本地磁盘文件。

    而不管是system journal还是rsyslog都有一个配置值,允许一个时间段内最大的日志数量;当应用程序产生的日志数大于规定的数量时就会被丢弃。

    • system journal的配置
      当system journal发生日志超量时,就会看到下面类似信息:
    $ sudo journalctl -u systemd-journald
    Apr 16 19:11:52 <hostname> systemd-journal[1356]: Suppressed 1929 messages from /system.slice/docker.service
    
    
    • 1
    • 2
    • 3

    因为我们的应用是部署成docker container模式,所以对system journal来说它收到的日志是从docker.service发布过来的。

    system journal关于日志量的配置在:

    $ cat /etc/systemd/journald.conf
    RateLimitInterval=30s
    RateLimitBurst=1000
    
    
    • 1
    • 2
    • 3
    • 4

    含义是在30秒的周期内,允许的日志数目是1000,超过部分会被丢弃。

    可以估算应用的日志量来调整这两个值,然后重启system journal系统服务system systemd-journald restart/systemctl restart systemd-journald 即可;
    如果要取消限制,可以把两个值都设置成0就可以。

    • rsyslog的配置
      和system journal类似,当rsyslog发生日志超量时,就会看到下面类似信息:
    $ sudo journalctl -f -u rsyslog
    Apr 16 22:18:38 <hostname> rsyslogd[25142]: imjournal: begin to drop messages due to rate-limiting
    Apr 16 22:18:46 <hostname> rsyslogd[25142]: imjournal: 1429 messages lost due to rate-limiting
    
    
    • 1
    • 2
    • 3
    • 4

    rsyslog也有两个配置项:

    $ cat /etc/rsyslog.conf 
    $ModLoad imjournal
    $imjournalRatelimitInterval 30
    $imjournalRatelimitBurst 1000
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    含义是在30秒的周期内,允许的日志数目是1000,超过部分会被丢弃。

    也是根据需要调整值,或者通过把两个值都设置成0的方式关闭限制;
    然后重启rsyslog服务就行:systemctl restart rsyslog。

    • 缺省值
      关于日志Rate的配置值,system journal和rsyslog都有一个缺省值,不同的操作系统,发行版本,以及system journal/rsyslog的版本都可能有不同的值,要查具体文档。如果在配置文件里面没有值,则使用缺省值。
    system journal的配置文件在:
    /etc/systemd/journald.conf
    /etc/systemd/journald.conf.d/*
    
    rsyslog的配置文件在:
    /etc/rsyslog.conf
    /etc/rsyslog.d/*
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    参考

    https://www.jianshu.com/p/4e71f553cf3f
    https://plantegg.github.io/2021/01/28/journald%E5%92%8Crsyslog/
    
    • 1
    • 2

  • 相关阅读:
    Linux系列之比较命令
    编程思维是一种什么思维?
    骨传导原理是什么?哪些骨传导耳机值得入手
    Xinetd服务介绍
    《HTML5移动网站与App开发实战》简介
    Python学习记录 面向对象编程
    FigDraw 12. SCI 文章绘图之相关性矩阵图(Correlation Matrix)
    android的camera学习(3)——mipi协议分析
    windows安装paddlepaddle遇到的问题及解决方案
    uniapp swiper轮播图片+视频
  • 原文地址:https://blog.csdn.net/legend050709/article/details/128204297