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 (轮转,日志切割)
- 如果没有日志轮转,日志文件会越来越大
- 将丢弃系统中最旧的日志文件,以节省空间
- 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 - 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行