龙之介大人

Linux日志管理
18.1 CentOS7 登录文件档简易说明要知道的是,我们的 Linux 主机在背景之下有相当多的 daemon...
扫描右侧二维码阅读全文
10
2019/11

Linux日志管理

18.1 CentOS7 登录文件档简易说明

要知道的是,我们的 Linux 主机在背景之下有相当多的 daemons 同时在工作着,这些工作中的程序总是会显示一些讯息,这些显示的讯息最终会被记载到登录文件当中啦。也就是说,记录这些系统 的重要讯息就是登录文件的工作啦!

Linux 常见的登录日志文件

登录文件可以帮助我们了解很多系统重要的事件,包括登入者的部分信息,因此登录文件的权限通常是设定为仅有 root 能够读取而已。而由于登录文件可以记载系统这么多的详细信息,所以啦,一个有经验的主机管理员会随时随地查阅一下自己的登录檔,以随时掌握系统的最新脉动!那么常见的几个登录档有哪些呢?一般而言,有下面几个:

  • /var/log/boot.log:

    开机的时候系统核心会去侦测与启动硬件,接下来开始各种核心支持的功能启动等。这些流程都会记录在 /var/log/boot.log 里面哩!不过这个文件只会存在这次开机启动的信息,前次开机的信息并不会被保留下来!

  • /var/log/cron:

    还记得第十五章例行性工作排程吧?你的 crontab 排程有没有实际被进行? 进行过程有没有发生错误? 你的 /etc/crontab 是否撰写正确?在这个登录档内查询看看。

  • /var/log/dmesg:

    记录系统在开机的时候核心侦测过程所产生的各项信息。由于 CentOS 默认将开机时核心的硬件侦测过程取消显示, 因此额外将数据记录一份在这个文件中;

  • /var/log/lastlog:

    可以记录系统上面所有的账号最近一次登入系统时的相关信息。第十三章讲到的 lastlog 指令就是利用这个 文件的记录信息来显示的。

  • /var/log/maillog 或 /var/log/mail/*:

    记录邮件的往来信息,其实主要是记录 postfix (SMTP 协议提供者) 与 dovecot (POP3 协议提供者) 所产生的讯息啦。 SMTP 是发信所使用的通讯协议, POP3 则是收信使用的通讯协议。postfix 与 dovecot 则分别是两套达成通讯协议的软件。

  • /var/log/messages:

    这个文件相当的重要,几乎系统发生的错误讯息 (或者是重要的信息) 都会记录在这个文件中;果系统发生莫名的错误时,这个文件是一定要查阅的登录档之一。

  • /var/log/secure:

    基本上,只要牵涉到『需要输入账号密码』的软件,那么当登入时 (不管登入正确或错误) 都会被记录在此文件中。包括系统的 login 程序、图形接口登入所使用的 gdm 程序、su, sudo 等程序、还有网络联机的 ssh, telnet 等程序,登入信息都会被记载在这里;

  • /var/log/wtmp, /var/log/faillog:

    这两个文件可以记录正确登入系统者的帐户信息 (wtmp) 与错误登入时所使用的帐户信息 (faillog) !我们在第十章谈到的 last 就是读取 wtmp 来显示的,这对于追踪一般账号者的使用行为很有帮助!

  • /var/log/httpd/*, /var/log/samba/*:

    不同的网络服务会使用它们自己的登录文件来记载它们自己产生的各项讯息!上述的目录内则是个别服务所制订的登录档。

常见的登录档就是这几个,但是不同的 Linux distributions ,通常登录档的档名不会相同 (除了 /var/log/messages 之外)。所以说,你还是得要查阅你 Linux 主机上面的登录文件设定数据, 才能知道你的登录档主要档名喔!

登录档所需相关服务 (daemon) 与程序

那么这些登录档是怎么产生的呢?基本上有两种方式,一种是由软件开发商自行定义写入的登录档与相关格式, 例如 WWW 软件 apache 就是这样处理的。另一种则是由 Linux distribution 提供的登 录档管理服务来统一管理。 你只要将讯息丢给这个服务后,他就会自己分门别类的将各种讯息放置 到相关的登录档去!CentOS 提供 rsyslog.service 这个服务来统一管理登录档喔!

不过要注意的是,如果你任凭登录文件持续记录的话,由于系统产生的信息天天都有,那么你的登录文件的容量将会长大到无法无天~ 如果你的登录文件容量太大时,可能会导致大文件读写效率不佳的问题 (因为要从磁盘读入内存,越大的文件消耗内存量越多)。 所以啰,你需要对登录档备份与更新。那...需要手动处理喔?当然不需要,我们可以透过 logrotate (登录档轮替) 这玩意儿来自动化处 理登录文件容量与更新的问题喔!

所谓的 logrotate 基本上,就是将旧的登录档更改名称,然后建立一个空的登录档,如此一来,新的登录文件将重新开始记录,然后只要将旧的登录档留下一阵子,嗯!那就可以达到将登录档『轮转』的目的啦! 此外,如果旧的记录 (大概要保存几个月吧!) 保存了一段时间没有问题,那么就可以 让系统自动的将他砍掉, 免得占掉很多宝贵的硬盘空间说!

总结一下,针对登录文件所需的功能,我们需要的服务与程序有:

  • systemd-journald.service:最主要的讯息收受者,由 systemd 提供的;
  • rsyslog.service:主要登录系统与网络等服务的讯息;
  • logrotate:主要在进行登录文件的轮替功能。

由于我们着眼点在于想要了解系统上面软件所产生的各项信息,因此本章主要针对 rsyslog.service 与 logrotate 来介绍。 接着下来我们来谈一谈怎么样规划这两个玩意儿。就由 rsyslog.service 这支程序先谈起吧!毕竟得先有登录档,才可以进行 logrotate 呀!您说是吧!

CentOS 7.x 使用 systemd 提供的 journalctl 日志管理

CentOS 7 除了保有既有的 rsyslog.service 之外,其实最上游还使用了 systemd 自己的登录文件日志管理功能喔!他使用的是 systemd-journald.service 这个服务来支持的。基本上,系统由 systemd 所管理,那所有经由 systemd 启动的服务,如果再启动或结束的过程中发生一些问题或者是正常的讯息,就会将该讯息由 systemd-journald.service 以二进制的方式记录下来,之后再将这个讯息发送给rsyslog.service 作进一步的记载。

systemd-journald.service 的记录主要都放置于内存中,因此在存取方面效能比较好~我们也能够透过 journalctl 以及 systemctl status unit.service 来查看各个不同服务的登录档! 这有个好处,就是登录档可以随着个别服务让你查阅,在单一服务的处理上面,要比跑到 /var/log/messages 去大海捞针来的简易很多!不过,因为 system-journald.service 里面的很多观念还是沿用 rsyslog.service 相关的信息,所以,本章还是先从 rsyslog.service 先谈起,谈完之后再以 journalctl 进一步了解 systemd 是怎么去记录登录文件日志功能的!

登录档内容的一般格式

一般来说,系统产生的讯息经过记录下来的数据中,每条讯息均会记录底下的几个重要数据:

  • 事件发生的日期与时间;
  • 发生此事件的主机名;
  • 启动此事件的服务名称 (如 systemd, CROND 等) 或指令与函式名称 (如 su, login..);
  • 该讯息的实际数据内容。

当然,这些信息的『详细度』是可以修改的,而且,这些信息可以作为系统除错之用呢!我们拿登录时一定会记载帐户信息的 /var/log/secure 为例好了:

[root@study system]# cat /var/log/secure | more
Nov  3 19:35:28 study sshd[4423]: Accepted password for root from 182.101.158.144 port 51552 ssh2
Nov  3 19:35:29 study sshd[4423]: pam_unix(sshd:session): session opened for user root by (uid=0)
Nov  3 22:28:24 study polkitd[848]: Registered Authentication Agent for unix-process:7897:1455762 (system bus name 
:1.116 [/usr/bin/pkttyagent --notify-fd 8 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent,
 locale zh_CN.UTF-8)
Nov  3 22:28:25 study polkitd[848]: Unregistered Authentication Agent for unix-process:7897:1455762 (system bus nam
e :1.116, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.UTF-8) (disconnected from bus)
Nov  3 22:41:43 study sshd[4423]: pam_unix(sshd:session): session closed for user root
Nov  4 19:01:03 study polkitd[868]: Loading rules from directory /etc/polkit-1/rules.d
|------日期----|--H---|-服务与相关函数-|-----------日志信息------->

我们拿第一笔数据 (共两行) 来说明好了,该资料是说:『在 11/03 的 19:35 左右,在名为 study用户用ssh登录的这部主机系统上,由 sshd 这个程序产生的讯息,内容显示 root 在 182.101.158.144 登入了,而相关的权限给予是透过 pam_unix 模块处理的 (共两行数据)。』有够清楚吧!那请您自行翻译一下后面的几条讯 息内容是什么喔!

其实还有很多的信息值得查阅的呢!尤其是 /var/log/messages 的内容。记得一个好的系统管理员,要常常去『巡视』登录档的内容喔!尤其是发生底下几种情况时:

  • 当你觉得系统似乎不太正常时;
  • 某个 daemon 老是无法正常启动时;
  • 某个使用者老是无法登入时;
  • 某个 daemon 执行过程老是不顺畅时;

还有很多!反正觉得系统不太正常,就得要查询查询登录档就是了。

18.2 rsyslog.service:记录登录文件的服务

上一小节提到说 Linux 的登录档主要是由 rsyslog.service 在负责,那么你的 Linux 是否有启动 rsyslog 呢?而且是否有设定开机时启动呢?检查一下先:

[root@study system]# ps aux | grep rsyslog
root       771  0.0  0.4 287688  4204 ?        Ssl  18:01   0:00 /usr/sbin/rsyslogd -n
root     10588  0.0  0.0 112668   960 pts/0    R+   23:19   0:00 grep --color=auto rsyslog
#确实有启动的!daemon 执行档名为 rsyslogd 喔!


[root@study system]# systemctl status rsyslog.service 
● rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since 六 2019-11-09 18:01:09 CST; 5h 19min ago
 Main PID: 771 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─771 /usr/sbin/rsyslogd -n

11月 09 18:02:43 study.centos.xiaoqi systemd[1]: Starting System Logging Service...
11月 09 18:01:09 study.centos.xiaoqi systemd[1]: Started System Logging Service.
#也有启动这个服务,也有预设开机时也要启动这个服务!OK!正常没问题!!

看到 rsyslog.service 这个服务名称了吧?所以知道他已经在系统中工作!好了,既然本章主要是讲登录档的服务,那么 rsyslog.service 的配置文件在哪里?如何设定?如果你的 Linux 主机想要当作整个区网的登录档服务器时,又该如何设定?底下就让我们来玩玩这玩意!

18.2.1 rsyslog.service的配置文件:/etc/rsyslog.conf

基本上, rsyslogd 针对各种服务与讯息记录在某些文件的配置文件就是 /etc/rsyslog.conf, 这个文件规定了『(1)什么服务 (2)的什么等级讯息 (3)需要被记录在哪里(装置或文件)』 这三个咚咚,所以设定的语法会是这样:

服务名称[.=!]讯息等级             讯息记录的文件名或装置或主机
#底下以 mail 这个服务产生的 info 等级为例:

mail.info                 /var/log/maillog_info
#这一行说明:mail 服务产生的大于等于 info 等级的讯息,都记录到/var/log/maillog_info 文件中的意思。
我们将上面的数据简单的分为三部分来说明:

服务名称

rsyslogd 主要还是透过 Linux 核心提供的 syslog 相关规范来设定数据的分类的,Linux 的 syslog 本身有规范一些服务讯息,你可以透过这些服务来储存系统的讯息。Linux 核心的 syslog 认识的服务类型主要有底下这些: (可使用 man 3 syslog 查询到相关的信息,或查询 syslog.h 这个文件来了解的!)

相对序号服务类别说明
0kern(kernel)就是核心 (kernel) 产生的讯息,大部分都是硬件侦测以及核心功能的启用
1user在用户层级所产生的信息,例如后续会介绍到的用户使用 logger 指令来记录登录文件的功能
2mail只要与邮件收发有关的讯息记录都属于这个;
3daemon主要是系统的服务所产生的信息,例如 systemd 就是这个有关的讯息!
4auth主要与认证/授权有关的机制,例如 login, ssh, su 等需要账号/密码的咚咚;
5syslog就是由 syslog 相关协议产生的信息,其实就是 rsyslogd 这支程序本身产生的信息啊!
6lpr亦即是打印相关的讯息啊!
7news与新闻组服务器有关的东西;
8uucp全名为 Unix to Unix Copy Protocol,早期用于 unix 系统间的程序数据交换;
9cron就是例行性工作排程 cron/at 等产生讯息记录的地方;
10authpriv与 auth 类似,但记录较多账号私人的信息,包括 pam 模块的运作等!
11ftp与 FTP 通讯协议有关的讯息输出!
16~23local0 ~ local7保留给本机用户使用的一些登录文件讯息,较常与终端机互动。

上面谈到的都是 Linux 核心的 syslog 函数自行制订的服务名称,软件开发商可以透过呼叫上述的服务名称来记录他们的软件。举例来说,sendmail 与 postfix 及 dovecot 都是与邮件有关的软件,这些软件在设计登录文件记录时,都会主动呼叫 syslog 内的 mail 服务名称 (LOG_MAIL)。所以上述三个软件 (sendmail, postfix, dovecot) 产生的讯息在 syslog 看起来,就会『是 mail 』类型的服务了。我们可以将这个概念绘制如底下的图示来理解:

另外,每种服务所产生的数据量其实差异是很大的,举例来说, mail 的登录文件讯息多的要命,每一封信件进入后,mail 至少需要记录『寄信人的信息;与收信者的讯息』等等; 而如果是用来做为工作站主机的,那么登入者 (利用 login 登录主机处理事情) 的数量一定不少,那个 authpriv 所管 辖的内容可就多的要命了。

为了让不同的信息放置到不同的文件当中,好让我们分门别类的进行登录档的管理,所以啰,将各种类别的服务之登录文件,记录在不同的文件里面,就是我们 /etc/rsyslog.conf 所要作的规范了!

讯息等级

同一个服务所产生的讯息也是有差别的,有启动时仅通知系统而已的一般讯息 (information), 有出现还不至于影响到正常运作的警告讯息 (warn) ,还有系统硬件发生严重错误时,所产生的重大问题讯息 (error 等等); 讯息到底有多少种严重的等级呢?基本上,Linux 核心的 syslog 将讯息分为七个主要的等级,根据 syslog.h 的定义,讯息名称与数值的对应如下:

等级数值等级名称说明
7debug用来 debug (除错) 时产生的讯息数据;
6info仅是一些基本的讯息说明而已;
5notice虽然是正常信息,但比 info 还需要被注意到的一些信息内容;
4warning
(warn)
警示的讯息,可能有问题,但是还不至于影响到某个 daemon 运作的信息;基本上,info, notice, warn 这三个讯息都是在告知一些基本信息而已,应该还不至于造成一些系统运作 困扰;
3err
(error)
一些重大的错误讯息,例如配置文件的某些设定值造成该服务服法启动的信息说明, 通常藉由 err 的错误告知,应该可以了解到该服务无法启动的问题呢!
2crit比 error 还要严重的错误信息,这个 crit 是临界点 (critical) 的缩写,这个错误已经很严重了喔
1alert警告警告,已经很有问题的等级,比 crit 还要严重!
0emerg
(panic)
疼痛等级,意指系统已经几乎要当机的状态! 很严重的错误信息了。通常大概只有硬件出问题,导致整个核心无法顺利运作,就会出现这样的等级的讯息吧!

基本上,在 0(emerg) 到 6(info) 的等级之间,等级数值越高代表越没事,等级靠近 0 则代表事情大条了!除了 0 到 6 之外还有两个比较特殊的等级,那就是 debug(错误侦测等级) 与 none (不需登录等级) 两个,当我们想要作一些错误侦测,或者是忽略掉某些服务的信息时, 就用这两个吧!

  • . :代表『比后面还要严重的等级 (含该等级) 都被记录下来』的意思,例如: mail.info 代表只要是 mail 的信息,而且该信息等级严重于 info (含 info 本身)时,就会被记录下来的意思。
  • .=:代表所需要的等级就是后面接的等级而已, 其他的不要!
  • .!:代表不等于, 亦即是除了该等级外的其他等级都记录。

一般来说,我们比较常使用的是『.』这个链接符号啦!

讯息记录的文件名或装置或主机

再来则是这个讯息要放置在哪里的设定了。通常我们使用的都是记录的文件啦!但是也可以输出到装 置呦! 例如打印机之类的!也可以记录到不同的主机上头去呢!底下就是一些常见的放置处:

  • 件的绝对路径:通常就是放在 /var/log 里头的文件!
  • 打印机或其他:例如 /dev/lp0 这个打印机装置
  • 使用者名称:显示给用户啰!
  • 远程主机:例如 @study.xiaoqi.tsai 当然啦,要对方主机也能支持才行!
  • *:代表『目前在在线的所有人』,类似 wall 这个指令的意义!

服务、daemon 与函数名称

看完上面的说明,相信你一定会越来越迷糊!怎么会有 syslog, rsyslogd, rsyslog.service!名称都不相同!那是啥东西? 基本上,这几个东西你应该要这样看:

服务名记录类型
syslog这个是 Linux 核心所提供的登录档设计指引,所有的要求大概都写入道一个名为 syslog.h 的头文件案中。如果你想要开发与登录文件有关的软件, 那你就得要依循这个 syslog 函数的要求去设计才行!可以使用 man 3 syslog 去查询一下相关的数据!
rsyslogd为了要达成实际上进行讯息的分类所开发的一套软件,所以,这就是最基本的 daemon 程序!
rsyslog.service为了加入 systemd 的控制,因此 rsyslogd 的开发者设计的启动服务脚本设定!

这样简单的分类,应该比较容易了解名称上面的意义了吧?早期 CentOS 5.x 以前,要达成 syslog 的功能是由一只名为 syslogd 的 daemon 来完成的,从 CentOS 6 以来 (包含 CentOS 7) 则是透过 rsyslogd 这个 daemon !

rsyslog.conf 语法练习

基本上,整个 rsyslog.conf 配置文件的内容参数大概就只是这样而已,底下我们来思考一些例题,好让你可以更清楚的知道如何设定 rsyslogd!
  • 例题一:
如果我要将我的 mail 相关的数据给他写入 /var/log/maillog 当中,那么在 /etc/rsyslog.conf 的语法如何设计?
#基本的写法是这样的:

mail.info    /var/log/maillog

#注意到上面喔,当我们的等级使用 info 时,那么『任何严重于 info 等级(含 info 这个等级)之上的讯息,都会被写入到后面接的文件之中!』这样可以了解吗?也就是说,我们可以将所有 mail 的登录信息都记录在 /var/log/maillog 里面的意思啦!
  • 例题二:
我要将新闻组资料 (news) 及例行性工作排程 (cron) 的讯息都写入到一个称为 /var/log/cronnews 的文件中,但是这两个程序的警告讯息则额外的记录在 /var/log/cronnews.warn 中,那该如何设定我的 rsyslog.conf
#既然是两个程序,那么只好以分号来隔开了,此外,由于第二个指定文件中,我只要记录警告讯息,因此设定上需要指定『.=』这个符号,所以语法成为了:

news.*;cron.*        /var/log/cronnews
news.=warn;cron.=warn    /var/log/cronnews.warn

#上面那个『.=』就是在指定等级的意思啦!由于指定了等级,因此,只有这个等级的讯息才会被记录在这个文件里面呢! 此外你也必须要注意,news 与 cron 的警告讯息也会写入 /var/log/cronnews 内喔!
  • 例题三:
我的 messages 这个文件需要记录所有的信息,但是就是不想要记录 cron, mail 及 news 的信息,那么应该怎么写才好?
#可以有两种写法,分别是:

*.*;news,cron,mail.none            /var/log/messages
*.*;news.none;cron.none;mail.none        /var/log/messages

#使用『,』分隔时,那么等级只要接在最后一个即可,如果是以『;』来分的话,那么就需要将服务与等级都写上去啰!这样会设定了吧!

18.2.2 CentOS 7.x 预设的 rsyslog.conf 内容

了解语法之后,我们来看一看 rsyslogd 有哪些系统服务已经在记录了呢?就是瞧一瞧 /etc/rsyslog.conf 这个文件的预设内容啰! (注意!如果需要将该行做为批注时,那么就加上 # 符号就可以啦)

#CentOS 7.x的相关资料
#kern.*                                                 /dev/console
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*   

上面总共仅有 8 行设定值,每一行的意义是这样的:

  1. #kern.*:只要是核心产生的讯息,全部都送到 console(终端机) 去。console 通常是由外部装置连接到系统而来,举例来说,很多封闭型主机 (没有键盘、屏幕的系统) 可以透过连接 RS232 连接口将讯息传输到外部的系统中,例如以笔记本电脑连接到封闭主机的 RS232 插口。这个项目通常应该是用在系统出现严重问题而无法使用默认的屏幕观察系统时,可以透过这个项目来连接取得核心的讯息。
  2. *.info;mail.none;authpriv.none;cron.none:由于 mail, authpriv, cron 等类别产生的讯息较多,且已经写入底下的数个文件中,因此在 /var/log/messages 里面就不记录这些项目。除此之外的其他讯息都写入 /var/log/messages 中。这也是为啥我们说这个 messages 文件很重要的缘故!
  3. authpriv.*:认证方面的讯息均写入 /var/log/secure 文件;
  4. mail.*:邮件方面的讯息则均写入 /var/log/maillog 文件;
  5. cron.*:例行性工作排程均写入 /var/log/cron 文件;
  6. *.emerg:当产生最严重的错误等级时,将该等级的讯息以 wall 的方式广播给所有在系统登入的账号得知,要这么做的原因是希望在线的用户能够赶紧通知系统管理员来处理这么可怕的错误问题。
  7. uucp,news.crit:uucp 是早期 Unix-like 系统进行数据传递的通讯协议,后来常用在新闻组的用途中。 news 则是新闻组。当新闻组方面的信息有严重错误时就写入 /var/log/spooler 文件中;
  8. local7.*:将本机开机时应该显示到屏幕的讯息写入到 /var/log/boot.log 文件中;

在上面的第四行关于 mail 的记录中,在记录的文件 /var/log/maillog 前面还有个减号『 - 』是干嘛 用的?由于邮件所产生的讯息比较多,因此我们希望邮件产生的讯息先储存在速度较快的内存中 (buffer) ,等到数据量够大了才一次性的将所有数据都填入磁盘内,这样将有助于登录文件的存取性能。 只不过由于讯息是暂存在内存内,因此若不正常关机导致登录信息未回填到登录档中,可能会造成部分数据的遗失。

此外,每个 Linux distributions 的 rsyslog.conf 设定差异是颇大的,如果你想要找到相对应的登录信息时,可得要查阅一下 /etc/rsyslog.conf 这个文件才行!否则可能会发生分析到错误的信息喔!

18.2.3 自行增加登录文件文件功能

如果你有其他的需求,所以需要特殊的文件来帮你记录时,别客气,千万给他记录在 /etc/rsyslog.conf 当中,如此一来,你就可以重复的将许多的信息记录在不同的文件当中,以方便你的管理!让我们来作个练习题吧!如果你想要让『所有的信息』都额外写入到 /var/log/admin.log 这个文件时,你可以怎么作呢?先自己想一想,并且作一下,再来看看底下的作法啦!

#1.先设定好所要建立的文件设置!
[root@study ~]# vim /etc/rsyslog.conf 
#Add By xiaoqi 2019/11/10
*.info                                                  /var/log/admin.log

#2.重启rsyslog.service
[root@study ~]# systemctl restart rsyslog.service 
[root@study ~]# ll /var/log/admin.log 
-rw-------. 1 root root 622 11月 10 14:36 /var/log/admin.log

很简单吧!如此一来,所有的信息都会写入 /var/log/admin.log 里面了!

18.3 登录档的轮替(logrotate)

18.3.1 logrotate 的配置文件

既然 logrotate 主要是针对登录档来进行轮替的动作,所以啰,他当然必须要记载『 在什么状态下才将登录档进行轮替』的设定啊!那么 logrotate 这个程序的参数配置文件在哪里呢?那就是:

  • /etc/logrotate.conf
  • /etc/logrotate.d/

那个 logrotate.conf 才是主要的参数文件,至于 logrotate.d 是一个目录,该目录里面的所有文件都会被主动的读入 /etc/logrotate.conf 当中来进行!另外,在 /etc/logrotate.d/ 里面的文件中,如果没有规定到的一些细部设定,则以 /etc/logrotate.conf 这个文件的规定来指定为默认值!

好了,刚刚我们提到 logrotate 的主要功能就是将旧的登录文件移动成旧档, 并且重新建立一个新的 空的文件来记录,他的执行结果有点类似底下的图示:

由上面的图示我们可以清楚的知道,当第一次执行完 rotate 之后,原本的 messages 会变成 messages.1 而且会制造一个空的 messages 给系统来储存登录文件。而第二次执行之后,则 messages.1 会变成 messages.2 而 messages 会变成 messages.1 ,又造成一个空的 messages 来储存登录档!那么如果我们仅设定保留三个登录档而已的话,那么执行第四次时,则 messages.3 这个文件就会被删除,并由后面的较新的保存登录档所取代!基本的工作就是这样啦!

不过近年来磁盘空间容量比较大了,加上管理员又担心登录文件数据真的给它不见去,因此,你可能已经发现到,最近的登录档轮替后的档名已经会加上日期参数,然后源源不绝的保留在你的系统上虽然这个设定是可以修订的,不过,鸟哥也真的希望保留日期的文件名延伸记录,真的比较不用 担心未来要找问题时,登录档却已经 GG 了...

那么多久进行一次这样的 logrotate 工作呢?这些都记录在 logrotate.conf 里面,我们来看一下预设的 logrotate 的内容吧!

[root@study ~]# vim /etc/logrotate.conf 
#底下的设定是 "logrotate 的预设设定值" ,如果个别的文件设定了其他的参数,
#则将以个别的文件设定为主,若该文件没有设定到的参数则以这个文件的内容为默认值!

#see "man logrotate" for details
#rotate log files weekly
weekly        <--预设每个礼拜对登录档进行一次 rotate 的工作

#keep 4 weeks worth of backlogs
rotate 4    <--保留几个登录档呢?预设是保留四个!

#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/ 这个目录中的所有文件都读进来执行 rotate 的工作!

#no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {    <--仅针对 /var/log/wtmp 所设定的参数
    monthly        <--每个月一次,取代每周!
    create 0664 root utmp    <--指定新建文件的权限与所属账号/群组
    minsize 1M    <--文件容量一定要超过 1M 后才进行 rotate (略过时间参数)
    rotate 1    <--仅保留一个,亦即仅有 wtmp.1 保留而已。
}
#这个 wtmp 可记录登入者与系统重新启动时的时间与来源主机及登入期间的时间。 
#由于具有 minsize 的参数,因此不见得每个月一定会进行一次喔!要看文件容量。 
#由于仅保留一个登录档而已,不满意的话可以将他改成 rotate 5 吧!

由这个文件的设定我们可以知道 /etc/logrotate.d 其实就是由 /etc/logrotate.conf 所规划出来的目录, 所以,其实我们可以将所有的资料都给他写入 /etc/logrotate.conf 即可,但是这样一来这个文件就实在是太复杂了,尤其是当我们使用很多的服务在系统上面时,每个服务都要去修改 /etc/logrotate.conf 的设定也似乎不太合理 所以,如果独立出来一个目录,那么每个以 RPM 打包方式所建立的服务的登录档轮替设定,就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中即可,真是方便又合理的做法啊!

一般来说,这个 /etc/logrotate.conf 是『预设的轮替状态』而已,我们的各个服务都可以拥有自己的登录档轮替设定,你也可以自行修改成自己喜欢的样式啊!例如,如果你的系统的空间够大,并且担心除错以及黑客的问题,那么可以:

  • 将 rotate 4 改成 rotate 9 左右,以保存较多的备份文件。不过如果已经加上 dateext 的参数,那这个项目 就不用更动了!
  • 大部分的登录档不需要 compress!但是空间太小就需要 compress !尤其是很占硬盘空间的 httpd 更需 要 compress 的!

好了,上面我们大致介绍了 /var/log/wtmp 这个文件的设定,现在你知道了 logrotate.conf 的设定语法是:

登录文件的绝对路径文件名 ... {
    个别的参数设定值,如 monthly, compress 等等
}

底下我们再以 /etc/logrotate.d/syslog 这个轮替 rsyslog.service 服务的文件,来看看该如何设定他的 rotate 呢?

[root@study ~]# vim /etc/logrotate.d/syslog 
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    missingok
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

在上面的语法当中,我们知道正确的 logrotate 的写法为:

  • 文件名:被处理的登录文件绝对路径文件名写在前面,可以使用空格符分隔多个登录文件;
  • 参数:上述档名进行轮替的参数使用 { } 包括起来;
  • 执行脚本:可呼叫外部指令来进行额外的命令下达,这个设定需与 sharedscripts .... endscript 设定合用才行。至于可用的环境为:

    • prerotate:在启动 logrotate 之前进行的指令,例如修改登录文件的属性等动作;
    • postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务!
    • Prerotate 与 postrotate 对于已加上特殊属性的文件处理上面,是相当重要的执行程序!

那么 /etc/logrotate.d/syslog 内设定的 5 个文件的轮替功能就变成了:

  • 该设定只对 /var/log/ 内的 cron, maillog, messages, secure, spooler 有效;
  • 登录档轮替每周一次、保留四个、且轮替下来的登录档不进行压缩(未更改默认值);
  • 轮替完毕后 (postrotate) 取得 syslog 的 PID 后,以 kill -HUP 重新启动 syslogd

假设我们有针对 /var/log/messages 这个文件增加 chattr +a 的属性时, 依据 logrotate 的工作原理, 我们知道,这个 /var/log/messages 将会被更名成为 /var/log/messages.1 才是。但是由于加上这个 +a 的参数啊,所以更名是不可能成功的! 那怎么办呢?就利用 prerotate 与 postrotate 来进行登录档轮替前、后所需要作的动作啊! 果真如此时,那么你可以这样修改一下这个文件喔!

[root@study ~]# vim /etc/logrotate.d/syslog     
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    prerotate
        /usr/bin/chattr -a /var/log/messages
    endscript
#    missingok
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /usr/bin/chattr +a /var/log/messages
    endscript
}

看到否?就是先给他去掉 a 这个属性,让登录文件 /var/log/messages 可以进行轮替的动作,然后执行了轮替之后,再给他加入这个属性!请特别留意的是,那个 /bin/kill -HUP ... 的意义,这一行的目的在于将系统的 rsyslogd 重新以其参数档 (rsyslog.conf) 的资料读入一次!也可以想成是 reload 的意思啦!由于我们建立了一个新的空的记录文件,如果不执行此一行来重新启动服务的话,那么记录的时候将会发生错误!

18.3.2 实际测试 logrotate 的动作

好了,设定完成之后,我们来测试看看这样的设定是否可行呢?给他执行底下的指令:

[root@study ~]# logrotate [-vf] logfile
选项与参数:
-v :启动显示模式,会显示 logrotate 运作的过程喔!
-f :不论是否符合配置文件的数据,强制每个登录档都进行 rotate 的动作!


#范例一:执行一次 logrotate 看看整个流程为何?
[root@study ~]# logrotate -v /etc/logrotate.conf 
reading config file /etc/logrotate.conf  <--读取主要配置文件
including /etc/logrotate.d      <--呼叫外部的设定
reading config file chrony      <--就是外部设定!
....
Handling 17 logs    <--共有 17 个登录文件被记录
....
rotating pattern: /var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
 weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/cron
  log does not need rotating
considering log /var/log/maillog
  log does not need rotating
considering log /var/log/messages    <--开始处理 messages
  log does not need rotating        <--因为时间未到,不需要更动!
considering log /var/log/secure
  log does not need rotating
considering log /var/log/spooler
  log does not need rotating
....



#范例二:强制进行 logrotate 的动作
[root@study ~]# logrotate -vf /etc/logrotate.conf 
......
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
 forced from command line (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/cron
  log needs rotating
considering log /var/log/maillog
  log needs rotating
considering log /var/log/messages
  log needs rotating
considering log /var/log/secure
  log needs rotating
considering log /var/log/spooler
  log needs rotating
rotating log /var/log/cron, log->rotateCount is 4
dateext suffix '-20191110'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
rotating log /var/log/maillog, log->rotateCount is 4
dateext suffix '-20191110'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
rotating log /var/log/messages, log->rotateCount is 4
dateext suffix '-20191110'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
......
#整个 rotate 的动作就是这样一步一步进行的
[root@study ~]# ll /var/log/messages*; lsattr /var/log/messages*
-rw-------. 1 root root     274 11月 10 16:10 /var/log/messages
-rw-------. 1 root root  730417 10月 20 03:20 /var/log/messages-20191020
-rw-------. 1 root root 1259612 10月 28 13:50 /var/log/messages-20191028
-rw-------. 1 root root 1032952 11月  3 19:30 /var/log/messages-20191103
-rw-------. 1 root root 1103761 11月 10 16:02 /var/log/messages-20191110
-----a---------- /var/log/messages    <--主动加入 a 的隐藏属性!
---------------- /var/log/messages-20191020
---------------- /var/log/messages-20191028
---------------- /var/log/messages-20191103
---------------- /var/log/messages-20191110

上面那个 -f 具有『强制执行』的意思,如果一切的设定都没有问题的话,那么理论上,你的 /var/log 这个目录就会起变化啰!而且应该不会出现错误讯息才对!

由于 logrotate 的工作已经加入 crontab 里头了!所以现在每天系统都会自动的给他查看 logrotate! 不用担心!只是要注意一下那个 /var/log/messages 里头是否常常有类似底下的字眼:

Aug 20 01:45:34 study rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="2145" x-info="http://www.rsyslog.com"] rsyslogd was HUPed

这说明的是 rsyslogd 重新启动的时间啦 (就是因为 /etc/logrotate.d/syslog 的设定之缘故!) 底下我们来进行一些例题的练习,让你更详细的了解 logrotate 的功用啊!

自定义登录文件的轮替功能

假设前提是这样的,前一小节当中,假设你已经建立了 /var/log/admin.log 这个文件,现在,你想要将该文件加上 +a 这个隐藏标签,而且设定底下的相关信息:

  • 登录档轮替一个月进行一次;
  • 该登录档若大于 10MB 时,则主动进行轮替,不需要考虑一个月的期限;
  • 保存五个备份文件;
  • 备份文件需要压缩

那你可以怎么样设定呢?很简单啊!看看底下的动作吧!

#先建立 +a 这个属性啊!
[root@study ~]# chattr +a /var/log/admin.log 
[root@study ~]# lsattr /var/log/admin.log 
-----a---------- /var/log/admin.log
[root@study ~]# mv /var/log/admin.log /var/log/admin.log.1
mv: 无法将"/var/log/admin.log" 移动至"/var/log/admin.log.1": 不允许的操作
#这里确定了加入 a 的隐藏属性!所以 root 无法移动此登录档!


#开始建立 logrotate 的配置文件,增加一个文件在 /etc/logrotate.d 内就对了
[root@study ~]# vim /etc/logrotate.d/admin
#This is confinguration is from xiaoqi 2019/11/10
/var/log/admin.log{
    monthly        <--每个月进行一次
    size=10M    <--件容量大于 10M 则开始处置
    rotate 5    <--保留五个!
    compress    <--进行压缩工作!
    sharedscripts
        /usr/bin/chattr -a /var/log/admin.log
    endscript
    sharedscripts
    postrotate
        /bin/kill -HUB `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /usr/bin/chattr +a /var/log/admin.log
    endscript
}


#3.测试一下 logrotate 相关功能的信息显示:
[root@study ~]# logrotate -v /etc/logrotate.conf 
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file admin
....
rotating pattern: /var/log/admin.log  10485760 bytes (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/admin.log
  log does not need rotating
not running prerotate script, since no logs will be rotated
not running postrotate script, since no logs were rotated
#因为还不足一个月,文件也没有大于 10M,所以不需进行轮替!


#4.测试一下强制 logrotate 与相关功能的信息显示:
reading config file /etc/logrotate.d/admin

Handling 1 logs

rotating pattern: /var/log/admin.log  forced from command line (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/admin.log
  log needs rotating
rotating log /var/log/admin.log, log->rotateCount is 5
dateext suffix '-20191110'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/admin.log.5.gz to /var/log/admin.log.6.gz (rotatecount 5, logstart 1, i 5), 
old log /var/log/admin.log.5.gz does not exist
renaming /var/log/admin.log.4.gz to /var/log/admin.log.5.gz (rotatecount 5, logstart 1, i 4), 
old log /var/log/admin.log.4.gz does not exist
renaming /var/log/admin.log.3.gz to /var/log/admin.log.4.gz (rotatecount 5, logstart 1, i 3), 
old log /var/log/admin.log.3.gz does not exist
renaming /var/log/admin.log.2.gz to /var/log/admin.log.3.gz (rotatecount 5, logstart 1, i 2), 
old log /var/log/admin.log.2.gz does not exist
renaming /var/log/admin.log.1.gz to /var/log/admin.log.2.gz (rotatecount 5, logstart 1, i 1), 
old log /var/log/admin.log.1.gz does not exist
renaming /var/log/admin.log.0.gz to /var/log/admin.log.1.gz (rotatecount 5, logstart 1, i 0), 
old log /var/log/admin.log.0.gz does not exist
log /var/log/admin.log.6.gz doesn't exist -- won't try to dispose of it
running prerotate script
fscreate context set to system_u:object_r:var_log_t:s0
renaming /var/log/admin.log to /var/log/admin.log.1
running postrotate script
compressing log with: /bin/gzip


[root@study ~]# lsattr /var/log/admin.log* 
-----a---------- /var/log/admin.log
---------------- /var/log/admin.log.1.gz <==有压缩过喔!

看到了吗?透过这个方式,我们可以建立起属于自己的 logrotate 配置文件案,很简便吧!尤其是要注意的, /etc/rsyslog.conf 与 /etc/logrotate.d/* 文件常常要搭配起来,例如刚刚我们提到的两个案例中所建立的 /var/log/admin.log 就是一个很好的例子 建立后,还要使用 logrotate 来轮替啊!

18.3 systemd-journald.service 简介

现在有了 systemd 之后,由于这玩意儿是核心唤醒的,然后又是第一支执行的软件,它可以主动呼叫 systemd-journald 来协助记载登录文件因此在开机过程中的所有信息,包括启动服务与服务若启动失败的情况等等,都可以直接被记录到 systemd-journald 里头去!

不过 systemd-journald 由于是使用于内存的登录文件记录方式,因此重新启动过后,开机前的登录文件信息当然就不会被记载了。为此,我们还是建议启动 rsyslogd 来协助分类记录!也就是说,systemd-journald 用来管理与查询这次开机后的登录信息,而 rsyslogd 可以用来记录以前及现在的所以数据到磁盘文件中,方便未来进行查询喔!

虽然 systemd-journald 所记录的数据其实是在内存中,但是系统还是利用文件的型态将它记录到 /run/log/ 底下! 不过我们从前面几章也知道, /run 在 CentOS 7 其实是内存内的数据,所以重新启动过后,这个 /run/log 底下的数据当然就被刷新,旧的当然就不再存在了!

18.3.1 使用 journalctl 观察登录信息

那么 systemd-journald.service 的数据要如何叫出来查阅呢?很简单!就透过 journalctl 即可!让我们来瞧瞧这个指令可以做些什么事?

[root@study ~]# journalctl [-nrpf] [--since TIME] [--until TIME] _optional
选项与参数:
预设会秀出全部的 log 内容,从旧的输出到最新的讯息-n :秀出最近的几行的意思~找最新的信息相当有用
-r :反向输出,从最新的输出到最旧的数据
-p :秀出后面所接的讯息重要性排序!请参考前一小节的 rsyslogd 信息
-f :类似 tail -f 的功能,持续显示 journal 日志的内容(实时监测时相当有帮助!) 
--since --until:设定开始与结束的时间,让在该期间的数据输出而已 
_SYSTEMD_UNIT=unit.service :只输出 unit.service 的信息而已
_COMM=bash :只输出与 bash 有关的信息
_PID=pid :只输出 PID 号码的信息
_UID=uid :只输出 UID 为 uid 的信息
SYSLOG_FACILITY=[0-23] :使用 syslog.h 规范的服务相对序号来呼叫出正确的数据!



#范例一:输出目前系统中所有的 journal 日志数据
[root@study log]# journalctl 
-- Logs begin at 六 2019-11-09 18:02:26 CST, end at 日 2019-11-10 17:10:02 CST. --
11月 09 18:02:26 study.centos.xiaoqi systemd-journal[88]: Runtime journal is using 6.2M (max allowed 49.6M, trying 
11月 09 18:02:26 study.centos.xiaoqi kernel: Initializing cgroup subsys cpuset
11月 09 18:02:26 study.centos.xiaoqi kernel: Initializing cgroup subsys cpu
11月 09 18:02:26 study.centos.xiaoqi kernel: Initializing cgroup subsys cpuacct
11月 09 18:02:26 study.centos.xiaoqi kernel: Linux version 3.10.0-327.el7.x86_64 (builder@kbuilder.dev.centos.org) 
11月 09 18:02:26 study.centos.xiaoqi kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapp
11月 09 18:02:26 study.centos.xiaoqi kernel: Disabled fast string operations
11月 09 18:02:26 study.centos.xiaoqi kernel: e820: BIOS-provided physical RAM map:
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009f3ff] usable
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x000000000009f400-0x000000000009ffff] reserved
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x0000000000100000-0x000000003feeffff] usable
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x000000003fef0000-0x000000003fefefff] ACPI data
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x000000003feff000-0x000000003fefffff] ACPI NVS
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x000000003ff00000-0x000000003fffffff] usable
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x00000000f0000000-0x00000000f7ffffff] reserved
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec0ffff] reserved
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
11月 09 18:02:26 study.centos.xiaoqi kernel: BIOS-e820: [mem 0x00000000fffe0000-0x00000000ffffffff] reserved


#范例二:(1)仅显示出 2019/11/10 整天以及(2)仅今天及(3)仅昨天的日志数据内容
[root@study log]# journalctl --since "2019-11-09 00:00:00" --until "2019-11-10 00:00:00"
[root@study log]# journalctl --since today
[root@study log]# journalctl --since yesterday --until today


#范例三:只找出 crond.service 的数据,同时只列出最新的 10 笔即可
[root@study log]# journalctl _SYSTEMD_UNIT=crond.service -n 10
-- Logs begin at 六 2019-11-09 18:02:26 CST, end at 日 2019-11-10 17:20:01 CST. --
11月 09 18:01:22 study.centos.xiaoqi crond[1464]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 36% if used.
11月 09 18:01:24 study.centos.xiaoqi crond[1464]: (CRON) INFO (running with inotify support)


#范例四:找出 su, login 执行的登录档,同时只列出最新的 10 笔即可
[root@study log]# journalctl _COMM=su _COMM=login -n 10


#范例五:找出讯息严重等级为错误 (error) 的讯息!
[root@study log]# journalctl -p err
-- Logs begin at 六 2019-11-09 18:02:26 CST, end at 日 2019-11-10 17:25:04 CST. --
11月 09 18:02:27 study.centos.xiaoqi kernel: sd 0:0:0:0: [sda] Assuming drive cache: write through
11月 09 18:02:33 study.centos.xiaoqi systemd[1]: [/etc/systemd/system/backup.timer:7] Failed to parse timer value, 
11月 09 18:02:38 study.centos.xiaoqi kernel: piix4_smbus 0000:00:07.3: Host SMBus controller not enabled!
11月 09 18:02:39 study.centos.xiaoqi kernel: intel_rapl: no valid rapl domains found in package 0
11月 09 18:01:24 study.centos.xiaoqi systemd[1]: Failed to start Crash recovery kernel arming.


#范例六:找出跟登录服务 (auth, authpriv) 有关的登录文件讯息
[root@study log]# journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10

基本上,有 journalctl 就真的可以搞定你的讯息数据!全部的资料都在这里面 再来假设一下,你想要了解到登录档的实时变化, 那又该如何处置呢?现在,请开两个终端机,让我们来处理处理!

#第一个终端机,请使用底下的方式持续侦测系统!
[xiaoqi@study log]$ journalctl -f

#第二号终端机,使用底下的方式随便发一封 email 给系统上的账号!
[root@study ~]# echo "Testing" | mail -s 'test' xiaoqi

如果你有一些必须要侦测的行为,可以使用这种方式来实时了解到系统出现的讯息 而取消 journalctl -f 的方法,就是 [crtl]+c!

logger 指令的应用

上面谈到的是叫出登录档给我们查阅,那换个角度想,『如果你想要让你的数据储存到登录文件当中』 呢?那该如何是好? 这时就得要使用 logger 这个好用的家伙了!这个家伙可以传输很多信息,不过,我们只使用最简单的本机信息传递 更多的用法就请您自行 man logger!

[root@study ~]# logger [-p 服务名称.等级] "讯息"
选项与参数:
服务名称.等级 :这个项目请参考 rsyslogd 的本章后续小节的介绍;


#范例一:指定一下,让 dmtsai 使用 logger 来传送数据到登录文件内
[root@study ~]# logger -p user.info "I will check logger command"
[root@study ~]# journalctl SYSLOG_FACILITY=1 -n 3
-- Logs begin at 六 2019-11-09 18:02:26 CST, end at 日 2019-11-10 18:47:16 CST. --
11月 10 16:37:39 study.centos.xiaoqi dbus[2749]: avc:  received setenforce notice (enforcing=0)
11月 10 16:37:39 study.centos.xiaoqi dbus[2741]: avc:  received setenforce notice (enforcing=0)
11月 10 18:47:16 study.centos.xiaoqi root[27883]: I will check logger command

现在,让我们来瞧一瞧,如果我们之前写的 backup.service 服务中,如果使用手动的方式来备份,亦即是使用 "/backups/backup.sh log" 来执行备份时,那么就透过 logger 来记录备份的开始与结束的时间!该如何是好呢?这样作看看!

[root@study ~]# vim /backups/backup.sh 
#!/bin/bash

if [ "${1}" == "log" ]; then
    logger -p syslog.info "backup.sh is starting"
fi

source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%y-%m-%d).tar.gz"
[ ! -d /backups  ] && mkdir /backups
tar -zcf ${target} ${source} &> /backups/backup.log

if [ "${1}" == "log" ]; then
    logger -p syslog.info "backup.sh is finished"
fi



[root@study ~]# /backups/backup.sh log
[root@study ~]# journalctl SYSLOG_FACILITY=5 -n 3
-- Logs begin at 六 2019-11-09 18:02:26 CST, end at 日 2019-11-10 18:55:45 CST. --
11月 09 18:02:35 study.centos.xiaoqi systemd-journald[88]: Received SIGTERM from PID 1 (systemd).
11月 10 18:55:27 study.centos.xiaoqi root[28162]: backup.sh is starting
11月 10 18:55:45 study.centos.xiaoqi root[28174]: backup.sh is finished

透过这个玩意儿,我们也能够将数据自行处置到登录文件当中啰!

保存 journal 的方式

再强调一次,这个 systemd-journald.servicd 的讯息是不会放到下一次开机后的,所以,重新启动后,那之前的记录通通会遗失。虽然我们大概都有启动 rsyslogd这个服务来进行后续的登录档放置,不过如果你比较喜欢 journalctl 的存取方式,那么可以将这些数据储存下来喔!

基本上,systemd-journald.service 的配置文件主要参考 /etc/systemd/journald.conf 的内容,详细的参数你可以参考 man 5 journald.conf 的资料。因为预设的情况底下,配置文件的内容应该已经符合我们的需求,所以这边鸟哥就不再修改配置文件了。只是如果想要保存你的 journalctl 所读取的登录档,那么就得要建立一个 /var/log/journal 的目录,并且处理一下该目录的权限,那么未来重新启动 systemd-journald.service 之后,日志登录文件就会主动的复制一份到 /var/log/journal 目录下!

#1.先处理所需要的目录与相关权限设定
[root@study ~]# mkdir /var/log/journal
[root@study ~]# chown root:systemd-journal /var/log/journal/
[root@study ~]# chmod 2775 /var/log/journal/


#2.重新启动 systemd-journald 并且观察备份的日志数据!
[root@study ~]# systemctl status systemd-journald.service 
[root@study ~]# ll /var/log/journal/
总用量 0
drwxr-sr-x. 2 root systemd-journal 27 11月 10 19:05 bd3b89df84bd403a843d83220c2e2448

你得要注意的是,因为现在整个日志登录文件的容量会持续长大,因此你最好还是观察一下你系统能用的总容量喔!避免不小心文件系统的容量被灌爆!此外,未来在 /run/log 底下就没有相关的日志可以观察了!因为移动到 /var/log/journal 底下来!

其实既然我们还有 rsyslog.service 以及 logrotate 的存在,因此这个 systemd-journald.service 产生的登录档,个人建议最好还是放置到 /run/log 的内存当中,以加快存取的速度!而既然 rsyslog.service 可以存放我们的登录档,似乎也没有必要再保存一份 journal 登录文件到系统当中就是了。单纯的建议!如何处理,依照您的需求即可喔!

最后修改:2019 年 11 月 10 日 10 : 33 PM

发表评论