日志采集

先使用一个例子来介绍日志的采集

如:

在一个成熟的公司中,如果用户想要去访问公司的web页面,需要经过缓存层、中间件、代理层、消息队列、数据库等等,然而每一个服务每一个用户去访问都会生成一个日志,当一个用户访问到页面,加上web后端,就会有6个日志生成,如果是一百万个访问量,就会生成六百万个日志,时间越长越多。

此时就会出现一个问题,如此多的日志怎么去管理。

以上的例子中,每个服务中日志必定是在自己服务运行本地的。如果把他们各自的日志都集中起来放在一台,也就是日志服务器来管理所有日志。

什么是日志?

计算机当中,日志是由管理软件或者管理文件一同管理,在各种场景也非常多。系统当中,各个运行消息的日志都是不同的文件来记录的,比如内核日志、错误日志。

在linux当中有个特殊的问题,所有产品都是开源的,开源就意味着没有统一的标准,不像微软一样,有一个标准来衡量。在这样开源的情况下,那日志也会出现多样化的格式,一个服务一种格式的日志。

基于上述问题,在linux中,日志被强制的分为三类,分别是系统日志(syslogd)、内核日志(klogd)、第三方程序日志(如:nginx、mysql…)。在此之外,还有一个用户日志,用来记录系统账户的登录、退出、使用进程等等,一般用来做安全相关的信息。

除第三方程序日志外,其他日志都由linux中的/etc/rsyslog.conf文件来记录

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 打印机相关:打印池
mail 邮件相关:本地邮件
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"

采集成功

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0