• ubuntu_定制文件系统[2]-清理日志log


    1.问题现象

    1. 系统长时间运行, 产生大量的系统日志
      ubuntu/debian 系统日志如下
      /var/log$ du -sh *

    31M syslog # syslog日志
    61M syslog.1
    2.5G journal/ # systemd service日志

    1. 当日志文件过大, 硬盘空间占用100%时, 导致各种异常
    • 命令按tab补全无响应
    • 服务/进程启动异常
    • 服务/进程运行异常

    2.问题原因

    1. 系统日志过大原因: 使用ubuntu非官方发行版本
      1. 使用ubuntu桌面发行版,自带日志清理服务
      2. 项目使用的ubuntu-base 根文件, 定制根文件系统, 集成需要的工具,库,配置; 没有发行版本, 日志清理的服务
    2. 需要定制清除日志脚本

    3.解决方案

    • 方案1: cron定时任务清理日志
    • 方案2: 开机服务脚本,周定时清理日志
    • 方案3: logrotate 管理日志大小,备份,清理

    最终使用方案3, logrotate 管理日志大小,备份,清理, 符合项目开发与运行需求.

    1. cron清除日志,无法备份,无法追溯几天前的日志.
    2. 开机服务脚本, 要实现管理日志大小, 备份, 清理的功能. 浪费人力开发脚本, 不如 logrotate 配置方便.

    4.logrotate安装与配置实例

    安装前置依赖 sudo apt install cron rsyslog
    安装 sudo apt instlal logrotate
    教程 https://www.cnblogs.com/carsonzhu/p/16904219.html

    1.教程

    1. logrotate 主要参数表

    logrotate参数选项

    2.系统默认的配置参考

    ls /etc/logrotate.d
    alternatives apt aptitude btmp dpkg pm-utils rsyslog wtmp

    cat /etc/logrotate.d/rsyslog

    /var/log/syslog
    {
    	rotate 7
    	daily
    	missingok
    	notifempty
    	delaycompress
    	compress
    	postrotate
    		/usr/lib/rsyslog/rsyslog-rotate
    	endscript
    }
    
    /var/log/mail.info
    /var/log/mail.warn
    /var/log/mail.err
    /var/log/mail.log
    /var/log/daemon.log
    /var/log/kern.log
    /var/log/auth.log
    /var/log/user.log
    /var/log/lpr.log
    /var/log/cron.log
    /var/log/debug
    /var/log/messages
    {
    	rotate 4
    	weekly
    	missingok
    	notifempty
    	compress
    	delaycompress
    	sharedscripts
    	postrotate
    		/usr/lib/rsyslog/rsyslog-rotate
    	endscript
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    2.实例

    1.手动logrotate运行测试

    配置脚本
    vim /etc/logrotate.d/liuj_tmp_log

    /tmp/liuj/*.log {
        size=50K
        daily
        rotate 5
        compress
        missingok
        notifempty
        create 664 liuj liuj
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    生成日志
    cd /tmp/liuj; dd if=/dev/zero of=xxx.log bs=1M count=1
    du -sh *

    1.0M xxx.log

    或用脚本生成日志.

    手动整理日志
    logrotate -vf /etc/logrotate.d/liuj_tmp_log
    查看整理之后的结果 du -sh *

    0 xxx.log
    4.0K xxx.log.1.gz -->整理之后的文件大小

    2.限制syslog大小

    vim /etc/logrotate.d/rsyslog

    /var/log/syslog
    {
    	rotate 7
    	daily
    ++	size=50M
    	missingok
    	notifempty
    	delaycompress
    	compress
    	postrotate
    		/usr/lib/rsyslog/rsyslog-rotate
    	endscript
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.管理ros程序日志

    设置系统 ros 日志位置
    /etc/profile.d/ros_env.sh

    source /opt/ros/noetic/setup.bash
    export ROS_LOG_DIR=/userdata/workdir/ros_log
    
    • 1
    • 2

    查看环境变量是否生效
    echo $ROS_LOG_DIR

    /userdata/workdir/ros_log

    限制 ros 程序日志规则
    vim /etc/logrotate.d/ros_log

    /userdata/workdir/ros_log/*.log
    {
    	rotate 5
    	daily
    	size=20M
    	missingok
    	notifempty
    	delaycompress
    	compress
    	postrotate
    		/usr/lib/rsyslog/rsyslog-rotate
    	endscript
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.限制systemd service的日志大小

    • systemd service有自己的限制日志规则
      ls /var/log/journal/6d021ad1f019488facfc7e6e7ec8236f

    system.journal
    system@faa337787dbc4bd49fdcaa0ceea09a96-00000000000871b0-0006123fac856242.journal
    system@583db54cb7cb466c9a3c7678bc0766f2-0000000000012a2c-00060f97925e7c17.journal
    user-1000.journal
    user-1000@b4fe8171a42f4f60a0a05c69bcfe1a5d-000000000009617d-0006124487b7d8a8.journal
    user-1000@3ecd5eb819b04efb9e9bba24908511e4-0000000000083c8a-0006109ff49ba016.journal

    目前使用的方案是:

    1. 使用logrotate限制 system.journal, user-1000.journal
    2. 使用cron定时任务 删除大于20M, 或超过7天的日志
    3. 服务进程每次重启时, 尝试步删除大于20M, 或超过7天的日志

    5.总结

    1. ubunt桌面发行版有日志清理服务, 基于ubuntu-base定制文件系统固件, 需要自己编写清除日志脚本.
    2. logrotate是便捷的日志限制大小, 备份, 配置简单的管理工具.
    3. 磁盘空间占用100%, 会导致各种运行异常.
    4. 解决各种异常问题, 减少无效日志输出, 限制错误日志, 或通过配置选项开启调试模式. 减少磁盘/flash写操作, 延长产品寿命.

    参考

    • logrotate原理:

    /lib/systemd/system/logrotate.service
    /lib/systemd/system/logrotate.timer

    • systemd.timer定时任务: https://blog.csdn.net/greatyoulv/article/details/111301528
    • ros日志基于log4j 限制大小,备份,自定义文件位置
      • https://blog.csdn.net/weixin_44388819/article/details/118407899
      • https://blog.csdn.net/weixin_44388819/article/details/118407899

  • 相关阅读:
    【附源码】计算机毕业设计SSM社区老人健康服务跟踪系统
    中国智能音箱市场销量下降,百度稳居第一 /中国即评出10个大模型创新案例 |魔法半周报
    每日一题Day40-41
    计算Qt中的QAudioOutput缓冲区未播放的音频字节数对应时长
    产品经理如何科学的进行需求调研?
    springAop原理分析-动态代理对象创建过程分析
    IEDA代码模板
    java计算机毕业设计瀚绅睿茨二人二轮车租赁管理源码+mysql数据库+系统+lw文档+部署
    sscanf和sprintf用法
    SpringBoot
  • 原文地址:https://blog.csdn.net/u011326325/article/details/136506689