1.问题现象
- 系统长时间运行, 产生大量的系统日志
ubuntu/debian 系统日志如下
/var/log$du -sh *
31M syslog # syslog日志
61M syslog.1
2.5G journal/ # systemd service日志
- 当日志文件过大, 硬盘空间占用100%时, 导致各种异常
- 命令按tab补全无响应
- 服务/进程启动异常
- 服务/进程运行异常
2.问题原因
- 系统日志过大原因: 使用ubuntu非官方发行版本
- 使用ubuntu桌面发行版,自带日志清理服务
- 项目使用的ubuntu-base 根文件, 定制根文件系统, 集成需要的工具,库,配置; 没有发行版本, 日志清理的服务
- 需要定制清除日志脚本
3.解决方案
- 方案1: cron定时任务清理日志
- 方案2: 开机服务脚本,周定时清理日志
- 方案3: logrotate 管理日志大小,备份,清理
最终使用方案3, logrotate 管理日志大小,备份,清理, 符合项目开发与运行需求.
- cron清除日志,无法备份,无法追溯几天前的日志.
- 开机服务脚本, 要实现管理日志大小, 备份, 清理的功能. 浪费人力开发脚本, 不如 logrotate 配置方便.
4.logrotate安装与配置实例
安装前置依赖 sudo apt install cron rsyslog
安装 sudo apt instlal logrotate
教程 https://www.cnblogs.com/carsonzhu/p/16904219.html
1.教程
1. 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
}
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
}
生成日志
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
diff
/var/log/syslog
{
rotate 7
daily
++ size=50M
missingok
notifempty
delaycompress
compress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
3.管理ros程序日志
设置系统 ros 日志位置
/etc/profile.d/ros_env.sh
source /opt/ros/noetic/setup.bash
export ROS_LOG_DIR=/userdata/workdir/ros_log
查看环境变量是否生效
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
}
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
目前使用的方案是:
- 使用logrotate限制 system.journal, user-1000.journal
- 使用cron定时任务 删除大于20M, 或超过7天的日志
- 服务进程每次重启时, 尝试步删除大于20M, 或超过7天的日志
5.总结
- ubunt桌面发行版有日志清理服务, 基于ubuntu-base定制文件系统固件, 需要自己编写清除日志脚本.
- logrotate是便捷的日志限制大小, 备份, 配置简单的管理工具.
- 磁盘空间占用100%, 会导致各种运行异常.
- 解决各种异常问题, 减少无效日志输出, 限制错误日志, 或通过配置选项开启调试模式. 减少磁盘/flash写操作, 延长产品寿命.
参考
- logrotate原理:
/lib/systemd/system/logrotate.service
/lib/systemd/system/logrotate.timer
- systemd.timer定时任务: https://blog.csdn.net/greatyoulv/article/details/111301528
- ros日志基于log4j 限制大小,备份,自定义文件位置