使用logrotate自动管理日志

1、背景

线上服务器(ubuntu20.04)安装着很多软件,时间久了会产生很多日志,占据大量磁盘空间,需要定期清理。同时,为应对在出现问题时可以去溯源的需求,还需要将日志保留一段时间,且为了避免文件过大给排查带来问题,还需要对日志文件进行切分。

logrotate是一款linux系统自带的日志管理工具,是基于cron的,所以可以定时对日志做一些处理。通过在配置文件中进行简单的配置,即可对日志进行管理,例如切分、压缩、删除等操作。

2、应用

例如,在/usr/local/nginx/logs下存放着nginx的日志,默认是追加的方式,在我查看其中的access.log时,该日志文件已经增长到4.7G。表现为几个问题:

①日志文件过大

②想要查看某一天的日志,很麻烦

③在持续增长

④不管理的话只能定期手动去删除日志,还要避免进程不释放文件、不重新加载日志文件的问题。

为此,采用logrotate进行管理,目的是按天切分日志,保留七天有效期后删除。

2.1、logrotate配置文件

使用sudo find / -name logrotate*/目录下查找文件名以logrotate开头的相关文件或目录,会查询出很多相关的结果,其中主要的文件如下:

txt 复制代码
/usr/sbin/logrotate # logrotate命令位置
/usr/lib/systemd/system/logrotate.service # logrotate服务由systemctl管理的配置文件
/etc/logrotate.conf # logrotate的配置文件
/etc/cron.daily/logrotate # cron的配置文件
/etc/logrotate.d # 在此文件夹下创建各个需要被管理的日志的配置文件

说明:logrotate服务在定期执行时会使用配置文件logrotate.conf,而logrotate.conf文件又会加载logrotate.d文件夹下的配置。所以既可以在logrotate.conf配置需要被管理的日志,又可以独立配置文件在logrotate.d文件夹下。

2.2、配置文件语法

摘取配置nginx日志文件的配置: 直接创建一个文件名为nginx,在文件中粘贴如下配置:

txt 复制代码
/usr/local/nginx/logs/*.log {
  daily # 表示按天执行,每天执行一次
  rotate 7 # 滚动次数,表示滚动七次,对应这里就是代表保留七天日志
  dateext # 文件名后缀以日期结尾
  create 644 root root # 表示新建一个同名的日志文件,让进程往里写,原来的重命名,文件名后会跟着日期后缀
  missingok # 如果找不到日志文件,不报错
  nocompress # 不需要压缩
  postrotate # 若需要在转储完日志后执行一些脚本,则以postrotate开头,中间放待执行的脚本,最后以endscript结尾
    [ ! -f /usr/local/nginx/logs/nginx.pid ] || kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` #目的是为了让nginx重新加载日志文件,要不然不会输出到新的文件中
  endscript
}

其它常用配置参数参考以下:

2.3、验证配置是否可执行

使用logrotate的debug模式,执行如下命令:

linux 复制代码
cd /etc/logrotate.d/
sudo logrotate -d nginx #-d表示使用debug模式执行,可以进行测试,如果有报错,及时修正以避免配置不生效

验证没有问题后,如果需要立刻执行,则使用如下命令:

linux 复制代码
sudo logrotate -f nginx

3、可能会遇到的问题

3.1、权限不足报错

because parent directory has insecure permissions(It's world writable or writable by group which is not "root")Set "su"directive in config file to tell logrotate which user/group should be used for rotation.

滚动时权限不足,则在/etc/logrotate.d/nginx文件中添加一行 su root root 如下:

txt 复制代码
/usr/local/nginx/logs/*.log {
  su root root
  daily # 表示按天执行,每天执行一次
  rotate 7 # 滚动次数,表示滚动七次,对应这里就是代表保留七天日志
  dateext # 文件名后缀以日期结尾
  create 644 root root # 表示新建一个同名的日志文件,让进程往里写,原来的重命名,文件名后会跟着日期后缀
  missingok # 如果摘不到日志文件,不报错
  nocompress # 不需要压缩
  postrotate # 若需要在转储完日志后执行一些脚本,则以postrotate开头,中间放待执行的脚本,最后以endscript结尾
    [ ! -f /usr/local/nginx/logs/nginx.pid ] || kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` #目的是为了让nginx重新加载日志文件,要不然不会输出到新的文件中
  endscript
}

3.2、日志文件滚动失效

通过命令sudo journalctl -u logrotate查看是否有错误日志,例如error: failed to rename /usr/local/nginx/logs/access.log to /usr/local/nginx/logs/access.log-20231211: Read-only file system

这个错误在使用logrotate进行debug时不会出现,强制执行也不会出问题,就是自动执行的时候有问题。

问题原因:查看logrotate.service文件: 发现文件中存在一行ProtectSystem=full,systemd执行时会把/usr目录变成只读目录,所以失效。 官方解释。 解决: 通过文档得知,我们可以利用 ReadWritePaths 来指定可读写的路径。

在logrotate.service文件末尾添加一行ReadWritePaths=/usr/local/nginx/logs就可以让/usr/local/nginx/logs目录可读。

相关推荐
deeper_wind5 小时前
k8s-容器化部署论坛和商城服务(小白的“升级打怪”成长之路)
linux·运维·容器·kubernetes
勇往直前plus6 小时前
VMware centos磁盘容量扩容教程
linux·运维·centos
政安晨7 小时前
Ubuntu 服务器无法 ping 通网站域名的问题解决备忘 ——通常与网络配置有关(DNS解析)
linux·运维·服务器·ubuntu·ping·esp32编译服务器·dns域名解析
路溪非溪8 小时前
嵌入式Linux驱动开发杂项总结
linux·运维·驱动开发
Neolock9 小时前
Linux应急响应一般思路(三)
linux·web安全·应急响应
被遗忘的旋律.10 小时前
Linux驱动开发笔记(七)——并发与竞争(上)——原子操作
linux·驱动开发·笔记
轻松Ai享生活10 小时前
minidump vs core dump
linux
轻松Ai享生活11 小时前
详细的 Linux 常用文件系统介绍
linux
张童瑶11 小时前
Linux 离线安装lrzsz(rz、sz上传下载小插件)
linux·运维·centos
十五年专注C++开发12 小时前
通信中间件 Fast DDS(二) :详细介绍
linux·c++·windows·中间件·fastdds