Linux日志轮转工具Logrotate

时间:2021-9-10     作者:smarteng     分类: Linux命令


日志重要性

Linux系统日志对管理员来说,是了解系统运行的主要途径,因此需要对 Linux 日志系统有个详细的了解。 Linux 系统内核和许多程序会产生各种错误信息、告警信息和其他的提示信息,这些各种信息都应该记录到日志文件中,完成这个过程的程序就是 rsyslog,rsyslog 可以根据日志的类别和优先级将日志保存到不同的文件中。

二、日志系统rsyslog

日志管理基础

 rsyslog 日志管理 
 logrotate日志轮转

一、处理日志的进程

 rsyslogd:绝大部分日志记录,和系统操作有关,安全,认证sshd,su,计划任务at,cron... httpd/nginx/mysql: 可以自己的方式记录日志
 [root@linux-server ~]# ps aux |grep rsyslogd
 root        752  0.0  0.2 216440  5548 ?        Ssl  20:18   0:00 /usr/sbin/rsyslogd -n
 ​
 日志配置主文件:
 /etc/rsyslog.conf 

二、常见的日志文件(系统、进程、应用程序)

 #tail -f /var/log/messages                  #动态查看日志文件的尾部,系统主日志文件
 #tail -f /var/log/secure                    #记录认证、安全的日志
 tail /var/log/maillog                       #跟邮件postfix相关
 tail /var/log/cron                          #crond、at进程产生的日志
 tail /var/log/dmesg                         #和系统启动相关
 tail /var/log/yum.log                       #yum的日志
 tail -f /var/log/mysqld.log                 #MySQL日志
 tail /var/log/xferlog                       #和访问FTP服务器相关
 /var/log/boot.log                           #系统启动过程日志记录存放
 [root@linux-server ~]#w                    #当前登录的用户 /var/log/wtmp
 [root@linux-server ~]#last                 #最近登录的用户 /var/log/btmp
 第一列,用户名;
 第二列,终端位置,/pts/0 (伪终端)意味着从诸如ssh或者telnet的远程链接的用户,tty(teletypewriter)意味着直接连接到计算机或者本地链接的用户;
 第三列,登录的ip或者内核。
 第四列,开始时间;
 第五列,结束时间(still login in 还未退出 down 直到正常关机 crash 直到强制关机);
 ​
 [root@linux-server ~]#lastlog              #所有用户的登录情况 /var/log/lastlog

日志优先级

 日志级别分为:7种日志级别代号0-7

 debug             #有调试信息的,日志信息最多
 info              #一般信息的日志,最常用
 notice            #最具有重要性的普通条件的信息
 warning           #警告级别
 err               #错误级别,阻止某个功能或者模块不能正常工作的信息
 crit              #严重级别,阻止整个系统或者整个软件不能工作的信息
 alert             #需要立刻修改的信息
 emerg             #内核崩溃等严重信息
 none                #什么都不记录

在 Linux 环境中能够帮助我们分析问题蛛丝马迹的有效办法之一便是日志,常见的如操作系统 syslog 日志 /var/log/messages ,应用程序 Nginx 日志 /var/log/nginx/*.log 。但如果服务器数量较多,日志文件大小增长较快,不断消耗磁盘空间就会触发告警,如果需要人为定期按照各种维度去手动清理日志就显得十分棘手。为了节省空间和方便整理,可以将日志文件按时间或大小分成多份,删除时间久远的日志文件,这就是通常说的日志滚动 (log rotation)。logrotate(GitHub 地址) 诞生于 1996/11/19 是一个 Linux 系统日志的管理工具,本文会详细介绍 Linux 日志切割神器 logrotate 的原理和配置。

三、logrotate日志轮转

什么是日志轮转? 自动切日志
注:可以针对任何日志文件(rsyslog 日志、Nginx访问或错误日志...)
一、logrotate (轮转,日志切割)

  1. 如果没有日志轮转,日志文件会越来越大
  2. 将丢弃系统中最旧的日志文件,以节省空间
  3. logrotate本身不是系统守护进程,它是通过计划任务crond每天执行
    logrotate 配置文件:
    主配置文件:/etc/logrotate.conf (决定每个日志文件如何轮转)
    配置日志轮转
    [root@linux-server ~]# vim /etc/logrotate.conf  
    weekly              #轮转的周期,一周轮转,单位有年,月,日 
    rotate 4            #保留4份 
    create              #轮转后创建新文件 
    dateext             #使用日期作为后缀 
    #compress           #日志轮替时,旧的日志进行压缩 
    include /etc/logrotate.d             #包含该目录下的配置文件,会引用该目录下面配置的文件
    ​
    /var/log/wtmp {                     #对该日志文件设置轮转的方法    
    monthly                            #一月轮转一次  
    minsize 1M                         #最小达到1M才轮转,否则就算时间到了也不轮转
    create 0664 root utmp              #轮转后创建新文件,并设置权限   
    rotate 2                           #保留2份 
    }
    ​
    /var/log/btmp {    
    missingok                          #丢失不提示    
    monthly                            
    create 0600 root utmp              
    rotate 1                           
    } 

    lograote配置选项

    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 当日志文件到达指定的大小时才转储

    logrotate命令语法

logrotate(选项)(参数)

logrotate命令选项

-?或--help:在线帮助;
-d或--debug:详细显示指令执行过程,便于排错或了解程序执行的情况;
-f或--force :强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然;
-s<状态文件>或--state=<状态文件>:使用指定的状态文件;
-v或--version:显示指令执行过程;
-usage:显示指令基本用法。

案例

例1:轮转文件/var/log/yum.log

 [root@linux-server ~]# vim /etc/logrotate.d/yum    
 /var/log/yum.log {
  missingok                                #丢失不提醒
  #notifempty                              #空文件不轮转 
  #size 30k                                  #只要到了30k就轮转
  #yearly
  daily                                     #每天轮转一次   
  rotate 3      
  create 0644 root root 
 }

测试:

 [root@linux-server ~]# /usr/sbin/logrotate /etc/logrotate.conf    #手动轮转
 [root@linux-server ~]# ls /var/log/yum*
 /var/log/yum.log  /var/log/yum.log-20191110
 ​
 [root@linux-server ~]# grep yum /var/lib/logrotate/logrotate.status #查看记录所有日志文件最近轮转的时间
 "/var/log/yum.log" 2019-11-10-21:26:14

2:日志安全,操作日志的隐藏权限

 [root@localhost log]# cd /etc/logrotate.d/
 [root@localhost logrotate.d]# vim syslog
 建议测试时先把/etc/logrotate.d/syslog中messages删除,然后在下面添加如下:
 /var/log/messages{
     prerotate
        chattr -a /var/log/messages
     endscript
     #notifempty
     daily
         create 0600 root root
         missingok
         rotate 3
 ​
     postrotate
         chattr +a /var/log/messages
     endscript
 }
 [root@localhost logrotate.d]# /usr/sbin/logrotate /etc/logrotate.conf  #手动轮转
 [root@localhost logrotate.d]# cd /var/log/
 [root@localhost log]# ls mess*
 messages  messages-20200805  messages-20200806

参数解释:
prerotate/endscript - 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript - 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行