Linux使用logrotate来切割日志文件

发布时间 - 2026-01-11 00:46:48    点击率:

程序在运行的时候为了了解运行状态,会输出日志文件,时间久了日志文件会变得非常大,甚至达到GB级别。我在golang应用里使用logrus包来打日志,配置和使用都很方便,就是没有日志分割的功能,应用在线上运行一个月后日志文件都已经达到上百兆。后来发现了logrotate,这是centos自带的日志分割工具,都不用安装额外组件就能实现定时分割日志。

1.运行原理

logrotate由系统的cron运行,位置在/etc/cron.daily/logrotate

#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
 /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

可以看到入口配置文件是/etc/logrotate.conf,依次运行/etc/logrotate.conf.d里的配置文件 如果发现配置的logrotate没有执行,可以看下系统的crond服务有没有开启

2.配置

如果有安装nginx,可以参考nginx里的配置例子

/var/log/nginx/*log {
 create 0644 nginx nginx
 daily
 rotate 10
 missingok
 notifempty
 compress
 sharedscripts
 postrotate
  /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
 endscript
}

第一行定义的是日志文件的路径,可以用*通配,一般可以定义成*.log来匹配所有日志文件。也可以指定多个文件,用空格隔开,比如

/var/log/nginx/access.log /var/log/nginx/error.log {
 
}

花括号里面是日志切割相关的参数,下面是常用的切割参数

  1. compress 是否开启压缩,压缩格式gzip
  2. 不开启压缩
  3. compresscmd 自定义压缩命令
  4. compressexty 压缩文件名后缀
  5. compressoptions 压缩选项
  6. copy 复制一份文件
  7. create 后面跟mode owner group,设置新日志文件的权限
  8. daily 按天分割
  9. weekly 按周分割
  10. monthly 按月分割
  11. rotate 后面跟数字,表示需要保留的文件历史记录,超过数量就会删除,或者通过邮件发送
  12. size 后面跟文件大小,比如100k、100M,超过这个大小后分割
  13. missingok 忽略不存在的文件,不报错
  14. notifempty 不分割空文件
  15. sharedscripts 配合postrotate、prerotate,让他们只执行一次
  16. postrotate/endscript 文件分割完后,执行postrotate、endscript之间的命令
  17. prerotate/endscript 文件分割完前,执行prerotate、endscript之间的命令

下面看几个例子

/var/log/httpd/error.log {
 rotate 5
 mail i@wuyuans.com
 size=100k
 sharedscripts
 postrotate
  /sbin/killall -HUP httpd
 endscript
}

切割/var/log/httpd/error.log日志文件,超过100k后切割,保留最新的5个历史记录,超过5个的邮件发送到fss@qq.com,postrotate里的的命令是为了让httpd重新打开日志文件。

/var/lib/mysql/mysqld.log {
 # create 600 mysql mysql
 notifempty
 daily
 rotate 3
 missingok
 compress
 postrotate
 # just if mysqld is really running
 if test -x /usr/bin/mysqladmin && \
 /usr/bin/mysqladmin ping &>/dev/null
 then
 /usr/bin/mysqladmin --local flush-error-log \
    flush-engine-log flush-general-log flush-slow-log
 fi
 endscript
}

这是对mysql日志的切割,每天一份,忽略空文件,保留最新3份,使用gzip压缩

/home/wuyuan/log/*.log {
 su wuyuan wuyuan
 create 0777 wuyuan wuyuan
 daily
 rotate 10
 olddir /home/wuyuan/log/old
 missingok
 postrotate
 endscript
 nocompress
}

这是我在用的配置项,对log目录所有.log文件切割,每天一份,保留10份,新文件设定权限777,历史文件保留在old目录里,这样可以方便查看。因为应用程序用的logrus使用append的方式写日志,所以不需要重新打开日志文件,这点logrus做得很不错。

3.测试

写完配置文件后可以手动执行下,来验证是否可用。

logrotate -f /etc/logrotate.d/wuyuan

其中-f 表示强制执行,其他命令可以用help来查看

logrotate --help
用法: logrotate [OPTION...] <configfile>
 -d, --debug Don't do anything, just test (implies -v)
 -f, --force Force file rotation
 -m, --mail=command Command to send mail (instead of `/bin/mail')
 -s, --state=statefile Path of state file
 -v, --verbose Display messages during rotation
 -l, --log=STRING Log file
 --version Display version information
Help options:
 -?, --help Show this help message
 --usage Display brief usage message

没问题的话日志就会被移到old目录下,并带上日期,之前的log文件会被清空

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# logrotate切割日志  # logrotate分割日志  # linux  # 日志切割  # Linux logrotate日志切割安装配置说明  # Linux中logrotate日志轮询操作总结  # Linux自带的logrotate管理日志用法  # 这是  # 就会  # 配置文件  # 我在  # 可以用  # 历史记录  # 文件分割  # 的是  # 几个  # 就能  # 多个  # 不需要  # 都很  # 不存在  # 可以看到  # 线上  # 很不错  # 做得  # 自定义  # 发送到 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 闭包写法详细介绍  php 三元运算符实例详细介绍  如何在自有机房高效搭建专业网站?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel Docker环境搭建教程_Laravel Sail使用指南  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  焦点电影公司作品,电影焦点结局是什么?  深入理解Android中的xmlns:tools属性  如何彻底卸载建站之星软件?  企业网站制作这些问题要关注  Laravel怎么连接多个数据库_Laravel多数据库连接配置  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何在阿里云香港服务器快速搭建网站?  如何在万网ECS上快速搭建专属网站?  如何快速搭建高效WAP手机网站?  如何在橙子建站上传落地页?操作指南详解  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  如何在腾讯云服务器快速搭建个人网站?  MySQL查询结果复制到新表的方法(更新、插入)  Laravel如何使用withoutEvents方法临时禁用模型事件  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何在Windows 2008云服务器安全搭建网站?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Android滚轮选择时间控件使用详解  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  如何在Windows环境下新建FTP站点并设置权限?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  如何注册花生壳免费域名并搭建个人网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Swift中循环语句中的转移语句 break 和 continue  Laravel如何记录自定义日志?(Log频道配置)  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  如何在企业微信快速生成手机电脑官网?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何用狗爹虚拟主机快速搭建网站?  Laravel集合Collection怎么用_Laravel集合常用函数详解  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  iOS发送验证码倒计时应用  制作企业网站建设方案,怎样建设一个公司网站?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  html如何与html链接_实现多个HTML页面互相链接【互相】