电脑的日志相当于我们平常写的日记,日志里面记录的是服务器的状态。
日志的存在可以使管理员提前知道服务器的各种状态,如果服务器出现什么问题可以提前处理。
那么问题来了,公司的服务器很多,难道管理员一个一个查看服务器的状态吗?实际上并不是这样的,为了提高工作效率,我们可以把所有服务器的日志集中在一起管理,放在一台主机上管理,将其他服务器的日志都传到这台管理日志的主机上,这样就方便多了。
我们需要两台服务器:
服务端:
[root@server ~]# ip a
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:00:05:0a brd ff:ff:ff:ff:ff:ff
inet 123.0.0.1/24 brd 123.0.0.255 scope global eth0
# ip设定成功
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe00:50a/64 scope link
valid_lft forever preferred_lft forever
客户端:
[root@client ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 123.0.0.2 netmask 255.255.255.0 broadcast 123.0.0.255
# ip设定成功
inet6 fe80::5054:ff:fe00:50b prefixlen 64 scopeid 0x20<link>
ether 52:54:00:00:05:0b txqueuelen 1000 (Ethernet)
RX packets 131 bytes 17998 (17.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 200 bytes 24159 (23.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
接下来两台服务器添加解析:
首先在服务器端设定:
[root@server ~]# vim /etc/hosts # 编辑解析文件
[root@server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
123.0.0.1 server.example.com # 写入自己的域名与IP
123.0.0.2 client.example.com # 写入客户的域名与IP
[root@server ~]# scp /etc/hosts [email protected]:/etc/ # 将此文件远程发送给client用户
[email protected]'s password:
hosts 100% 217 0.2KB/s 00:00
[root@server ~]# ping client.example.com # 现在就可以解析域名了
PING client.example.com (123.0.0.2) 56(84) bytes of data.
64 bytes from client.example.com (123.0.0.2): icmp_seq=1 ttl=64 time=0.209 ms
64 bytes from client.example.com (123.0.0.2): icmp_seq=2 ttl=64 time=0.418 ms
^C
--- client.example.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.209/0.313/0.418/0.105 ms
直接在客户端进行测试:
[root@client ~]# ping server.example.com # 客户端也可以解析服务器域名
PING server.example.com (123.0.0.1) 56(84) bytes of data.
64 bytes from server.example.com (123.0.0.1): icmp_seq=1 ttl=64 time=0.237 ms
64 bytes from server.example.com (123.0.0.1): icmp_seq=2 ttl=64 time=0.391 ms
^C
--- server.example.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.237/0.314/0.391/0.077 ms
rsyslog:此服务是用来采集系统日志的,它自己不产生日志,只是起到采集日志的作用
对日志进行分析,首先第一步要规整日志。
也就是说在/etc/rsyslog.d
中设定怎样对客户端服务,/etc/rsyslog.conf
怎样管理好rsyslog服务本身。
[root@server ~]# whereis rsyslog
rsyslog: /usr/lib64/rsyslog /etc/rsyslog.conf /etc/rsyslog.d
rsyslog的日志的采集保存在以下几个路径:
/var/log/messages | 服务信息日志 |
---|---|
/var/log/secure | 系统登陆日志 |
/var/log/cron | 定时任务日志 |
/var/log/maillog | 邮件日志 |
/var/log/boot.log | 系统启动日志 |
在后续我们可以添加自己的日志文件,来进行测试。
日志采集保存在/var/log/file(文件名)中:
可以收集的日志的类型有:
日志类型 | 日志内容 |
---|---|
auth | 用户认证时产生的日志 |
authpriv | ssh、ftp等登录信息的验证信息 |
daemon | 一些守护进程产生的日志 |
ftp | FTP产生的日志 |
lpr | 打印相关活动 |
mark | (syslog)-rsyslog 服务内部的信息,时间标识 |
news | 网络新闻传输协议(nntp)产生的消息。 |
syslog | 系统日志 |
security | |
uucp | Unix-to-Unix Copy 两个unix之间的相关通信 |
console | 针对系统控制台的消息。 |
cron | 系统执行定时任务产生的日志。 |
kern | 系统内核日志 |
local0~local7 | 自定义程序使用 |
邮件日志 | |
user | 用户进程 |
日志的级别分为:
日志等级 | 说明 | |
---|---|---|
7 | emerg | 紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。 |
6 | alert | 需要立即修复的告警。 |
5 | crit | 危险情况,例如硬盘错误,可能会阻碍程序的部分功能。 |
4 | error/err | 一般错误消息。 |
3 | warning/warn | 警告。 |
2 | notice | 不是错误,但是可能需要处理。 |
1 | info | 通用性消息,一般用来提供有用信息。 |
0 | debug | 调试程序产生的信息。 |
none | 没有优先级,不记录任何日志消息。 |
将什么类型、什么级别的日志放在哪个路径下,这就叫日志的定向采集
这样做也有利于日志的管理和查看,因此应该设计采集规则
在服务器自己收集日志测试:
1)建立一个自己的日志收集文件:
[root@server ~]# touch /var/log/song
[root@server ~]# ll /var/log/song # 成功建立自己的日志收集文件
-rw-r--r-- 1 root root 0 Aug 6 23:30 /var/log/song
2)在日志采集文件里面设置将任意类型、任何级别的日志都存放在/var/log/song
文件中,如果/var/log/song
文件不存在会自动生成。
vim /etc/rsyslog.conf
46 #### RULES #### # 这里就可以开始写收集日志规则了
47
48 # Log all kernel messages to the console.
49 # Logging much else clutters up the screen.
50 #kern.* /dev/console
51
52 # Log anything (except mail) of level info or higher.
53 # Don't log private authentication messages!
54 *.info;mail.none;authpriv.none;cron.none /var/log/messages
55 *.* /var/log/song
# 任何类型.任何等级 # 都收集在此文件中
3)重新启动rsyslog服务,让他重新读取自己的配置文件。
[root@server ~]# systemctl restart rsyslog.service # 重启服务
[root@server ~]# systemctl status rsyslog.service
rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled)
Active: active (running) since Thu 2020-08-06 23:36:09 EDT; 10s ago
Main PID: 2334 (rsyslogd)
CGroup: /system.slice/rsyslog.service
└─2334 /usr/sbin/rsyslogd -n
Aug 06 23:36:09 server.example.com systemd[1]: Starting System Logging Servi....
Aug 06 23:36:09 server.example.com systemd[1]: Started System Logging Service.
Hint: Some lines were ellipsized, use -l to show in full.
4)测试,我们重新开启httpd服务,查看/var/log/song
日志内容:
[root@server ~]# systemctl restart httpd # 重启apache服务
[root@server ~]# cat /var/log/song
Aug 6 23:36:09 server rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="2334" x-info="http://www.rsyslog.com"] start
Aug 6 23:36:09 server rsyslogd-2307: warning: ~ action is deprecated, consider using the 'stop' statement instead [try http://www.rsyslog.com/e/2307 ]
Aug 6 23:36:09 server systemd: Stopping System Logging Service...
Aug 6 23:36:09 server systemd: Starting System Logging Service...
Aug 6 23:36:09 server systemd: Started System Logging Service.
Aug 6 23:38:35 server systemd: Starting The Apache HTTP Server...
Aug 6 23:38:35 server systemd: Started The Apache HTTP Server. # 日志中含有httpd服务的启动信息
由此可见,将任意类型、任何级别的日志定向采集到了/var/log/song
之中
5)总结:实际在企业当中,我们要将日志分类管理,可以参考第三项系统日志管理里面的类型和级别,将 *.*改为日志类型.日志级别,然后存放在指定的文件当中即可。
一台服务器管理多台服务器日志的实验如下:
首先在客户端进行设定:
1) 在/etc/rsyslog.conf这个文件中写入 123.0.0.1(服务端的IP),要将指定的日志发送给这个IP。
[root@client ~]# vim /etc/rsyslog.conf
# 首先在14-20行中确定你要使用那种传输方式UDP还是TCP,这里我选择UDP
14 # Provides UDP syslog reception
15 $ModLoad imudp # 去掉注释就可以了
16 $UDPServerRun 514
17
18 # Provides TCP syslog reception
19 #$ModLoad imtcp
20 #$InputTCPServerRun 514
# 在RULES下添加发送的IP。
46 #### RULES ####
47
48 # Log all kernel messages to the console.
49 # Logging much else clutters up the screen.
50 #kern.* /dev/console
51
52 # Log anything (except mail) of level info or higher.
53 # Don't log private authentication messages!
54 *.info;mail.none;authpriv.none;cron.none /var/log/messages
55 *.* @123.0.0.1
# 所有类型.所有级别的日志,都发送给123.0.0.1
这里注意:
@123.0.0.1
@@123.0.0.1
2)重启客户端的rsyslog服务:
[root@client ~]# systemctl restart rsyslog.service
客户端准备成功。
1)在接收方server主机中先 vim /etc/rsyslog.conf
[root@server ~]# vim /etc/rsyslog.conf
# 在14-20行中确定你要使用那种传输方式UDP还是TCP,这里我选择UDP
14 # Provides UDP syslog reception
15 $ModLoad imudp # 去掉注释就可以了
16 $UDPServerRun 514
17
18 # Provides TCP syslog reception
19 #$ModLoad imtcp
20 #$InputTCPServerRun 514
2) 重启服务
[root@server ~]# systemctl restart rsyslog.service
3)关闭防火墙:是为了让客户端发送的日志可以不被防火墙挡在外面。
[root@server ~]# systemctl stop firewalld.service # 关闭防火墙
[root@server ~]# systemctl disable firewalld.service # 开机不能自启动防火墙
rm '/etc/systemd/system/basic.target.wants/firewalld.service'
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
1)在客户端和服务端都清空日志
服务端:
[root@server ~]# > /var/log/messages # 输入为空,即是清空
[root@server ~]# cat /var/log/messages # 查看为空
客户端:
[root@client ~]# > /var/log/messages
[root@client ~]# cat /var/log/messages
2)在日志客户端的shell当中产生测试日志:
[root@client ~]# logger test # 生成测试日志
[root@client ~]# cat /var/log/messages # 查看测试日志
Aug 7 00:03:19 client root: test
3)在服务端查看日志:
[root@server ~]# cat /var/log/messages
Aug 7 00:03:19 client root: test
# 是client发送的日志
可见两台主机实现远程同步了。
注意:在服务端可以查看接口配置是否正确开启 :
[root@server ~]# netstat -antlupe | grep rsyslog
# 514端口为任何网段开启,作为rsyslog的服务端口,使用的UDP传输方式
udp 0 0 0.0.0.0:514 0.0.0.0:* 0 49292 2606/rsyslogd
udp6 0 0 :::514 :::* 0 49293 2606/rsyslogd
此实验是在实现远程同步的基础上进行的。
首先查看一般格式的日志:
[root@server ~]# cat /var/log/messages
Aug 7 00:10:01 server systemd: Starting Session 14 of user root.
Aug 7 00:10:01 server systemd: Started Session 14 of user root.
Aug 7 00:09:10 client rc.local: /etc/rc.d/rc.local: connect: Connection timed out
Aug 7 00:09:10 client rc.local: /etc/rc.d/rc.local: line 18: /dev/tcp/content.example.com/80: Connection timed out
Aug 7 00:10:01 client systemd: Starting Session 14 of user root.
Aug 7 00:10:01 client systemd: Started Session 14 of user root.
# 时间 谁 记录目标 内容
那么我们希望可以用一下的方式管理:
知道日志的生成时间、日志发送方的ip地址、日志的服务目标、日志的内容,这样在管理服务器的时候就方便多了。
1)在服务端进行日志采集格式的设置
[root@server ~]# vim /etc/rsyslog.conf
#在RULES写入收集规则SONG
46 #### RULES ####
47 $template SONG,"%timegenerated% %FROMHOST-IP% %syslogtag% %msg%\n"
48 # Log all kernel messages to the console.
49 # Logging much else clutters up the screen.
50 *.* /var/log/song;SONG
# 使用SONG格式收集日志在/var/log/song中。
23 #### GLOBAL DIRECTIVES ####
24
25 # Where to place auxiliary files
26 $WorkDirectory /var/lib/rsyslog
27
28 # Use default timestamp format
29 $ActionFileDefaultTemplate SONG
# 修改系统默认日志采集格式为SONG
也就是:
显示日志的生成时间 | %timegenerated% |
---|---|
显示发送方主机的ip | %FROMHOST-IP% |
日志记录目标 | %syslogtag% |
日志内容 | %msg% |
换行 | \n |
2)重启服务,查看/var/log/song
文件:
[root@server ~]# systemctl restart rsyslog.service
[root@server ~]# cat /var/log/song
# 时间 IP 记录目标 日志内容
Aug 7 00:29:57 127.0.0.1 systemd: Stopping The Apache HTTP Server...
Aug 7 00:29:58 127.0.0.1 systemd: Starting The Apache HTTP Server...
Aug 7 00:29:58 127.0.0.1 systemd: Started The Apache HTTP Server.
3)客户端的格式还是由自己的配置决定,单是发送到服务端就会变为刚才设定的格式:
客户端:
[root@client ~]# > /var/log/messages
[root@client ~]# logger test
[root@client ~]# cat /var/log/messages
Aug 7 00:42:42 client root: test
服务端:
[root@server ~]# cat /var/log/messages
Aug 7 00:44:59 123.0.0.2 root: test
# 格式已经修改成功
这样就非常方便管理了。