当前位置: 首页 > news >正文

【BASH】回顾与知识点梳理(三十六)

【BASH】回顾与知识点梳理 三十六

    • 三十六. 认识与分析登录档
      • 36.1 什么是登录档
        • CentOS 7 登录档简易说明
          • 登录档的重要性
          • Linux 常见的登录档档名
          • 登录档所需相关服务 (daemon) 与程序
          • CentOS 7.x 使用 systemd 提供的 journalctl 日志管理
        • 登录档内容的一般格式
      • 36.2 rsyslog.service :记录登录文件的服务
        • rsyslog.service 的配置文件:/etc/rsyslog.conf
          • 服务名称
          • 讯息等级
          • 讯息记录的文件名或装置或主机
          • 服务、daemon 与函数名称
          • rsyslog.conf 语法练习
          • CentOS 7.x 预设的 rsyslog.conf 内容
          • 自行增加登录文件文件功能
        • 登录档的安全性设置
        • 登录档服务器的设定
      • 36.3 登录档的轮替(logrotate)
        • logrotate 的配置文件
        • 实际测试 logrotate 的动作
        • 自定义登录文件的轮替功能
      • 36.4 systemd-journald.service 简介
        • 使用 journalctl 观察登录信息
        • logger 指令的应用
        • 保存 journal 的方式
      • 36.5 分析登录档
        • CentOS 预设提供的 logwatch

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

三十六. 认识与分析登录档

当你的 Linux 系统出现不明原因的问题时,很多人都告诉你,你要查阅一下登录文件才能够知道系统出了什么问题了,所以说, 了解登录档是很重要的事情呢。登录文件可以记录系统在什么时间、哪个主机、哪个服务、出现了什么讯息等信息, 这些信息也包括用户识别数据、系统故障排除须知等信息。如果你能够善用这些登录文件信息的话,你的系统出现错误时, 你将可以在第一时间发现,而且也能够从中找到解决的方案,而不是昏头转向的乱问人呢。 此外,登录文件所记录的信息量是非常大的,要人眼分析实在很困难。此时利用 shell script 或者是其他软件提供的分析工具来处理复杂的登录档,可以帮助你很多很多喔!

36.1 什么是登录档

详细而确实的分析以及备份系统的登录文件』是一个系统管理员应该要进行的任务之一。 那么什么是登录档呢?简单的说,就是记录系统活动信息的几个文件, 例如:何时、何地 (来源 IP)、何人(什么服务名称)、做了什么动作 (讯息登录啰)。 换句话说就是:记录系统在什么时候由哪个程序做了什么样的行为时,发生了何种的事件等等

CentOS 7 登录档简易说明

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

登录档的重要性
  • 解决系统方面的错误
  • 解决网络服务的问题
  • 过往事件记录簿

所以我们常说『自助者天助』是真的啦!你可以透过 (1)察看屏幕上面的错误讯息与 (2)登录文件的错误信息,几乎可以解决大部分的 Linux 问题!

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

更多登录档信息可查看CHAPTER 1 CentOS的日志系统(日志文件)

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

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

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

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

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

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

  • systemd-journald.service:最主要的讯息收受者,由 systemd 提供的;
  • 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 ~]# cat /var/log/secure
Aug 17 18:38:06 study login: pam_unix(login:session): session opened for user root by LOGIN(uid=0)
Aug 17 18:38:06 study login: ROOT LOGIN ON tty1
...
|--日期/时间---|-host-|-服务与相关函数-|-----------讯息说明------>

我们拿第一笔数据 (共两行) 来说明好了,该资料是说:『在 08/17 的 18:38 左右,在名为 study 的这部主机系统上,由 login 这个程序产生的讯息,内容显示 root 在 tty1 登入了,而相关的权限给予是透过 pam_unix 模块处理的 (共两行数据)。』有够清楚吧!

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

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

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

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

[root@study ~]# ps aux | grep rsyslog
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 750 0.0 0.1 208012 4732 ? Ssl Aug17 0:00 /usr/sbin/rsyslogd -n
# 瞧!确实有启动的!daemon 执行档名为 rsyslogd 喔!
[root@study ~]# systemctl status rsyslog.service
rsyslog.service - System Logging ServiceLoaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled)Active: active (running) since Mon 2015-08-17 18:37:58 CST; 2 days ago
Main PID: 750 (rsyslogd)CGroup: /system.slice/rsyslog.service└─750 /usr/sbin/rsyslogd -n
# 也有启动这个服务,也有预设开机时也要启动这个服务!OK!正常没问题!!

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在用户层级所产生的信息,例如后续会介绍到的用户使用
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 』类型的服务了。我们可以将这个概念绘制如底下的图示来理解:
在这里插入图片描述
为了让不同的信息放置到不同的文件当中,好让我们分门别类的进行登录档的管理, 所以啰,将各种类别的服务之登录文件,记录在不同的文件里面,就是我们 /etc/rsyslog.conf 所要作的规范了!

讯息等级

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

等级数值等级名称说明
none不需登录等级,忽略掉某些服务的信息
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.vbird.tsai 当然啦,要对方主机也能支持才行!
  • *:代表『目前在在线的所有人』,类似 wall 这个指令的意义!
服务、daemon 与函数名称

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

项目分类说明
syslog函数这个是 Linux 核心所提供的登录档设计指引,所有的要求大概都写入道一个名为 syslog.h 的头文件案中。如果你想要开发与登录文件有关的软件, 那你就得要依循这个 syslog 函数的要求去设计才行!可以使用 man 3 syslog 去查询一下相关的数据!
rsyslogddaemon为了要达成实际上进行讯息的分类所开发的一套软件,所以,这就是最基本的 daemon 程序!
rsyslog.service服务为了加入 systemd 的控制,因此 rsyslogd 的开发者设计的启动服务脚本设定!
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,coron!=warn /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
使用『,』分隔时,那么等级只要接在最后一个即可,如果是以『;』来分的话, 那么就需要将服务与等级都写上去啰!这样会设定了吧!

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

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

# 来自 CentOS 7.x 的相关资料
[root@study ~]# vim /etc/rsyslog.conf
1 #kern.* /dev/console
2 *.info;mail.none;authpriv.none;cron.none /var/log/messages
3 authpriv.* /var/log/secure
4 mail.* -/var/log/maillog
5 cron.* /var/log/cron
6 *.emerg :omusrmsg:*
7 uucp,news.crit /var/log/spooler
8 local7.* /var/log/boot.log

上面总共仅有 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) ,等到数据量够大了才一次性的将所有数据都填入磁盘内,这样将有助于登录文件的存取性能。
只不过由于讯息是暂存在内存内,因此若不正常关机导致登录信息未回填到登录档中,可能会造成部分数据的遗失。

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

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

# 1. 先设定好所要建立的文件设置!
[root@study ~]# vim /etc/rsyslog.conf
# Add by VBird 2015/08/19 <==再次强调,自己修改的时候加入一些说明
*.info /var/log/admin.log <==有用的是这行啦!
# 2. 重新启动 rsyslogd 呢!
[root@study ~]# systemctl restart rsyslog.service
[root@study ~]# ll /var/log/admin.log
-rw-r--r--. 1 root root 325 Aug 20 00:54 /var/log/admin.log
# 瞧吧!建立了这个登录档出现啰!

登录档的安全性设置

好了,由上一个小节里面我们知道了 rsyslog.conf 的设定,也知道了登录档内容的重要性了, 所以,如果幻想你是一个很厉害的黑客,想利用他人的计算机干坏事,然后又不想留下证据, 你会怎么作?对啦!就是离开的时候将屁股擦干净,将所有可能的讯息都给他抹煞掉, 所以第一个动脑筋的地方就是登录档的清除工作啦~ 如果你的登录档不见了,那该怎办?

有没有办法防止登录档被删除?或者是被 root 自己不小心变更呢?有呀!拔掉网络线或电源线就好了……呵呵! 别担心,基本上,我们可以透过一个隐藏的属性来设定你的登录档,成为『 只可以增加数据,但是不能被删除 』的状态,那么或许可以达到些许的保护!不过,如果你的 root 账号被破解了,那么底下的设定还是无法保护的,因为你要记得『 root 是可以在系统上面进行任何事情的 』,因此,请将你的 root 这个账号的密码设定的安全一些!千万不要轻忽这个问题呢!

为什么登录档还要防止被自己 (root) 不小心所修改过呢? 鸟哥在教 Linux 的课程时,我的学生常常会举手说:『老师,我的登录文件不能记录信息了!糟糕!是不是被入侵了啊?』 怪怪!明明是计算机教室的主机,使用的是 Private IP 而且学校计中还有抵挡机制,不可能被攻击吧? 查询了才知道原来同学很喜欢使用『 :wq 』来离开 vim 的环境,但是 rsyslogd 的登录档只要『被编辑过』就无法继续记录! 所以才会导致不能记录的问题。此时你得要 (1)改变使用 vim 的习惯; (2)重新启动 rsyslog.service 让他再继续提供服务才行喔!

既然如此,那么我们就来处理一下隐藏属性的东东吧!我们谈到过 lsattr 与chattr这两个东西啦!如果将一个文件以 chattr 设定 i 这个属性时,那么该文件连 root 都不能杀掉!而且也不能新增数据,嗯!真安全!但是,如此一来登录文件的功能岂不是也就消失了? 因为没有办法写入呀!所以啰,我们要使用的是 a 这个属性!你的登录文件如果设定了这个属性的话,那么 他将只能被增加,而不能被删除!嗯! 这个项目就非常的符合我们登录档的需求啦!因此,你可以这样的增加你的登录文件的隐藏属性。

[root@study ~]# chattr +a /var/log/admin.log
[root@study ~]# lsattr /var/log/admin.log
-----a---------- /var/log/admin.log

不过,也因为这个 +a 的属性让该文件无法被删除与修改,所以啰,当我们进行登录文件轮替时(logrotate) ,将会无法移动该登录档的档名呢!所以会造成很大的困扰。这个困扰虽然可以使用logrotate 的配置文件来解决,但是,还是先将登录档的 +a 旗标拿掉吧!

登录档服务器的设定

我们在之前稍微提到的,在 rsyslog.conf 文件当中,可以将登录数据传送到打印机或者是远程主机上面去。这样做有什么意义呢? 如果你将登录信息直接传送到打印机上面的话,那么万一不小心你的系统被 cracker 所入侵, 他也将你的 /var/log/ 砍掉了,怎么办?没关系啊!反正你已经将重要数据直接以打印机记录起来了, 嘿嘿!他是无法逃开的啦!^_^

再想象一个环境,你的办公室内有十部 Linux 主机,每一部负责一个网络服务, 你为了要了解每部主机的状态,因此,你常常需要登入这十部主机去查阅你的登录档~ 哇!光用想的,每天要进入十部主机去查数据,想到就烦~没关系~这个时候我们可以让某一部主机当成 『登录文件服务器』,用他来记录所有的十部 linux 主机的信息,嘿嘿!这样我就直接进入一部主机就可以了! 省时又省事,真方便~

那要怎么达到这样的功能呢?很简单啦,我们 CentOS 7.x 预设的 rsyslogd 本身就已经具有这个登录文件服务器的功能了, 只是默认并没有启动该功能而已。你可以透过 man rsyslogd 去查询一下相关的选项就能够知道啦!既然是登录档服务器,那么我们的 Linux 主机当然会启动一个埠口来监听了,那个预设的埠口就是 UDP 或 TCP 的 port 514 喔!
在这里插入图片描述
如上图所示,服务器会启动监听的埠口,客户端则将登录档再转出一份送到服务器去。 而既然是登录档『服务器』,所以当然有服务器与客户端 (client) 啰!这两者的设定分别是这样的:
server:

# 1. Server 端:修改 rsyslogd 的启动配置文件,在 /etc/rsyslog.conf 内!
[root@study ~]# vim /etc/rsyslog.conf
# 找到底下这几行:
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
# 上面的是 UDP 埠口,底下的是 TCP 埠口!如果你的网络状态很稳定,就用 UDP 即可。
# 不过,如果你想要让数据比较稳定传输,那么建议使用 TCP 啰!所以修改底下两行即可!
$ModLoad imtcp
$InputTCPServerRun 514
# 2. 重新启动与观察 rsyslogd 喔!
[root@study ~]# systemctl restart rsyslog.service
[root@study ~]# netstat -ltnp | grep syslog
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 2145/rsyslogd
tcp6 0 0 :::514 :::* LISTEN 2145/rsyslogd
# 嘿嘿!你的登录文件主机已经设定妥当啰!很简单吧!

client 端的设定就简单多了!只要指定某个信息传送到这部主机即可! 举例来说,我们的登录档服务器 IP 为 192.168.1.100 ,而 client 端希望所有的数据都送给主机, 所以,可以在/etc/rsyslog.conf 里面新增这样的一行:
client:

[root@study ~]# vim /etc/rsyslog.conf
*.* @@192.168.1.100
#*.* @192.168.1.100 # 若用 UDP 传输,设定要变这样!
[root@study ~]# systemctl restart rsyslog.service

再重新启动 rsyslog.service 后,立刻就搞定了!而未来主机上面的登录文件当中,每一行的『主机名』就会显示来自不同主机的信息了。

36.3 登录档的轮替(logrotate)

rsyslogd 利用的是 daemon 的方式来启动的,当有需求的时候立刻就会被执行的,但是 logrotate 却是在规定的时间到了之后才来进行登录档的轮替, 所以这个 logrotate 程序当然就是挂在 cron 底下进行的呦!

logrotate 的配置文件

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

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

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

好了,刚刚我们提到 logrotate 的主要功能就是将旧的登录文件移动成旧档, 并且重新建立一个新的空的文件来记录,他的执行结果有点类似底下的图示:
在这里插入图片描述
那么多久进行一次这样的 logrotate 工作呢?这些都记录在 logrotate.conf 里面,我们来看一下预设的 logrotate 的内容吧

[root@study ~]# vim /etc/logrotate.conf
# 底下的设定是 "logrotate 的预设设定值" ,如果个别的文件设定了其他的参数,
# 则将以个别的文件设定为主,若该文件没有设定到的参数则以这个文件的内容为默认值!
weekly <==预设每个礼拜对登录档进行一次 rotate 的工作
rotate 4 <==保留几个登录档呢?预设是保留四个!
create <==由于登录档被更名,因此建立一个新的来继续储存之意!
dateext <==就是这个设定值!可以让被轮替的文件名加上日期作为档名喔!
#compress <==被更动的登录档是否需要压缩?如果登录档太大则可考虑此参数启动
include /etc/logrotate.d
# 将 /etc/logrotate.d/ 这个目录中的所有文件都读进来执行 rotate 的工作!
/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.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
{sharedscriptspostrotate/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || trueendscript
}

在上面的语法当中,我们知道正确的 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
{sharedscriptsprerotate/usr/bin/chattr -a /var/log/messagesendscriptsharedscriptspostrotate/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true/usr/bin/chattr +a /var/log/messagesendscript
}

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

实际测试 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 18 logs <==共有 18 个登录文件被记录
....(中间省略)....
rotating pattern: /var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
weekly (52 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/cronlog does not need rotating
considering log /var/log/mailloglog does not need rotating
considering log /var/log/messages <==开始处理 messageslog does not need rotating <==因为时间未到,不需要更动!
....(底下省略)....
# 范例二:强制进行 logrotate 的动作
[root@study ~]# logrotate -vf /etc/logrotate.conf
....(前面省略)....
rotating log /var/log/messages, log->rotateCount is 52
dateext suffix '-20150820'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
....(底下省略)....
# 看到否?整个 rotate 的动作就是这样一步一步进行的~
[root@study ~]# ll /var/log/messages*; lsattr /var/log/messages
-rw-------. 1 root root 143 Aug 20 01:45 /var/log/messages
-rw-------. 1 root root 167125 Aug 20 01:40 /var/log/messages-20150820
-----a---------- /var/log/messages <==主动加入 a 的隐藏属性啰!

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

由于 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 的设定之缘故!)

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

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

  • 登录档轮替一个月进行一次;
  • 该登录档若大于 10MB 时,则主动进行轮替,不需要考虑一个月的期限;
  • 保存五个备份文件;
  • 备份文件需要压缩
# 1. 先建立 +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: cannot move `/var/log/admin.log' to '/var/log/admin.log.1': Operation not permitted
# 这里确定了加入 a 的隐藏属性!所以 root 无法移动此登录档!# 2. 开始建立 logrotate 的配置文件,增加一个文件在 /etc/logrotate.d 内就对了!
[root@study ~]# vim /etc/logrotate.d/admin
# This configuration is from VBird 2015/08/19
/var/log/admin.log {monthly <==每个月进行一次size=10M <==文件容量大于 10M 则开始处置rotate 5 <==保留五个!compress <==进行压缩工作!sharedscriptsprerotate/usr/bin/chattr -a /var/log/admin.logendscriptsharedscriptspostrotate/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true/usr/bin/chattr +a /var/log/admin.logendscript
}# 3. 测试一下 logrotate 相关功能的信息显示:
[root@study ~]# logrotate -v /etc/logrotate.conf
....(前面省略)....
rotating pattern: /var/log/admin.log 10485760 bytes (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/admin.loglog 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 与相关功能的信息显示:
[root@study ~]# logrotate -vf /etc/logrotate.d/admin
reading config file /etc/logrotate.d/admin
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.loglog needs rotating
rotating log /var/log/admin.log, log->rotateCount is 5
dateext suffix '-20150820'
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 <==有压缩过喔!

36.4 systemd-journald.service 简介

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

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

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

使用 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 ~]# journalctl
-- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 00:01:01 CST. --
Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max
142.4M, leaving 213.6M of free 1.3G, current limit 142.4M).
Aug 17 18:37:52 study.centos.vbird systemd-journal[105]: Runtime journal is using 8.0M (max
142.4M, leaving 213.6M of free 1.3G, current limit 142.4M).
Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpuset
Aug 17 18:37:52 study.centos.vbird kernel: Initializing cgroup subsys cpu
.....(中间省略).....
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19268]: finished 0anacron
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19270]: starting 0yum-hourly.cron
Aug 19 00:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[19274]: finished 0yum-hourly.cron
# 从这次开机以来的所有数据都会显示出来!透过 less 一页页翻动给管理员查阅!资料量相当大!# 范例二:(1)仅显示出 2015/08/18 整天以及(2)仅今天及(3)仅昨天的日志数据内容
[root@study ~]# journalctl --since "2015-08-18 00:00:00" --until "2015-08-19 00:00:00"
[root@study ~]# journalctl --since today
[root@study ~]# journalctl --since yesterday --until today# 范例三:只找出 crond.service 的数据,同时只列出最新的 10 笔即可
[root@study ~]# journalctl _SYSTEMD_UNIT=crond.service -n 10# 范例四:找出 su, login 执行的登录档,同时只列出最新的 10 笔即可
[root@study ~]# journalctl _COMM=su _COMM=login -n 10# 范例五:找出讯息严重等级为错误 (error) 的讯息!
[root@study ~]# journalctl -p err# 范例六:找出跟登录服务 (auth, authpriv) 有关的登录文件讯息
[root@study ~]# journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10
# 更多关于 syslog_facility 的数据,请参考 18.2.1 小节的内容啰!

你想要了解到登录档的实时变化, 那又该如何处置呢?现在,请开两个终端机,让我们来处理处理!

# 第一号终端机,请使用底下的方式持续侦测系统!
[root@study ~]# journalctl -f
# 这时系统会好像卡住~其实不是卡住啦!是类似 tail -f 在持续的显示登录文件信息的!
# 第二号终端机,使用底下的方式随便发一封 email 给系统上的账号!
[root@study ~]# echo "testing" | mail -s 'tset' dmtsai
# 这时,你会发现到第一号终端机竟然一直输出一些讯息吧!没错!这就对了!

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 Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 18:03:17 CST. --
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29710]: starting 0yum-hourly.cron
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29714]: finished 0yum-hourly.cron
Aug 19 18:03:17 study.centos.vbird dmtsai[29753]: I will check logger command

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

[root@study ~]# vim /backups/backup.sh
#!/bin/bash
if [ "${1}" == "log" ]; thenlogger -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 -zcvf ${target} ${source} &> /backups/backup.log
if [ "${1}" == "log" ]; thenlogger -p syslog.info "backup.sh is finished"
fi
[root@study ~]# /backups/backup.sh log
[root@study ~]# journalctl SYSLOG_FACILITY=5 -n 3
Aug 19 18:09:37 study.centos.vbird dmtsai[29850]: backup.sh is starting
Aug 19 18:09:54 study.centos.vbird dmtsai[29855]: 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 restart systemd-journald.service
[root@study ~]# ll /var/log/journal/
drwxr-sr-x. 2 root systemd-journal 27 Aug 20 02:37 309eb890d09f440681f596543d95ec7a

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

36.5 分析登录档

登录档的分析是很重要的!你可以自行以 vim 或者是 journalctl 进入登录文件去查阅相关的信息。而系统也提供一些软件可以让你从登录文件中取得资料, 例如之前谈过的 last, lastlog, dmesg 等等指令。不过,这些数据毕竟都非常的分散,如果你想要一口气读取所有的登录信息, 其实有点困扰的。不过,好在 CentOS 有提供 logwatch 这个登录文件分析程序,你可以藉由该程序来了解登录文件信息。 此外,鸟哥也依据 Red Hat 系统的 journalctl 搭配 syslog 函数写了一支小程序给大家使用喔

CentOS 预设提供的 logwatch

安装

yum install -y logwatch

安装完毕以后,logwatch 就已经写入 cron 的运作当中了!详细的执行方式你可以参考上表中0logwatch 文件内容来处理,未来则每天会送出一封 email 给 root 查阅就是了。因为我们刚刚安装,那可以来分析一下吗?很简单啦!你就直接执行 0logwatch 即可啊!如上表最后一个指令的示意。因为鸟哥的测试机目前的服务很少, 所以产生的信息量也不多,因此执行的速度很快。比较忙的系统信息量比较大,分析过程会花去一小段时间。如果顺利执行完毕,那请用 root 的身份去读一下email 啰!

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

相关文章:

【BASH】回顾与知识点梳理(三十六)

【BASH】回顾与知识点梳理 三十六 三十六. 认识与分析登录档36.1 什么是登录档CentOS 7 登录档简易说明登录档的重要性Linux 常见的登录档档名登录档所需相关服务 (daemon) 与程序CentOS 7.x 使用 systemd 提供的 journalctl 日志管理 登录档内容的一般格式 36.2 rsyslog.servi…...

十三、pikachu之暴力破解

文章目录 1、暴力破解概述2、基于表单的暴力破解3、验证码的绕过3.1 验证码的认证流程3.2 验证码绕过&#xff08;on client&#xff09;3.3 验证码绕过&#xff08;on server&#xff09;3.4 token防爆破&#xff1f; 1、暴力破解概述 “暴力破解”是一攻击具手段&#xff0c;…...

用手势操控现实:OpenCV 音量控制与 AI 换脸技术解析

基于opencv的手势控制音量和ai换脸 HandTrackingModule.py import cv2 import mediapipe as mp import timeclass handDetector():def __init__(self, mode False, maxHands 2, model_complexity 1, detectionCon 0.5, trackCon 0.5):self.mode modeself.maxHands max…...

【leetcode 力扣刷题】移除链表元素 多种解法

移除链表元素的多种解法 203. 移除链表元素解法①&#xff1a;头节点单独判断解法②&#xff1a;虚拟头节点解法③&#xff1a;递归 203. 移除链表元素 题目链接&#xff1a;203.移除链表元素 题目内容&#xff1a; 理解题意&#xff1a;就是单纯的删除链表中所有值等于给定的…...

leetcode503. 下一个更大元素 II 单调栈

思路&#xff1a; 与之前 739、1475 单调栈的问题如出一辙&#xff0c;唯一不同的地方就是对于遍历完之后。栈中元素的处理&#xff0c;之前的栈中元素因无法找到符合条件的值&#xff0c;直接加入vector中。而这里需要再重头遍历一下数组&#xff0c;找是否有符合条件的&…...

Oracle中列的维护

由于商业环境中&#xff0c;数据是不断变化的&#xff0c;客户的需求也是不断变化的&#xff0c;所以当一个表用了一段时间后&#xff0c;其结构就有可能需要变化。 而在Oracle中&#xff0c;提供了alter table这种方式来改变列。 从Oracle9.2版本之后&#xff1a; 如果需要变…...

后端项目开发:分页功能的实现(Mybatis+pagehelper)

分页查询是项目中的常用功能&#xff0c;此处我们基于Mybatis对分页查询进行处理。 引入分页依赖 <!-- pagehelper --> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId>…...

SpringBoot集成Drools

一:简介 规则引擎全称为业务规则管理系统(Business Rule Management System)简称BRMS,主要思想是将应用程序中的业务决策部分分离开来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。 其实就是将计算逻辑写在脚本中,通过Jav…...

React创建组件的三种方式及其区别是什么?

在React中&#xff0c;创建组件的三种主要方式是函数式组件、类组件和使用React Hooks的函数式组件。以下是对每种方式的详细解释以及它们之间的区别&#xff1a; 1、函数式组件&#xff1a; 函数式组件是使用纯粹的JavaScript函数来定义的。它接收一个props对象作为参数&…...

W6100-EVB-PICO进行UDP组播数据回环测试(九)

前言 上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试&#xff0c;那么本章我们进行UDP组播数据回环测试。 什么是UDP组播&#xff1f; 组播是主机间一对多的通讯模式&#xff0c; 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将…...

Qt 阴影边框

阴影边框很常见&#xff0c;诸如360以及其他很多软件都有类似效果&#xff0c;了解CSS3的同学们应该都知道box-shadow&#xff0c;它就是来设定阴影效果的&#xff0c;那么Qt呢&#xff1f;看过一些资料&#xff0c;说是QSS是基于CSS2的&#xff0c;既然如此&#xff0c;box-sh…...

前端面试:【性能优化】页面加载性能、渲染性能、资源优化

嗨&#xff0c;亲爱的前端开发者&#xff01;在今天的Web世界中&#xff0c;用户期望页面加载速度快、交互流畅。因此&#xff0c;前端性能优化成为了至关重要的任务。本文将探讨三个关键方面的性能优化&#xff1a;页面加载性能、渲染性能以及资源优化&#xff0c;以帮助你构建…...

从按下电源键到进入系统,CPU在干什么?

本专栏更新速度较慢&#xff0c;简单讲讲计算机的那些事&#xff0c;简单讲讲那些特别散乱杂的知识&#xff0c;欢迎各位朋友订阅专栏啊 感谢一路相伴的朋友们 浅淡操作系统系列第2篇 目录 通电 保护模式和实模式 内存管理单元MMU 逻辑地址&#xff1f;物理地址&#xff1…...

TypeScript初体验

1.安装编译TS工具包 npm i -g typescript 2. 查看版本号 tsc -v 3.创建ts文件 说明&#xff1a;创建一个index.ts文件 4.TS编译为JS tsc index.ts 5.执行JS代码 node index.js 6.简化TS的步骤 6.1安装 npm i -g ts-node 6.2执行 ts-node index.ts...

基于 Alpine 环境源码构建 alibaba-tengine(阿里巴巴)的 Docker 镜像

About Alpine&#xff08;简介&#xff09; Alpine Linux 是一款极其轻量级的 Linux 发行版&#xff0c;基于 busybox&#xff0c;多被当做 Docker 镜像的底包&#xff08;基础镜像&#xff09;&#xff0c;在使用容器时或多或少都会接触到此系统&#xff0c;本篇文章我们以该镜…...

政府网站定期巡检:构建高效、安全与透明的数字政务

在数字时代&#xff0c;政府网站已不仅仅是一个信息发布窗口&#xff0c;更是政府与公众互动的桥梁、政务服务的主要渠道以及数字化治理的重要平台。因此&#xff0c;确保政府网站的高效运行、信息安全与透明公开就显得尤为重要。在此背景下&#xff0c;定期的网站巡检与巡查成…...

C++信息学奥赛1138:将字符串中的小写字母转换成大写字母

#include<bits/stdc.h> using namespace std; int main() {string arr;// 输入一行字符串getline(cin, arr);for(int i0;i<arr.length();i){if(arr[i]>97 and arr[i]<122){char aarr[i]-32; // 将小写字母转换为大写字母cout<<a; // 输出转换后的字符}els…...

leetcode1475. 商品折扣后的最终价格 【单调栈】

简单题 第一次错误做法 class Solution { public:vector<int> finalPrices(vector<int>& prices) {int n prices.size();stack<int> st;unordered_map<int, int> mp;int i 0;while(i ! prices.size()) {int t prices[i];if (st.empty() || t …...

macOS M1使用TensorFlow GPU加速

本人是在pycharm运行代码&#xff0c;安装了tensorflow版本2.13.0 先运行代码查看有没有使用GPU加速&#xff1a; import tensorflow as tf# Press the green button in the gutter to run the script. if __name__ __main__:physical_devices tf.config.list_physical_dev…...

GNU-gcc编译选项-1

include目录 -I &#xff0c;比如: -I. -I ./Platform/include -I ./Platform/include/prototypes -I ./tpm/include -I ./tpm/include/prototypes -I ./Simulator/include -I ./Simulator/include/prototypes 编译选项 在GCC编译器中&#xff0c;-D是一个编译选项&…...

【DEVOPS】Jenkins使用问题 - 控制台输出乱码

0. 目录 1. 问题描述2. 解决方案3. 最终效果4. 总结 1. 问题描述 部门内部对于Jenkins的使用采取的是Master Slave Work Node的方式&#xff0c;即作为Master节点的Jenkins只负责任务调度&#xff0c;具体的操作由对应的Slave Work Node去执行。 最近团队成员反馈一个问题&a…...

logback-spring.xml

<?xml version"1.0" encoding"UTF-8"?> <configuration> <appender name"stdout" class"ch.qos.logback.core.ConsoleAppender"> <encoder> <springProfile name"dev"> <pattern>%d{…...

华为OD机试之报文重排序【Java源码】

题目描述 对报文进行重传和重排序是常用的可靠性机制&#xff0c;重传缓中区内有一定数量的子报文&#xff0c;每个子报文在原始报文中的顺序已知&#xff0c;现在需要恢复出原始报文。 输入描述 输入第一行为N&#xff0c;表示子报文的个数&#xff0c;0 &#xff1c;N ≤ …...

回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效…...

DPU在东数西算背景下如何赋能下一代算力基础设施 中科驭数在未来网络发展大会论道

以ChatGPT为代表的人工智能大模型的快速发展&#xff0c;对网络信息技术创新发展提出了新的挑战&#xff0c;我国东数西算重大工程也在加速布局。以确定性网络、算力网络为代表的未来网络核心技术&#xff0c;正成为决定未来经济和产业发展的关键。 8月23日&#xff0c;第七届…...

2021年12月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:移动路线 桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。 小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右…...

ArcGIS Serve Windows下用户密码变更导致Server服务无法启动问题

问题&#xff1a; 因未知原因Windows下的Server安装账户密码变更&#xff0c;但是又忘记了密码&#xff0c;导致&#xff0c;Server服务启动失败&#xff0c;错误1069&#xff1a; 解决方法&#xff1a; 在账户管理界面&#xff0c;重置对应的arcgis账户的密码&#xff0c;…...

React 面试题集锦

目录 如果想要在组件第一次加载后获取该组件的dom元素&#xff0c;应当在以下哪个生命周期中进行 React支持的键盘事件是 使用严格模式&#xff08;Strict Mode&#xff09;优点 React 动态引入组件 当使用ReactDOM.unmountComponentAtNode从DOM中卸载组件时 说一下useS…...

xargs命令解决“Argument list too long”

一、xargs命令概述 xargs命令是给其他命令传递参数的一个过滤器&#xff0c;也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数&#xff0c;xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。空格是其默认定界符&#xff0c;管道传递给xargs的输入…...

R语言中<- 的含义

一般语言的赋值是 号&#xff0c;但是 R 语言是数学语言&#xff0c;所以赋值符号与我们数学书上的伪代码很相似&#xff0c;是一个左箭头 <- &#xff1a; 举个例子&#xff1a; a <- 12 b <- 45 print(a b) 以上代码执行结果&#xff1a;57 这个赋值符号是 R …...

知识图谱Neo4j安装到实践全过程

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 在本次实战中&#xff0c;我们将一起完成知识图谱Neo4j安装到实践全过程&#xff0c;探索其中的关系和属性。知识图谱是一种以三元组形式存储的数据结构&#xff0c;由实体、关系和属性组成&#xff0c;能够帮助我们更好地…...

贪心算法:简单而高效的优化策略

在计算机科学中&#xff0c;贪心算法是一种简单而高效的优化策略&#xff0c;用于解决许多组合优化问题。虽然它并不适用于所有问题&#xff0c;但在一些特定情况下&#xff0c;贪心算法能够产生近似最优解&#xff0c;而且计算成本较低。在本文中&#xff0c;我们将深入探讨贪…...

一生一芯6——ubuntu rpm软件安装

ubuntu不支持rpm&#xff0c;需要将rpm软件安装包转成deb进行安装 安装alien sudo apt-get install alien格式转换 sudo alien xxx.rpm 在目录下会生成deb的安装包 软件安装 sudo dpkg -i xxx_amd64.deb 安装完成...

Python练习 函数取列表最小数

练习2&#xff1a;构造一个功能函数&#xff0c;可以解决如下问题&#xff1a; 要求如下&#xff1a; 1&#xff0c;任意输入一个列表&#xff0c;函数可以打印出列表中最小的那个数&#xff0c; 例&#xff1a;输入: 23,56,67,4,17,9 最小数是 &#xff1a;4 方法一: #内置函…...

五种重要的 AI 编程语言

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建3D应用场景 简而言之&#xff1a;决定从哪种语言开始可能会令人生畏。 不用担心&#xff01;本文将解释 AI 中使用的最流行编程语言背后的基础知识&#xff0c;并帮助您决定首先学习哪种语言。对于每种语言&#xff0c;我们将…...

【linux】2 make/Makefile和gitee

文章目录 一、Linux项目自动化构建工具-make/Makefile1.1 背景1.2 实例代码1.3 原理1.4 项目清理 二、linux下第一个小程序-进度条2.1 行缓冲区2.2 进度条 三、git以及gitee总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 一…...

db-gpt安装指南(docker版本)

1 下载源码 下载v0.3.5的源码&#xff0c;截止今天&#xff08;20230823&#xff09;建议安装这个“稳定”版本。 2 构建镜像 依照自己硬件环境&#xff0c;看看是否要调整一下启动参数。 bash docker/build_all_images.sh \ --base-image nvidia/cuda:11.7.1-devel-ubuntu…...

「Java」《深度解析Java Stream流的优雅数据处理》

《深度解析Java Stream流的优雅数据处理》 一、引言1.1 背景1.2 Stream流的意义 二、Stream流的基本概念2.1 什么是Stream流2.2 Stream与传统集合的对比 三、创建Stream流3.1 通过集合创建Stream3.2 使用Arrays和Stream.of创建Stream3.3 从文件和网络流创建Stream 四、 中间操作…...

【云驻共创】华为云之手把手教你搭建IoT物联网应用充电桩实时监控大屏

文章目录 前言1.什么是充电桩2.什么是IOT3.什么是端、边、云、应用协同4.什么是Astro轻应用 一、玩转lOT动态实时大屏&#xff08;线下实际操作&#xff09;1.Astro轻应用说明1.1 场景说明1.2 资费说明1.3 整体流程 2.操作步骤2.1 开通设备接入服务2.2 创建产品2.3 注册设备2.4…...

Hadoop分布式计算与资源调度:打开专业江湖的魔幻之门

文章目录 版权声明一 分布式计算概述1.1 分布式计算1.2 分布式&#xff08;数据&#xff09;计算模式1.3 小结 二 MapReduce概述2.1 分布式计算框架 - MapReduce2.2 MapReduce执行原理2.3 小结 三 YARN概述3.1 YARN & MapReduce3.2 资源调度3.3 程序的资源调度3.4 YARN的资…...

为什么叫源表?源表是如何四象限工作的?

为何称呼为源表&#xff1f; “源”为电压源和电流源&#xff0c;“表”为测量表&#xff1b; “源表”即指一种可作为四象限的电压源或电流源提供精确的电压或电流&#xff0c;同时可同步测量电流值或电压值的测量仪表。&#xff08;恒流源时测电压&#xff0c;恒压源时测电…...

云原生周刊:Kubernetes v1.28 正式发布 | 2023.8.21

开源项目推荐 kurt 一个 Kubernetes 插件&#xff0c;可提供 Kubernetes 集群中重启内容的上下文信息。 Kubean Kubean 是一个基于 kubespray 的 Kubernetes 集群生命周期管理工具。 k8sgpt k8sgpt 是一款用简单的英语扫描 Kubernetes 集群、诊断和分流问题的工具。 它将…...

Git基础——基本的 Git本地操作

本文涵盖了你在使用Git的绝大多数时间里会用到的所有基础命令。学完之后&#xff0c;你应该能够配置并初始化Git仓库、开始或停止跟踪文件、暂存或者提交更改。我们也会讲授如何让Git忽略某些文件和文件模式&#xff0c;如何简单快速地撤销错误操作&#xff0c;如何浏览项目版本…...

PythonJS逆向解密——实现翻译软件+语音播报

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: python 3.8 pycharm 模块使用: requests --> pip install requests execjs --> pip install PyExecJS ttkbootstrap --> pip install ttkbootstrap pyttsx3 --> pip install pyttsx3 第三…...

gPRC与SpringBoot整合教程

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

Hadoop Yarn 配置多队列的容量调度器

文章目录 配置多队列的容量调度器多队列查看 配置多队列的容量调度器 首先&#xff0c;我们进入 Hadoop 的配置文件目录中&#xff08;$HADOOP_HOME/etc/hadoop&#xff09;&#xff1b; 然后通过编辑容量调度器配置文件 capacity-scheduler.xml 来配置多队列的形式。 默认只…...

c语言练习题28:杨氏矩阵

杨氏矩阵 从左到右增加 从上到下增加 思路&#xff1a; 代码&#xff1a; #include<stdio.h> int findNum(int(*arr)[3], int x, int y, int k) {int i 0;int j y - 1;while (i<x&&j>0) {if (arr[i][j] > k) {j--;}else if (arr[i][j] < k) {i;…...

梳理系统学习R语言1-R语言实战-使用ggplot进行高阶绘图

以下为书中代码&#xff0c;会添加一些理解 library("ggplot2") ggplot(datamtcars,aes(xwt,ympg))geom_point()geom_point(pch17,color"blue",size2)geom_smooth(method"lm",color"red",linetype2)labs(title"Automobile Data&…...

测试框架pytest教程(2)-用例依赖库-pytest-dependency

对于 pytest 的用例依赖管理&#xff0c;可以使用 pytest-dependency 插件。该插件提供了更多的依赖管理功能&#xff0c;使你能够更灵活地定义和控制测试用例之间的依赖关系。 Using pytest-dependency — pytest-dependency 0.5.1 documentation 安装 pytest-dependency 插…...

electron软件安装时,默认选择为全部用户安装

后续可能会用electron开发一些工具&#xff0c;包括不限于快速生成个人小程序、开发辅助学习的交互式软件、帮助运维同学一键部署的简易版CICD工具等等。 开发进度&#xff0c;取决于我懒惰的程度。 不过不嫌弃的同学还是可以先关注一波小程序&#xff0c;真的发布工具了&…...