封面来源:https://dn-simplecloud.shiyanlou.com/courses/uid963125-20190610-1560173307016

无论是 Windows,macOS,Linux 还是 FreeBSD,日志都扮演着不可或缺的角色。它记录了系统内服务和进程的完整运行流程,在出现错误或崩溃时可以立即查阅以获取对应的解决方案。然而,很多程序要么根本就不向用户告知日志的位置,要么就只会将内容写入一个日志文件内并且不会删除,使得日志难以查阅不说,体积也越来越大。那么,对于上面的问题,Linux 中有哪些解决方案呢?这就是我们今天要讲的 rsysloglogrotate.

关于日志

Linux 内处理的日志,从对象上说分为 2 类:第一类,也就是系统日志,它记录的日志包括系统操作有关的信息,如登录,程序启动关闭,错误,崩溃等;第二类,各类应用程序的日志,它们会以自己的方式写入日志。

下面是一些日志的例子:

日志路径

说明

/var/log/fail2ban.log

知名开源反爆破程序 fail2ban 的日志

/var/log/messages

系统的主日志,包括系统启动期间的日志

/var/log/dmesg

系统内核缓冲信息

/var/log/secure

系统的认证和安全日志

/var/log/dnf.log

包管理器 dnf 的日志(以前叫 yum.log . 需要使用 dnf history info 命令查看)

/var/log/maillog

系统的邮件日志(现在已经很少维护)

/var/log/cron

系统的 cron 计划任务日志

/var/log/firewalld

知名开源防火墙 firewall-cmd 的日志

rsyslog

rsyslog 在 Linux 中因其高性能、高安全性和灵活的配置被广泛用于日志的写入操作(但是对不会英语的新手来说就是个噩梦)。它提供的命令是 rsyslogd,在很多 Linux 发行版上是已经默认安装好的,但是需要 root 或 sudo 权限执行

它的配置文件如下:

分别是:

路径

解释

/etc/logrotate.d/rsyslog

logrotate 日志轮转有关的配置

/etc/rsyslog.conf

rsyslog主要配置文件

/etc/sysconfig/rsyslog

rsyslog 的相关文件

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

前面的 "GLOBAL DIRECTIVES" 和 "MODULES" 可以暂时不用管,直接看后面的 "RULES" 部分,它是 rsyslog 管理的重中之重。

"RULES" 部分差不多长这样(老版本是服务+大段分隔符+路径):

例如:

配置项

说明

authpriv.*

SSH 信息

mail.*

邮件

cron.*

计划任务

我们在 "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.*

  1. mail:指代邮件服务。这些都是系统预定义的,也可以通过 man 3 syslog 查阅。

  2. .:分隔符。

  3. *指代所有级别,一共 9 个,有 info, debug, error, emerg 等,其中 emerg 最为严重(常见于内核恐慌等紧急情况),debug 只是作为调试信息输出。

每一条规则,如果不显式指定 "sync" 选项,则默认为异步(async)写入。

logrotate

logrotate 的本意是“日志轮转”,就是将系统内大量的日志分割管理,并删除旧的无用日志。这有助于大幅缩减日志的体积,提高日志的可读性。

它的配置文件如下:

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

现在我们看到最主要的配置文件,也就是 /etc/logrotate.conf

每一个出现的配置项的含义是:

配置项

含义

weekly

每周轮转日志

rotate 4

保留 4 周轮转的日志

create

轮转旧日志后创建新的

dateext

使用日期作为轮转后文件的后缀

#compress

是否压缩(未被注释则启用)

include /etc/logrotate.d

包含该目录下的子配置文件

后面的 /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 查看:

C/C++ 新人开发者,主攻 UE5,业余 Linux 运维