封面来源:https://dn-simplecloud.shiyanlou.com/courses/uid963125-20190610-1560173307016
无论是 Windows,macOS,Linux 还是 FreeBSD,日志都扮演着不可或缺的角色。它记录了系统内服务和进程的完整运行流程,在出现错误或崩溃时可以立即查阅以获取对应的解决方案。然而,很多程序要么根本就不向用户告知日志的位置,要么就只会将内容写入一个日志文件内并且不会删除,使得日志难以查阅不说,体积也越来越大。那么,对于上面的问题,Linux 中有哪些解决方案呢?这就是我们今天要讲的 rsyslog 和 logrotate.
关于日志
Linux 内处理的日志,从对象上说分为 2 类:第一类,也就是系统日志,它记录的日志包括系统操作有关的信息,如登录,程序启动关闭,错误,崩溃等;第二类,各类应用程序的日志,它们会以自己的方式写入日志。
下面是一些日志的例子:
rsyslog
rsyslog 在 Linux 中因其高性能、高安全性和灵活的配置被广泛用于日志的写入操作(但是对不会英语的新手来说就是个噩梦)。它提供的命令是 rsyslogd,在很多 Linux 发行版上是已经默认安装好的,但是需要 root 或 sudo 权限执行。
它的配置文件如下:

分别是:
现在我们打开 rsyslog 的主配置文件:

前面的 "GLOBAL DIRECTIVES" 和 "MODULES" 可以暂时不用管,直接看后面的 "RULES" 部分,它是 rsyslog 管理的重中之重。
"RULES" 部分差不多长这样(老版本是服务+大段分隔符+路径):

例如:
我们在 "RULES" 下面编写的每一条规则都必须遵循这样的格式:
$dev action(type="$level" file="$dest_dir")
# $dev: The device/facility, or the target/service you'd like to log.
# $level: The level, or the preset way to log.
# $dest_dir: The destination of log file.其中,最开始的 $dev(服务名称)由下面 3 个部分组成:
mail.*
mail:指代邮件服务。这些都是系统预定义的,也可以通过man 3 syslog查阅。.:分隔符。*:指代所有级别,一共 9 个,有 info, debug, error, emerg 等,其中 emerg 最为严重(常见于内核恐慌等紧急情况),debug 只是作为调试信息输出。
每一条规则,如果不显式指定 "sync" 选项,则默认为异步(async)写入。
logrotate
logrotate 的本意是“日志轮转”,就是将系统内大量的日志分割管理,并删除旧的无用日志。这有助于大幅缩减日志的体积,提高日志的可读性。
它的配置文件如下:

但我们今天真正要用到的是 /etc/logrotate.conf 和 /etc/logrotate.d/* 子文件夹。前者决定了每个日志文件如何轮转,而后者则属于用户(或软件)的自定义配置,便于管理。
现在我们看到最主要的配置文件,也就是 /etc/logrotate.conf:

每一个出现的配置项的含义是:
后面的 /etc/logrotate.d/* 内配置项非常多,这里就不一一列举了。
一般我们在这个文件夹内写 logrotate 配置的时候,文件名可以直接命名为程序/软件的名称,不需要加扩展名。
例如,在下面这样一个系统内,已经有了这些程序的日志轮转:

我们创建一个名为 fail2ban 的配置文件,按照以下内容格式:

每一行我都写了配置项的含义,但还是有必要为不懂英语的小伙伴解释一下:
missingok:表示可以丢失日志文件。换言之,如果丢失日志文件,系统不会报错而继续轮转下一个。notifyempty:表示如果日志为空,则不轮转。maxsize 30k:表示日志能够接受的最大体积为 30 KB。换言之,如果大小超过 30 KB,则轮转日志。强烈建议为经常写入日志的程序使用此配置项。yearly:表示每年轮转一次。daily:表示每日轮转一次。rotate 3:表示保留 3 个轮转的日志。create 0600 root root:表示创建的日志 UGO 权限为 600(仅所有者有读写权限),所有者为 root,用户组为 root.
还可以在轮转后执行相应的命令或脚本。例如:
# Script executed after rotating
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript(来源:https://www.cnblogs.com/txlsz/p/13126723.html)
改完记得保存一下。重启服务,到触发时间就可以执行日志轮转了。
(题外话:如果你想立即触发,可以用 date MMDDHH24MM 改系统时间,再使用 logrotate -s /var/lib/logrotate.status /etc/logrotate.conf 触发轮转)
对了,如果你要看轮转的记录,可以使用 cat /var/lib/logrotate/logrotate.status 查看:
