# rsyslog.service 记录登录文件的服务
Linux 的日志文件主要是由 rsyslog.service 在负责,检查该服务是否有启动
[root@study system]# ps aux | grep rsyslog
root 1376 0.0 0.0 216420 7316 ? Ssl Mar17 0:11 /usr/sbin/rsyslogd -n
[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 Tue 2020-03-17 10:49:56 CST; 3 days ago
Docs: man:rsyslogd(8)
http://www.rsyslog.com/doc/
Main PID: 1376 (rsyslogd)
Tasks: 3
CGroup: /system.slice/rsyslog.service
`-1376 /usr/sbin/rsyslogd -n
Mar 17 10:49:55 study.centos.mrcode systemd[1]: Starting System Logging Service...
Mar 17 10:49:56 study.centos.mrcode rsyslogd[1376]: [origin software="rsyslogd" swVersion="8.24.0-38.el7" x-pid="1376" x-info="http://www.rsyslog.com"] start
Mar 17 10:49:56 study.centos.mrcode systemd[1]: Started System Logging Service.
Mar 17 11:07:02 study.centos.mrcode rsyslogd[1376]: [origin software="rsyslogd" swVersion="8.24.0-38.el7" x-pid="1376" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
# 确实在运行,并且是开机启动
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 配置文件 /etc/rsyslog.conf
rsyslogd 的配置文件是 /etc/rsyslog.conf
,可以针对各种服务与信息记录在某些文件的配置,该文件规范了
- 什么服务
- 什么等级
- 需要被记录在哪里(设备或文件)
语法如下
服务名称[.=!]信息等级 信息记录的文件名或设备或主机
# 下面以 mail 服务产生的 info 等级为例
mail.info /var/log/maillog_info
# 这一行含义:mail 服务产生的大于等于 info 等级的信息,都记录到后面的指定文件中
2
3
4
# 服务名称
rsyslogd 主要还是通过 Linux 核心提供的 syslog 相关规范来设置数据的分类,Linux 的 syslog 本身有规范一些服务信息,可以通过这些服务来存储系统的信息。主要认识的服务类型有如下:(可使用 man 3 syslog
或查询 syslog.h 文件来了解)
相对序号 | 服务类别 | 说明 |
---|---|---|
0 | kern(kernel) | 核心产生的信息,大部分是硬件侦测以及核心功能的启用 |
1 | user | 在用户层级所产生的信息。例如后续会介绍到使用 logger 指令来记日志文件的功能 |
2 | 只要与邮件收发有关的信息记录都属于这个 | |
3 | daemon | 主要是系统的服务所产生的信息,例如 systemd |
4 | auth | 主要与认证授权有关的机制,例如 login、ssh、su 等需要账户密码的 |
5 | syslog | syslog 相关协议产生的信息,其实就是 rsyslogd 程序本身产生的信息 |
6 | lpr | 打印相关信息 |
7 | news | 与新闻组服务器有关 |
8 | uucp | Unix to Unix Copy Protocol ,早期用于 unix 系统间的程序数据交换 |
9 | cron | 定时任务 cron/at 等产生信息记录的地方 |
10 | authpriv | 与 auth 类似,但记录较多账户私人的信息,包括 pam 等模块的运行 |
11 | ftp | 与 FTP 通信协议有关信息的输出 |
16~23 | local0~local7 | 保留给本机用户使用的一些日志文件信息,较常与终端机互动 |
上述列出的都是 Linux 核心的 syslog 函数自行制定的服务名称,软件开发商可以通过调用上述服务名称来记录他们的软件日志信息。
比如:sendmail 与 postfix 和 dovecot 都是与邮件有关的软件,这些软件在设计日志文件记录时,都会主动调用 syslog 内的 mail 服务名名称(LOG_MAIL)。所以上述三个服务的信息在 syslog 看来就是 mail 类型的服务了,这个概念如下图所示
另外每种服务所产生的数据量差异很大,比如 mail 的信息就很大,为了让不同的信息放置到不同的文件中,可以使用 /etc/rsyslog.conf
来规范他们分类存放
# 信息等级
Linux 核心的 syslog 将信息分为 7 个主要等级
等级数值 | 等级名称 | 说明 |
---|---|---|
7 | debug | 用来除错时产生的信息数据 |
6 | info | 一些基本的信息说明 |
5 | notice | 虽说是正常信息,但比 info 还需要被注意到的一些信息 |
4 | warning(warn) | 警告信息,可能有问题,但是还不至于影响到某个 daemon 运行的信息。 |
3 | err(error) | 一些重大的错误信息。例如配置文件某些设置导致无法启动服务的信息说明 |
2 | crit | 比 error 还严重的错误信息,是 critical 临界点的缩写,很严重的错误信息 |
1 | alert | 警告警告,已经很有问题的等级,比 crit 还严重 |
0 | emerg(panic) | 疼痛等级,系统几乎要宕机的状态!大概只有硬件出问题,导致整个核心无法顺利运行的情况了吧 |
除了 0~6 之外,debug 与 none(不需记录等级?)是两个特殊的,当需要调试错误或则忽略掉某些服务的信息时,就可以使用他们
在信息等级前有一些特殊符号 [.=!]
他们的含义如下:
.
:代表:比后面还要严重的等级(含该等级)都被记录下来.=
:代表所需要的等级等于后面的等级,才记录.!
:不等于,除了该等级之外的都记录
# 信息记录的文件名或设备或主机
表示该信息要存放在哪里的配置。通常是记录在文件,下面是一些常见的放置:
- 文件的绝对路径:通常放在
/var/log/
下 - 打印机或其他:例如
/dev/lp0
- 使用者名称:显示给用户
- 远程主机:例如
@study.mrcode.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 来完成,现在则是由 rsyslogd 的 daemon 来完成
# rsyslog.conf 语法练习
例题:将 mail 相关数据给它写入 /var/log/maillog
中
mail.info /var/log/maillog
例题:将新闻组资料 news 以及定时任务 cron 的信息都写入到一个名为 /var/log/cronnews
的文件中,但是他们的警告信息则额外记录在 /var/log/cronnews.warn
中
news.*;cron.* /var/log/cronnews
news.=warn;cron.=warn /var/log/cronnews.warn
2
例题:message 文件需要记录所有的信息,但是不要记录 cron、mail、news 的信息
*.*;news,cron,mail.none /var/log/messages
*.*;news.none;cron.none;mail.none /var/log/messages
# 两种方式,第一种用了逗号语法来完成重复的配置
2
3
# CentOS 7.x 预设的 rsyslog.conf 内容
[root@study ~]# vim /etc/rsyslog.conf
# rsyslog configuration file
....
上面省略了很多配置,主要是下面的 RULES
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#kern.*
:只要是核心产生的信息,都送到 console (终端机)去。console 通常是外部设备连接到系统的,比如,很多封闭的主机(无键盘无屏幕),可以通过连接 RS232 端口将信息输出到外部系统中
*.info;mail.none;authpriv.none;cron.none
由于 mail、authpriv、cron 软件产线的信息太多,且已经分配配置到各个目录中,这里就不再写入 messages 中了
authpriv.*
:认证方面的信息都写入该文件mail.*
:邮件方面的信息cron.*
:定时任务方面的信息*.emerg
:当产生最严重的错误登记时,将该登记的信息以 wall 的方式广播给所有在系统登录的账户
uucp,news.crit
uucp 是早期 Unix-like 系统进行数据传递的通信信息,后来常用在新闻组的用途中,当 news 出现严重错误时写入该文件
local7.*
:将本机开机时应该显示到屏幕的信息写到该文件夹中
mail.* -/var/log/maillog
该项配置前有 -
符号,该符号表示,使用缓存存储信息,当信息量达到一定大小时才写入硬盘中,这是由于 mail 的日志信息太多了,使用缓存信息减少磁盘交互
每个 distribution 的日志配置可能都不太一样,需要先行查看 /etc/rsyslog.conf
文件,你才知道那些日志信息去哪里查看
# 自定义增加日志文件功能
比如,你想让「所有的信息」额外写入到 /var/log/admin.log
中,可以如下实现
# 1. 先设置好所建立的文件
[root@study ~]# vim /etc/rsyslog.conf
# Add by mrcode 2020/03/22 # 添加自己修改的注释信息
*.info /var/log/admin.log
# 2. 重启 rsyslogd 服务
[root@study ~]# systemctl restart rsyslog.service
[root@study ~]# ll /var/log/admin.log
-rw-------. 1 root root 771 Mar 15 22:24 /var/log/admin.log
# 就出现日志信息了
2
3
4
5
6
7
8
9
10
# 日志文件的安全性设置
在某些情况下你需要考虑文件的安全性,比如黑客入侵后,对你系统做了一些操作,由前面所学的知识知道,大部分的操作都会留下日志信息,那么黑客就需要清理掉这些日志信息。可以使用隐藏属性来配置它的安全性
注意:rsyslogd 的日志文件,只能写入,不能被修改的,当知己 vim 修改后,在保存,那么就无法继续记录了(笔者就有一个疑问了:这么大的 BUG,黑客只要先进来修改下日志文件不就可以了?)
在第 6 章中提到过 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
# 如果想取消,使用 chattr -a 取消
2
3
4
使用了 a 属性之后,解决了上面笔者的担忧,只能追加写入数据,而无法修改保存,也无法删除,除非 root 权限被攻破
# 日志文件服务器设置
前面讲到,在 rsyslog.conf 中,可以将日志数据传送到打印机或则是远程主机上,那么利用这个功能,来看几个场景
你办公室有 10 台服务器,每一台负责一个网络服务,可以通过该功能把日志信息聚合到一台主机上面,你检查的时候就可以只登录这一台主机就可以了解到 10 台服务器的日志了
CentOS 7.x 预设 rsyslogd 本身就具有这个文件服务器的功能了,只是没有启动该功能而已。可以通过 man rsyslogd 查询下相关的选项。
这就涉及到:
- 服务端 Server:接受客户端的日志数据保存下来
- 客户端 Clinet:把日志转发到服务端
服务端配置
# 1. Server 端:修改 rsyslogd 的启动配置文件
[root@study ~]# vim /etc/rsyslog.conf
#### MODULES ####
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
# 提供 UDP 和 TCP 方式,如果你的网络很问题,就用 UDP
# 不过,想要数据稳定传输,那么还是建议使用 TCP,把 TCP 的配置打开
# 2. 重启 rsyslog 服务
[root@study ~]# systemctl restart rsyslog.service
[root@study ~]# netstat -ltnp | grep rsyslog
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 7107/rsyslogd
tcp6 0 0 :::514 :::* LISTEN 7107/rsyslogd
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
客户端配置
[root@study ~]# vim /etc/rsyslog.conf
*.* @@192.168.1.100
#*.* @192.168.1.100 # 这个是 UDP 的配置方式
# 重启服务
[root@study ~]# systemctl restart rsyslog.service
2
3
4
5
6