15.6 Linux日志轮替(日志转储)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志是重要的系统文件,记录和保存了系统中所有的重要事件。但是日志文件也需要进行定期的维护,因为日志文件是不断增长的,如果完全不进行日志维护,而任由其随意递增,那么用不了多久,我们的硬盘就会被写满。

日志是重要的系统文件,记录和保存了系统中所有的重要事件。但是日志文件也需要进行定期的维护,因为日志文件是不断增长的,如果完全不进行日志维护,而任由其随意递增,那么用不了多久,我们的硬盘就会被写满。

日志维护的最主要的工作就是把旧的日志文件删除,从而腾出空间保存新的日志文件。这项工作如果靠管理员手工来完成,那其实是非常烦琐的,而且也容易忘记。那么 Linux 系统是否可以自动完成日志的轮替工作呢?

logrotate 就是用来进行日志轮替(也叫日志转储)的,也就是把旧的日志文件移动并改名,同时创建一个新的空日志文件用来记录新日志,当旧日志文件超出保存的范围时就删除。

日志文件的命名规则

日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围时就删除。那么,旧的日志文件改名之后,如何命名呢?主要依靠 /etc/logrotate.conf 配置文件中的“dateext”参数。

如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,如“secure-20130605”。这样日志文件名不会重叠,也就不需要对日志文件进行改名,只需要保存指定的日志个数,删除多余的日志文件即可。

如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志,用来保存新的日志;当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”,当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来保存新的日志;以此类推。

logrotate配置文件

我们来查看一下 logrotate 的配置文件 /etc/logrotate.conf 的默认内容。

[root@localhost ~]# vi /etc/logrotate.conf
\#see "man logrotate" for details
\#rotate log files weekly
weekly
\#每周对日志文件进行一次轮替
\#keep 4 weeks worth of backlogs rotate 4
\#保存4个日志文件,也就是说,如果进行了5次日志轮替,就会删除第一个备份曰志
\#create new (empty) log files after rotating old ones create
\#在日志轮替时,自动创建新的日志文件
\#use date as a suffix of the rotated file dateext
\#使用日期作为日志轮替文件的后缀
\#uncomment this if you want your log files compressed #compress
\#日志文件是否压缩。如果取消注释,则日志会在转储的同时进行压缩
\#以上日志配置为默认配置,如果需要轮替的日志没有设定独立的参数,那么都会遵循以上参数
\#如果轮替曰志配置了独立参数,那么独立参数的优先级更高
\#RPM packages drop log rotation information into this directory include /etc/logrotate.d
\#包含/etc/logrotate.d/目录中所有的子配置文件。也就是说,会把这个目录中所有的子配置文件读取进来,进行日志轮替
\#no packages own wtmp and btmp -- we'11 rotate them here
\#以下两个轮替曰志有自己的独立参数,如果和默认的参数冲突,则独立参数生效
/var/log/wtmp {
\#以下参数仅对此目录有效
monthly
\#每月对日志文件进行一次轮替
create 0664 root utmp
\#建立的新日志文件,权限是0664,所有者是root,所属组是utmp组
minsize 1M
\#日志文件最小轮替大小是1MB。也就是日志一定要超过1MB才会轮替,否则就算时间达到一个月,也不进行曰志轮替
rotate 1
\#仅保留一个曰志备份。也就是只保留wtmp和wtmp.1曰志)
/var/log/btmp {
\#以下参数只对/var/log/btmp生效
missingok
\#如果日志不存在,则忽略该日志的警告信患
monthly
create 0600 root utmp
rotate 1
}
\# system-specific logs may be also be configured here.

在这个配置文件中,主要分为三部分:

  • 第一部分是默认设置,如果需要转储的日志文件没有特殊配置,则遵循默认设置的参数;
  • 第二部分是读取 /etc/logrotate.d/ 目录中的日志轮替的子配置文件,也就是说,在 /etc/logrotate.d/ 目录中的所有符合语法规则的子配置文件也会进行日志轮替;
  • 第三部分是对 wtmp 和 btmp 日志文件的轮替进行设定,如果此设定和默认参数冲突,则当前设定生效(如 wtmp 的当前参数设定的轮替时间是每月,而默认参数的轮替时间是每周,则对 wtmp 这个日志文件来说,轮替时间是每月,当前的设定参数生效)。

logrotate 配置文件的主要参数如表 1 所示。

参 致 参数说明
daily 日志的轮替周期是毎天
weekly 日志的轮替周期是每周
monthly 日志的轮控周期是每月
rotate数宇 保留的日志文件的个数。0指没有备份
compress 当进行日志轮替时,对旧的日志进行压缩
create mode owner group 建立新日志,同时指定新日志的权限与所有者和所属组.如create 0600 root utmp
mail address 当进行日志轮替时.输出内存通过邮件发送到指定的邮件地址
missingok 如果日志不存在,则忽略该日志的警告信息
nolifempty 如果曰志为空文件,則不进行日志轮替
minsize 大小 日志轮替的最小值。也就是日志一定要达到这个最小值才会进行轮持,否则就算时间达到也不进行轮替
size大小 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替,如size 100k
dateext 使用日期作为日志轮替文件的后缀,如secure-20130605
sharedscripts 在此关键宇之后的脚本只执行一次
prerotate/cndscript 在曰志轮替之前执行脚本命令。endscript标识prerotate脚本结束
postrolaie/endscripl 在日志轮替之后执行脚本命令。endscripi标识postrotate脚本结束

这些参数中较为难理解的应该是 prerotate/endscript 和 postrotate/endscript,我们利用“man logrotate”中的例子来解释一下这两个参数。例如:

"/var/log/httpd/access.log" /var/log/httpd/error.log {
\#日志轮替的是/var/log/httpd/中RPM包默认安装的apache正确访问日志和错误日志
  rotate 5
  \#轮替5次
  mail www@my.org
  \#把信息发送到指定邮箱
  size 100k
  \#日志大于100KB时才进行日志轮替,不再按照时间轮替
  sharedscripts
  \#以下脚本只执行一次
  postrotate
  \#在日志轮替结束之后,执行以下脚本
  /usr/bin/killall -HUP httpd
  \#重启apache 服务
endscript
\#脚本结束
}

prerotate 和 postrotate 主要用于在日志轮替的同时执行指定的脚本,一般用于日志轮替之后重启服务。这里强调一下,如果你的日志是写入 rsyslog 服务的配置文件的,那么把新日志加入 logrotate 后,一定要重启 rsyslog 服务,否则你会发现,虽然新日志建立了,但数据还是写入了旧的日志当中。那是因为虽然 logrotate 知道日志轮替了,但是 rsyslog 服务并不知道。

同理,如果采用源码包安装了 apache、Nginx 等服务,则需要重启 apache 或 Nginx 服务,同时还要重启 rsyslog 服务,否则日志也不能正常轮替。

不过,这里有一个典型应用就是给予特定的日志加入 chattr 的 a 属性。如果系统文件加入了 a 属性,那么这个文件就只能增加数据,而不能删除和修改已有的数据,root 用户也不例外。

因此,我们会给重要的日志文件加入 a 属性,这样就可以保护日志文件不被恶意修改。不过,一旦加入了 a 属性,那么在进行日志轮替时,这个日志文件是不能被改名的,当然也就不能进行日志轮替了。我们可以利用 prerotate 和 postrotate 参数来修改日志文件的 chattr 的 a 属性。

把自己的日志加入日志轮替

如果有些日志默认没有加入日志轮替(比如源码包安装的服务的日志,或者自己添加的日志),那么这些日志默认是不会进行日志轮替的,这样当然不符合我们对日志的管理要求。如果需要把这些日志也加入日志轮替,那该如何操作呢?

这里有两种方法:

  • 第一种方法是直接在 /etc/logrotate.conf 配置文件中写入该日志的轮替策略,从而把日志加入轮替;
  • 第二种方法是在 /etc/logrotate.d/ 目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被包含到主配置文件中,所以也可以把日志加入轮替。

我们推荐第二种方法,因为系统中需要轮替的日志非常多,如果全部直接写入 /etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。

说起来很复杂,我们举个例子。还记得我们自己生成的 /var/log/alert.log 日志吗?这个日志不是系统默认日志,而是我们通过 /etc/rsyslog.conf 配置文件自己生成的日志,所以默认这个日志是不会进行轮替的。如果我们需要把这个日志加入日志轮替策略,那该怎么实现呢?我们采用第二种方法,也就是在 /etc/logrotate.d/ 目录中建立此日志的轮替文件。

具体步骤如下:

[root@localhost ~]# chattr +a /var/log/alert.log #先给日志文件赋予chattr的a属性,保证日志的安全
[root@localhost ~]# vi /etc/logrotate.d/alter
\#创建alter轮替文件,把/var/log/alert.log加入轮替
/var/log/alert.log {
  weekly
  \#每周轮替一次
  rotate 6
  \#保留6个轮替曰志
  sharedscripts
  \#以下命令只执行一次
  prerotate
  \#在日志轮替之前执行
    /usr/bin/chattr -a /var/log/alert.log
    \#在日志轮替之前取消a属性,以便让日志可以轮替
  endscript
  \#脚本结朿
  sharedscripts
  postrotate
  \#在日志轮替之后执行
    /usr/bin/chattr +a /var/log/alert.log
    \#在日志轮替之后,重新加入a属性
  endscript
  sharedscripts
  postrotate
  /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2>/dev/null) fi>/dev/null
  endscript
  \#重启rsyslog服务,保证日志轮替正常进行
}

这样我们自己生成的日志 /var/log/alert.log 也就可以进行日志轮替了,当然这些配置信息也是可以直接写入 /etc/logrotate.conf 这个配置文件的。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
21天前
|
监控 Linux 开发者
如何在 Linux 中优雅的使用 head 命令,用来看日志简直溜的不行
`head` 命令是 Linux 系统中一个非常实用的工具,用于快速查看文件的开头部分内容。本文介绍了 `head` 命令的基本用法、高级用法、实际应用案例及注意事项,帮助用户高效处理文件和日志,提升工作效率。
29 7
|
2月前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
49 3
|
2月前
|
安全 NoSQL Ubuntu
linux 添加用户useradd 段错误 (核心已转储)
在Linux系统中使用`useradd`命令添加用户时遇到“段错误 (核心已转储)”的问题,通常表明存在系统级或关键组件问题。可通过检查系统日志(如`/var/log/syslog`)和内核消息来定位错误。此外,还需检查并修复文件系统错误(使用`fsck`),确保关键配置文件未损坏,并更新系统包与安全补丁。使用内存检测工具(如memtest86+)排查硬件故障,或重新安装`useradd`及其依赖库。通过`strace`跟踪命令执行过程,检查SELinux/AppArmor安全策略影响,并分析核心转储文件以进一步诊断问题根源。
155 1
|
2月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控总结
Linux系统命令与网络,磁盘和日志监控总结
59 0
|
2月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控三
Linux系统命令与网络,磁盘和日志监控三
42 0
|
4月前
|
Java Linux C++
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
|
4月前
|
存储 Linux 网络安全
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
|
24天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
176 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
256 3
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1655 14