在 Linux 系统中手动滚动日志的方法
日志滚动logrotation在Linux系统上是再常见不过的一个功能了,它为系统监控和故障排查保留必要的日志内容,同时又防止过多的日志造成单个日志文件太大。
日志滚动的过程是这样的:在一组日志文件之中,编号最大的(最旧的)一个日志文件会被删除,其余的日志文件编号则依次增大并取代较旧的日志文件,而较新的文件则取代它作为当前的日志文件。这一个过程很容易就可以实现自动化,在细节上还能按需作出微调。
使用logrotate命令可以手动执行日志滚动的操作。本文将要介绍的就是手动进行日志滚动的方法,以及预期产生的结果。
文中出现的示例适用于Ubuntu等Linux系统,对于其它类型的系统,日志文件和配置文件可能会有所不同,但日志滚动的过程是大同小异的。
为什么需要滚动日志
一般情况下,无需手动旋转日志文件。Linux系统会每隔一天(或间隔更长的时间)或根据日志文件的大小自动进行一次日志滚动。如果你需要滚动日志以释放存储空间,又或者将某一部分日志从当前的活动中分割出来,这很容易做到,具体要取决于文件滚动规则。
一点背景介绍
在Linux系统安装完成后就已经有很多日志文件被纳入到日志滚动的范围内了。另外,一些应用程序在安装时也会为自己产生的日志文件设置滚动规则。一般来说,日志滚动的配置文件会放置在/etc/logrotate.d。如果你想了解日志滚动的详细实现,可以参考这篇以前的文章。
在日志滚动的过程中,活动日志会以一个新名称命名,例如log.1,之前被命名为log.1的文件则会被重命名为log.2,依此类推。在这一组文件中,最旧的日志文件(假如名为log.7)会从系统中删除。日志滚动时文件的命名方式、保留日志文件的数量等参数是由/etc/logrotate.d目录中的配置文件决定的,因此你可能会看到有些日志文件只保留少数几次滚动,而有些日志文件的滚动次数会到7次或更多。
例如syslog在经过日志滚动之后可能会如下所示(注意,行尾的注释部分只是说明滚动过程是如何对文件名产生影响的):
$ls-l/var/log/syslog* -rw-r-----1syslogadm128674Mar1008:00/var/log/syslog<==新文件 -rw-r-----1syslogadm2405968Mar916:09/var/log/syslog.1<==之前的syslog -rw-r-----1syslogadm206451Mar900:00/var/log/syslog.2.gz<==之前的syslog.1 -rw-r-----1syslogadm216852Mar800:00/var/log/syslog.3.gz<==之前的syslog.2.gz -rw-r-----1syslogadm212889Mar700:00/var/log/syslog.4.gz<==之前的syslog.3.gz -rw-r-----1syslogadm219106Mar600:00/var/log/syslog.5.gz<==之前的syslog.4.gz -rw-r-----1syslogadm218596Mar500:00/var/log/syslog.6.gz<==之前的syslog.5.gz -rw-r-----1syslogadm211074Mar400:00/var/log/syslog.7.gz<==之前的syslog.6.gz
你可能会发现,除了当前活动的日志和最新一次滚动的日志文件之外,其余的文件都已经被压缩以节省存储空间。这样设计的原因是大部分系统管理员都只需要查阅最新的日志文件,其余的日志文件压缩起来,需要的时候可以解压查阅,这是一个很好的折中方案。
手动日志滚动
你可以这样执行logrotate命令进行手动日志滚动:
$sudologrotate-f/etc/logrotate.d/rsyslog
值得一提的是,logrotate命令使用/etc/logrotate.d/rsyslog这个配置文件,并通过了-f参数实行“强制滚动”。因此,整个过程将会是:
- 删除syslog.7.gz,
- 将原来的syslog.6.gz命名为syslog.7.gz,
- 将原来的syslog.5.gz命名为syslog.6.gz,
- 将原来的syslog.4.gz命名为syslog.5.gz,
- 将原来的syslog.3.gz命名为syslog.4.gz,
- 将原来的syslog.2.gz命名为syslog.3.gz,
- 将原来的syslog.1.gz命名为syslog.2.gz,
- 但新的syslog文件不一定必须创建。
你可以按照下面的几条命令执行操作,以确保文件的属主和权限正确:
$sudotouch/var/log/syslog $sudochownsyslog:adm/var/log/syslog $sudochmod640/var/log/syslog
你也可以把以下这一行内容添加到/etc/logrotate.d/rsyslog当中,由logrotate来帮你完成上面三条命令的操作:
create0640syslogadm
整个配置文件的内容是这样的:
/var/log/syslog { rotate7 daily missingok notifempty create0640syslogadm<== delaycompress compress postrotate /usr/lib/rsyslog/rsyslog-rotate endscript }
下面是手动滚动记录用户登录信息的wtmp日志的示例。由于/etc/logrotate.d/wtmp中有rotate2的配置,因此系统中只保留了两份wtmp日志文件。
滚动前:
$ls-lwtmp* -rw-r-----1rootutmp1152Mar1211:49wtmp -rw-r-----1rootutmp768Mar1117:04wtmp.1
执行滚动命令:
$sudologrotate-f/etc/logrotate.d/wtmp
滚动后:
$ls-l/var/log/wtmp* -rw-r-----1rootutmp0Mar1211:52/var/log/wtmp -rw-r-----1rootutmp1152Mar1211:49/var/log/wtmp.1 -rw-r-----1rootadm99726Feb2107:46/var/log/wtmp.report
需要知道的是,无论发生的日志滚动是自动滚动还是手动滚动,最近一次的滚动时间都会记录在logrorate的状态文件中。
$grepwtmp/var/lib/logrotate/status "/var/log/wtmp"2020-3-12-11:52:57
总结
到此这篇关于在Linux系统中手动滚动日志的文章就介绍到这了,更多相关linux滚动日志内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!