日志采集
先使用一个例子来介绍日志的采集
如:
在一个成熟的公司中,如果用户想要去访问公司的web页面,需要经过缓存层、中间件、代理层、消息队列、数据库等等,然而每一个服务每一个用户去访问都会生成一个日志,当一个用户访问到页面,加上web后端,就会有6个日志生成,如果是一百万个访问量,就会生成六百万个日志,时间越长越多。
此时就会出现一个问题,如此多的日志怎么去管理。
以上的例子中,每个服务中日志必定是在自己服务运行本地的。如果把他们各自的日志都集中起来放在一台,也就是日志服务器来管理所有日志。
什么是日志?
计算机当中,日志是由管理软件或者管理文件一同管理,在各种场景也非常多。系统当中,各个运行消息的日志都是不同的文件来记录的,比如内核日志、错误日志。
在linux当中有个特殊的问题,所有产品都是开源的,开源就意味着没有统一的标准,不像微软一样,有一个标准来衡量。在这样开源的情况下,那日志也会出现多样化的格式,一个服务一种格式的日志。
基于上述问题,在linux中,日志被强制的分为三类,分别是系统日志(syslogd)、内核日志(klogd)、第三方程序日志(如:nginx、mysql…)。在此之外,还有一个用户日志,用来记录系统账户的登录、退出、使用进程等等,一般用来做安全相关的信息。
除第三方程序日志外,其他日志都由linux中的/etc/rsyslog.conf
文件来记录
如图所示。
mail.*:mail表示服务,星号表示记录日志的级别
-/var/log/maillog:表示mail服务的日志被记录的位置
图中所示的,格式很是花样,来解释一下,特殊符号代表的意思
- :路径前带横线的,表示延迟写入,不会实时写入的强占硬件资源
auth.info @192.168.1.1:表示auth服务的info级别的信息,以UDP方式传输给192.168.1.1主机。@表示UDP传输
user.!=error @@192.168.1.1:表示user服务除error级别的日志,以TCP方式传输给192.168.1.1主机。@@表示TCP传输
user.!error :user:表示记录error以上级别的信息,发送个某个用户
*.info | logrotate -f:记录所有服务的info级别的日志,并交由管道符后面的命令或者程序进行处理
cron.info;mail.info:记录cron和mail的info级别的日志
cron,mail.info:同上
以上的格式使用都可以相互搭配
除了图中所示,还有其他的计算机中自带的服务
服务 | 作用 |
---|---|
auth | 认证相关:权限 |
authpriv | 权限授权相关 : PAM模块、远程 |
cron | 计划任务: cornd服务 |
daemon | 守护进程 |
kern | 内核相关 |
Ipr | 打印机相关:打印池 |
邮件相关:本地邮件 | |
mark | 标记相关:防火墙等网络标识 |
news | 新闻相关 |
security | 安全相关与auth类似:触发与更改 |
user | 用户和组:增删改 |
uucp | unix to unix cp相关: ISP |
local0-7 | 用户自定义的 |
* | 表示以上所有服务 |
系统日志
可以看到上图中大部分的日志路径可以看出都在/var/log
目录中,通过yum安装的程序的日志也会在这个目录。这个目录中除了那些,还有以下这些日志
日志文件 | 说明 |
---|---|
/var/log/boot.log | 记录系统引导过程中发生的事件 |
/var/log/message | 它是核心系统日志文件,记录了一些服务的状态信息等等 |
/var/log/cron | 记录与系统定时任务相关的曰志 |
/var/log/dmesg | 记录了系统在开机时内核自检的信总。也可以使用dmesg命令直接查看内核自检信息 |
/var/log/maillog | 记录邮件信息的曰志 |
/var/log/lastlog | 记录系统中所有用户最后一次的登录时间的曰志。这个文件也是二进制文件.不能直接用Vi 查看。而要使用lastlog/last/命令查看 |
/var/log/secure | 记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
/var/log/wtmp | 永久记录所有用户的登陆、注销信息,同时记录系统的后动、重启、关机事件。同样,这个文件也是二进制文件.不能直接用Vi查看,而要使用last命令查看 |
/var/tun/ulmp | 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用Vi查看,而要使用w、who、users。finger等命令查看 |
/var/log/btmp | 记录错误登陆的日志。这个文件是二进制文件,不能直接用Vi查看,而要使用lastb命令查看 |
属性权限
从以上可以看出,一些日志是不能够之间查看的。涉及到了linux当中的属性权限
属性权限是一个大于root权限,这些权限不局限与平常所知道的rwxst权限
可以进行限制用户(包括root)的写入和读取。如:
锁死文件
chattr +i
:添加文件锁死
chattr -i
:去掉文件锁死
[root@localhost ~]# echo 123 > test
[root@localhost ~]# chattr +i test
[root@localhost ~]# lsattr test
----i----------- test
现在如果去修改文件内容
会报错权限拒绝
[root@localhost ~]# echo 456 > test
-bash: test: Permission denied
其他权限
使用方法与锁死类似
选项 | 作用 |
---|---|
A | atime时间不能更改 |
a | 只能增加不能减少,日志常用 |
S | 数据同步写入到硬盘中 |
s | 完全移除硬盘 |
c | 自动将文档进行压缩 |
d | dump备份 |
u | 被删除后一定会被找回 |
i | 文件锁死不能更改,适用于安全性较高的文件 |
日志级别
级别 | 作用 |
---|---|
8 none | 不记录任何日志 |
7 debug | 记录程序/系统调试信息 |
6 info | 一般信息 |
5 notice | 不影响任何功能,但是需要注意的 |
4 warnning | 可能影响功能 ,但是需要注意。比如: apache启动时提示没有绑定DNS |
3 err | 允许运行但是出现错误,导致无法继续运行 |
2 crit | 比较严重的错误,运行中出现的错误 |
1 alert | 必须马上解决的问题,系统出现问题 |
0 emerg | 内核/硬件错误 |
可以看到3和4之间隔开了,warning和error是本质上的区别。相信报错多了,会听过一句话,黄色的警告一律不需要管,只要是warning以上级别的(4/5/6/7/8)都不会影响服务的正常运行,err以下,相反。
本地日志采集
采集本地服务日志
可以直接修改/etc/rsyslog.conf
文件,先以安全日志为例,如下,改变安全日志生成的路径
[root@localhost ~]# vim /etc/rsyslog.conf
# 改变authpriv服务的日志路径为/usr/local/secure
authpriv.* /usr/local/secure
重启该服务
[root@localhost ~]# systemctl restart rsyslog
由于selinux的原因会在重启服务之后仍然不生效,所以需要调整沙盒,因为/var/log
目录是独有的selinux日志目录
查看两个目录的安全上下文,可以看到是不一样的,沙盒不会让log的标签进入普通的标签中的
[root@localhost ~]# ls -Zd /var/log
drwxr-xr-x. root root system_u:object_r:var_log_t:s0 /var/log
[root@localhost ~]# ls -Zd /usr/local
drwxr-xr-x. root root system_u:object_r:usr_t:s0 /usr/local
由于实验环境,将沙盒关闭,生产环境建议新建一个目录,且修改安全上下文
关闭沙盒方法
[root@localhost ~]# setenforce 0
修改安全上下文方法
修改为与/var/log目录相同的安全上下文
[root@localhost ~]# chcon -v --reference=/var/log /cyj
重新启动服务验证
[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# ls /usr/local | grep secure
secure
验证此位置secure日志的变化,该日志记录了用户的切换登录等等
进行以下操作
[root@localhost ~]# useradd feiyi
[root@localhost ~]# su feiyi
[feiyi@localhost root]$ su root
Password:
[root@localhost ~]# exit
exit
[feiyi@localhost root]$ exit
exit
查看日志
记录了以上的所有操作
[root@localhost ~]# cat /usr/local/secure
Apr 9 08:29:08 localhost polkitd[822]: Registered Authentication Agent for unix-process
:80411:669779 (system bus name :1.355 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object
path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
Apr 9 08:29:09 localhost polkitd[822]: Unregistered Authentication Agent for unix-process
:80411:669779 (system bus name :1.355, object path /org/freedesktop/PolicyKit1/Authenticat
ionAgent, locale en_US.UTF-8) (disconnected from bus)
Apr 9 08:31:42 localhost useradd[80477]: new group: name=feiyi, GID=1001
Apr 9 08:31:42 localhost useradd[80477]: new user: name=feiyi, UID=1001, GID=1001, home=
/home/feiyi, shell=/bin/bash
Apr 9 08:31:45 localhost su: pam_unix(su:session): session opened for user feiyi by root
(uid=0)
Apr 9 08:31:49 localhost su: pam_unix(su:auth): authentication failure; logname=root
uid=1001 euid=0 tty=pts/3 ruser=feiyi rhost= user=feiyi
Apr 9 08:31:58 localhost su: pam_unix(su:session): session opened for user root by
root(uid=1001)
Apr 9 08:32:00 localhost su: pam_unix(su:session): session closed for user root
Apr 9 08:32:01 localhost su: pam_unix(su:session): session closed for user feiyi
在生产环境中,修改后的日志路径需要添加属性权限a,只允许增加
[root@localhost ~]# chattr +a /usr/local/secure
跨主机收集系统日志
同样也是修改/etc/rsyslog.conf
文件
192.168.1.11
将本机(192.168.1.11)的所有服务的所有级别的日志,以UDP或者TCP方式传送给另一台主机(192.168.1.12)
[root@localhost ~]# vim /etc/rsyslog.conf
# 将tcp和udp的系统日志接收功能开启,找到取消注释即可
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
# 在rules部分添加以下
*.* @192.168.1.12
对应514端口号会运行
[root@localhost ~]# netstat -anput | grep 514
放行防火墙端口
[root@localhost ~]# firewall-cmd --add-port=514/udp
success
[root@localhost ~]# firewall-cmd --add-port=514/tcp
success
192.168.1.12
只需要开启/etc/rsyslog.conf
文件的udp接收和tcp接收即可
[root@localhost ~]# vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
重启服务,放行端口
[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# firewall-cmd --add-port=514/tcp
success
[root@localhost ~]# firewall-cmd --add-port=514/udp
success
然后以阻塞方式监听日志
[root@localhost ~]# tail -f /var/log/message
...
192.168.1.11
模拟生产日志
[root@localhost ~]# logger 123123123
192.168.1.12
此时,1.12主机的阻塞端会输出如下日志,生产环境中建议更改好主机名,方便辨别哪台主机的日志
Apr 9 09:04:02 localhost root: 123123123
第三方日志采集
以nginx为例
192.168.1.11
拖包
[root@localhost ~]# tar zxf nginx-1.11.1.tar.gz -C /usr/src
[root@localhost ~]# yum -y install pcre-devel zlib-devel
[root@localhost nginx-1.11.1]# ./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx
[root@localhost nginx-1.11.1]# make && make install
[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
[root@localhost ~]# useradd nginx
[root@localhost ~]# nginx
nginx日志路径为/usr/local/nginx/logs
目录下,有两个日志,access和error,进行一次nginx访问,即可产生日志
[root@localhost ~]# curl 192.168.1.11
[root@localhost ~]# cat /usr/local/nginx/logs/access.log
192.168.1.11 - - [09/Apr/2020:09:16:21 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0"
修改/etc/rsyslog.conf文件
[root@localhost ~]# vim /etc/rsyslog.conf
# 在MODULES部分下,也就是开启udp和tcp两条之上增加以下内容
$ModLoad imfile # 实时传输
# 在文件最下方,添加如下内容,以下定义的name名必须唯一
# access.log的发送
$InputFilePollInterval 1 # 检查文件的间隔时间1s
$InputFileName /usr/local/nginx/logs/access.log # 发送文件所在的位置
$InputFileTag nginx-info-access; # 发送文件标签,将会以这个名字出现在另一台主机
$InputFilestateFile state-nginx-info-accesslog # 用来标记文件上传进度
# error.log的发送
$InputFileName /usr/local/nginx/logs/error.log
$InputFileTag nginx-info-error;
$InputFilestateFile state-nginx-info-errorlog
$InputRunFileMonitor
# 将两个日志分别发送给源端,并在本地保留一份
$InputFilePollInterval 10 # 每10s传送一次文件
if $programname == 'nginx-info-errorlog' then @192.168.1.12
if $programname == 'nginx-info-errorlog' then ~
if $programname == 'nginx-info-accesslog' then @192.168.1.12
if $programname == 'nginx-info-accesslog' then ~
重启服务
[root@localhost ~]# systemctl restart rsyslog
192.168.1.12
发送后的日志会默认出现在/var/log/messages
文件中,同样使用动态查询日志的方式
[root@localhost ~]# tail -f /var/log/messages
现在查看到的都是之前的日志,使用其他主机进行,nginx访问,查看1.12主机的变化
Apr 9 09:38:57 localhost nginx-info-access; 192.168.1.11 - - [09/Apr/2020:09
:38:50 +0800]"GET / HTTP/1.1" 200 612 "-" "curl/7.29.0"
Apr 9 09:38:57 localhost nginx-info-access; 192.168.1.11 - - [09/Apr/2020:09
:38:50 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0"
采集成功