linux日志轮询方案

 更新时间:2024年10月14日 10:50:50   作者:loveLifeLoveCoding  
Linux系统中的日志文件会随时间增长,手动清理较为繁琐,logrotate程序可自动执行日志文件的轮换、压缩、删除和邮件发送,节省磁盘空间,logrotate基于crontab运行,调用配置文件/etc/logrotate.conf,用户可在/etc/logrotate.d目录放置自定义配置文件

logrotate 简介

一般来说,日志是任何故障排除过程中非常重要的一部分,但这些日志会随着时间增长。在这种情况下,我们需要手动执行日志清理以回收空间,这是一件繁琐的管理任务。为了解决这个问题,我们可以在 Linux 中配置 logrotate 程序,它可以自动执行日志文件的轮换、压缩、删除和用邮件发出。

我们可以配置 logrotate 程序,以便每个日志文件可以在每天、每周、每月或当它变得太大时处理。

logrotate软件是一个日志管理工具,用于 切割日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间。一般centos系统已经自带安装好了。

logrotate是基于 crontab 运行的,运行时,logrotate 会调用配置文件 /etc/logrotate.conf 。可以在 /etc/logrotate.d 目录里放置自定义好的配置文件,用来覆盖 logrotate.conf 的缺省值。

logrotate 版本查看

root@test 10:14:51:/usr# logrotate --version
logrotate 3.11.0

logrotate 配置文件

  • 命令: /usr/sbin/logrotate
  • 配置文件: /etc/logrotate.conf

这是 logrotate 的主配置文件。logrotate 还在 /etc/logrotate.d/ 中存储了特定服务的配置。

确保下面的那行包含在 /etc/logrotate.conf 中,以读取特定服务日志配置。
include  /etc/logrotate.d`

logrotate 历史:

/var/lib/logrotate/logrotate.status

日志回滚原理

当日志达到某个特定的大小,我们将日志分类,之前的日志保留一个备份,再产生的日志创建一个同名的文件保存新的日志.

重要的 logrotate 选项:

compress                                   通过gzip 压缩转储以后的日志
nocompress                                不做gzip压缩处理
copytruncate                              用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate                           备份日志文件不过不截断
create mode owner group             轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate                                    不建立新的日志文件
delaycompress                           和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress                        覆盖 delaycompress 选项,转储同时压缩。
missingok                                 如果日志丢失,不报错继续滚动下一个日志
errors address                           专储时的错误信息发送到指定的Email 地址
ifempty                                    即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty                               当日志文件为空时,不进行轮转
mail address                             把转储的日志文件发送到指定的E-mail 地址
nomail                                     转储时不发送日志文件
olddir directory                         转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir                                   转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts                           运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate                                 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate                               在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
daily                                       指定转储周期为每天
weekly                                    指定转储周期为每周
monthly                                  指定转储周期为每月
rotate count                            指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
dateext                                  使用当期日期作为命名格式
dateformat .%s                       配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
size(或minsize) log-size            当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
size = 5 或 size 5 (>= 5 个字节就转储)
size = 100k 或 size 100k
size = 100M 或 size 100M

sshd 日志回滚实战

修改配置文件

[root@ localhost cron.daily]# vim /etc/logrotate.conf
/var/log/sshd.log {         #  指定的是要切割的日志文件
    missingok               # 如果文件丢失不报错
    monthly                 # 每月轮换一次
    create 0664 root utmp   # 设置sshd.log这个文件的属主和属组
    minsize 10M             # 文件超过10M进行回滚
    rotate 2                # 日志进行分割后,保留两份历史数据
}

重启rsyslog

[root@ localhost cron.daily]# systemctl restart rsyslog

强制切割

[root@ localhost cron.daily]# logrotate –vf /etc/logrotate.conf
[root@ localhost cron.daily]# cd /var/log/
[root@ localhost log]# ll sshd.log 
-rw------- 1 root root 0 2019-11-29 14:00 sshd.log
# 切割完之后,源文件大小变为0

日志切割,是可以按照文件的大小和时间来进行切割

以系统日志/var/log/message做切割来简单说明下:

  • 第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;
  • 第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志!
  • 如果仅设定保留三个日志(即轮转3次)的话,那么执行第三次时,则 messages.3这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。
  • 日志究竟轮换几次,这个是根据配置文件中的rotate参数来判定的。

测试和运行 logrotate

如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要

/usr/sbin/logrotate -f /etc/logrotate.d/nginx
/usr/sbin/logrotate -d -f /etc/logrotate.d/nginx 

具体 logrotate 命令格式如下:

logrotate [OPTION...] <configfile>
-d, --debug :debug 模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。

debug 模式

并不会真正进行 rotate 或者 compress 操作,但是会打印出整个执行的流程,和调用的脚本等详细信息。

logrotate -d <configfile>

verbose 模式

会真正执行操作,打印出详细信息。

logrotate -v <configfile>

force 强制执行

如果时间不符合要求,logrotate 也不会真正执行时,如果想要立即执行,查看结果,就使用到了 强制执行模式。

logrotate -f <configfile>

添加 crontab 计划任务

执行 crontab -e 进入 vim 模式,进行编辑。

[root@root local]# crontab -e

#每天 23点59分进行日志切割
59 23 * * * /usr/sbin/logrotate -s /tmp/logrotate.status /etc/logrotate.d/tomcat

解释:

59 23 * * * cron表达式
/usr/sbin/logrotate 启动logrotate
-s /tmp/logrotate.status 保存执行状态
/etc/logrotate.d/tomcat 定时任务 ,前提是有 tomcat 文件

tomcat 文件内容:

/soft/tomcat/logs/catalina.out{
    minsize 50M
    rotate 20
    compress
    copytruncate
    notifempty
}

crontab 常用命令

查看所有的定时任务 crontab -l

[root@root local]# crontab -l
.....(省略)
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate
.....(省略)

编辑定时任务 crontab -e

[root@root local]# crontab -e   # 进入vim 模式
.....(省略)
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate
.....(省略)

常见应用的 logrotate 配置

/var/log/nginx/*.log {   # 可以指定多个路径
    daily                      # 日志轮询周期,weekly,monthly,yearly
    rotate 30                  # 保存30天数据,超过的则删除
    size 100M                 # 超过100M时分割,单位K,M,G,优先级高于daily
    
    compress                   # 切割后压缩,也可以为nocompress
    delaycompress              # 切割时对上次的日志文件进行压缩
    
    dateext                    # 日志文件切割时添加日期后缀
    dateformat -%Y-%m-%d
    
    missingok                  # 如果没有日志文件也不报错
    notifempty                 # 日志为空时不进行切换,默认为ifempty
    create 640 nginx nginx     # 使用该模式创建日志文件
    
    sharedscripts              # 所有的文件切割之后只执行一次下面脚本
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

logrotate 默认运行时间

logrotate 是基于cron 运行的,所以这个时间是由 cron 控制的,具体可以查询 cron 的配置文件/etc/crontab

旧版CentOS 的cron 的配置文件是 /etc/crontab ,新版CentOS 改为 /etc/anacrontab

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • centos7使用rpm安装mysql5.7的教程图解

    centos7使用rpm安装mysql5.7的教程图解

    本文通过图文并茂的形式给大家介绍了centos7使用rpm安装mysql5.7的教程,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-06-06
  • Linux系统创建TCP连接流程介绍

    Linux系统创建TCP连接流程介绍

    大家好,本篇文章主要讲的是Linux系统创建TCP连接流程,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下哦,方便下次浏览
    2021-12-12
  • linux下用csplit命令分割文件的方法示例

    linux下用csplit命令分割文件的方法示例

    csplit命令用于将一个大文件分割成小的碎片,并且将分割后的每个碎片保存成一个文件。下面这篇文章主要跟大家介绍了linux下用csplit命令分割文件的方法示例,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • Apache下开启SSI配置使html支持include包含的方法

    Apache下开启SSI配置使html支持include包含的方法

    这篇文章主要介绍了Apache下开启SSI配置使html支持include包含的方法,需要的朋友可以参考下
    2016-10-10
  • Linux磁盘设备与LVM管理命令示例详解

    Linux磁盘设备与LVM管理命令示例详解

    这篇文章主要给大家介绍了关于Linux磁盘设备与LVM管理命令的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Linux系统具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Linux下实现UTF-8和GB2312互相转换的方法

    Linux下实现UTF-8和GB2312互相转换的方法

    下面小编就为大家带来一篇Linux下实现UTF-8和GB2312互相转换的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,祝大家游戏愉快哦
    2016-12-12
  • CentOS7安装mysql5.7解压缩版简明教程

    CentOS7安装mysql5.7解压缩版简明教程

    这篇文章主要介绍了CentOS7安装mysql5.7解压缩版,简单介绍了CentOS7环境下的mysql5.7压缩版下载、解压、安装、配置、密码设置等相关命令及操作技巧,需要的朋友可以参考下
    2018-03-03
  • Linux入侵常用命令之防黑客示例代码

    Linux入侵常用命令之防黑客示例代码

    这篇文章主要给大家介绍了关于Linux入侵常用命令之防黑客的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • 详解CentOS5.5 下搭建 PHP 环境(最佳的LAMP环境)

    详解CentOS5.5 下搭建 PHP 环境(最佳的LAMP环境)

    本篇文章详细介绍了详解CentOS5.5 下搭建 PHP 环境(最佳的LAMP环境),有需要的小伙伴可以参考下。
    2016-10-10
  • linux如何修改用户密码

    linux如何修改用户密码

    Linux系统管理员经常需要修改用户密码,确保系统安全,两种常用方法是chpasswd和passwd命令,chpasswd允许批量修改密码,但存在安全风险,因为密码以明文出现在命令历史中,建议操作后清除相关命令记录,passwd命令更安全,可为任何用户设置密码
    2024-10-10

最新评论