浅谈日志分析
日志介绍
1️⃣日志的基本概念
- 日志:将事件发生的时间、地点、人物、事件等信息保存记录
- 日志级别:根据事件的关键程度对日志的分级
- 事件记录格式:一般包含日期时间、主机、进程[pid]、事件内容
- 基于C/S架构的日志系统:通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理
2️⃣日志系统的发展
-
sysklogd: CentOS5之前的系统日志服务
- syslogd: 记录应用日志
- klogd:记录内核日志
-
rsyslog: CentOS6, 7使用的系统日志服务
- 支持TCP, UDP
- 支持日志转储于数据库MySQL, Oracle
- 强大的过滤器
- 自定义输出格式
-
ELK:elasticsearch, logstash, kibana
- 非关系型分布式数据库
- 专业的日志管理平台
3️⃣rsyslog的关键概念
-
facility:设施,从功能或程序上对日志进行归类
auth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security(auth), user, uucp, local0-local7(预留自定义), syslog
-
priority:优先级别,从低到高排序
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
rsyslog管理
1️⃣rsyslog 相关文件
- 程序包:
rsyslog
- 主程序:
/usr/sbin/rsyslogd
- CentOS 6:
/etc/rc.d/init.d/rsyslog {start|stop|restart|status}
- CentOS 7,8:
/usr/lib/systemd/system/rsyslog.service
- 配置文件:
/etc/rsyslog.conf,/etc/rsyslog.d/*.conf
- 库文件:
/lib64/rsyslog/*.so
2️⃣rsyslog配置文件
配置文件格式:由三部分组成
- MODULES:相关模块配置
- GLOBAL DIRECTIVES:全局配置
- RULES:日志记录相关的规则配置
RULES配置格式
-
格式:
facility.priority;facility.priority… target
-
facility
*:
所有的facilityfacility1,facility2,facility3,...
:指定的facility列表
-
priority
*:所有级别
none:没有级别,即不记录
PRIORITY:指定级别(含)以上的所有级别
=PRIORITY:仅记录指定级别的日志信息
- target
文件路径:通常在/var/log/,文件路径前的-表示异步写入
用户:将日志事件通知给指定的用户,*表示登录的所有用户
日志服务器:@host,把日志送往至指定的远程UDP服务器
@@host 将日志发送到远程TCP日志服务器
管道:| COMMAND,转发给其它命令处理
通常的日志文件的格式:
日志文件有很多,如: /var/log/messages,cron,secure等,基本格式都是类似的。格式如下
事件产生的日期时间 主机 进程(pid):事件内容
3️⃣syslog的网络日志服务
启用网络日志服务功能,可以将多个远程主机的日志,发送到集中的日志服务器,方便统一管理。
配置网络日志服务:修改配置文件,当UDP和TDP服务模块开启
/ centos8启用网络日志功能
[root@centos8 ~]#vim /etc/rsyslog.conf
#### MODULES ####
...省略...
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
module(load="imtcp") # needs to be done just once
input(type="imtcp" port="514")
/ centos6和7启用网络日志功能
vim /etc/rsyslog.conf
#### MODULES ####
# Provides UDP syslog reception
$ModLoadimudp //取消行前的注释符
$UDPServerRun514 //取消行前的注释符
# Provides TCP syslog reception
$ModLoadimtcp //取消行前的注释符
$InputTCPServerRun514 //取消行前的注释符
实验:配置centos7的rsyslog网络日志服务
- 主机配置:两台主机
日志服务器:负责接收客户端通过UDP或TCP发来的日志信息(IP:172.20.54.1)
日志客户端:负责发出写入日志请求
实验1:通过UDP使客户端的事件记录在日志服务器的/var/log/messages中 - 配置服务端配置文件module部分,开启UDP通信模块
vim /etc/rsyslog.conf
$ModLoad imudp //删除行前注释符
$UDPServerRun 514 //删除行前注释符
systemctl restart rsyslog
[root@Centos7 ~]# ss -nutlp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 *:514 *:* users:(("rsyslogd",pid=5649,fd=3))
udp UNCONN 0 0 [::]:514 [::]:* users:(("rsyslogd",pid=5649,fd=4))
- 配置客户端配置文件rules部分
vim /etc/rsyslog.conf
/ 修改target
*.info;mail.none;authpriv.none;cron.none @172.20.54.1
systemctl restart rsyslog
/ 客户端测试
[root@Centos7 ~]# logger -p syslog.info "this is test message"
/ 服务端追踪/var/log/messages
[root@Centos7 ~]# tail -f /var/log/messages
.
.
Dec 14 21:51:28 Centos7 systemd: Started System Logging Service.
Dec 14 21:52:26 Centos7 root: this is test message
.
.
实验2:通过TCP使客户端的事件记录显示在日志服务器的所有登录用户终端上
- 修改服务端配置文件,启用TCP通信模块
vim /etc/rsyslog.conf
$ModLoad imtcp //删除行前注释符
$InputTCPServerRun 514 //删除行前注释符
local2.* /var/log/test.log
systemctl restart rsyslog
[root@Centos7 ~]# ss -ntlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 25 *:514 *:*
users:(("rsyslogd",pid=5675,fd=3))
- 修改客户端rules配置文件
vim /etc/rsyslog.conf
local2.* @@172.20.54.1 / TCP模块是@@
systemctl restart rsyslog
/ 客户端测试
[root@Centos7 ~]# logger -p local2.info "this is second test message"
[root@Centos7 ~]# logger -p local2.info "this is third test message"
/ 服务端追踪日志文件
[root@Centos7 ~]# tail -f /var/log/test.log
Dec 14 22:04:36 Centos7 root: this is second test message
Dec 14 22:04:50 Centos7 root: this is third test message
4️⃣其他常见的日志文件
/var/log/secure:系统安装日志,文本格式,应周期性分析
/var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行
查看
/var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查
看
/var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看
/var/log/dmesg:CentOS7 之前版本系统引导过程中的日志信息,文本格式,开机后的硬件变化
将不再记录
专用命令dmesg查看,可持续记录硬件变化的情况
/var/log/boot.log 系统服务启动的相关信息,文本格式
/var/log/messages :系统中大部分的信息
/var/log/anaconda : anaconda的日志
- 范例
/ 找出失败登录次数最多的前5个IP
[root@iZm5e7fmdzy1az1fi80v4yZ ~]#lastb | awk '{print $(NF=3) }'|sort -nr|uniq -c | sort -nr| head -5
10 179.150.129.20
5 90.220.55.200
5 36.105.213.11
5 222.186.175.151
4 Tue
/ 找出失败登录次数最多的前5个IP
[root@iZm5e7fmdzy1az1fi80v4yZ ~]#lastb | awk '{ip[$3]++}END{for (i in ip){print ip[i],i}}'|sort -nr|head -5
10 179.150.129.20
5 90.220.55.200
5 36.105.213.11
5 222.186.175.151
4 Tue
日志管理工具journalctl
-
systemd的日志管理工具,可以查看所有内核日志和应用日志
-
配置文件:
/etc/systemd/journald.conf
journalctl用法
#查看所有日志(默认情况下 ,只保存本次启动的日志)
journalctl
#查看内核日志(不显示应用日志)
journalctl -k
#查看系统本次启动的日志
journalctl -b
journalctl -b -0
#查看上一次启动的日志(需更改设置)
journalctl -b -1
#查看指定时间的日志
journalctl --since="2017-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"
#显示尾部的最新10行日志
journalctl -n
#显示尾部指定行数的日志
journalctl -n 20
#实时滚动显示最新日志
journalctl -f
#查看指定服务的日志
journalctl /usr/lib/systemd/systemd
#查看指定进程的日志
journalctl _PID=1
#查看某个路径的脚本的日志
journalctl /usr/bin/bash
#查看指定用户的日志
journalctl _UID=33 --since today
#查看某个 Unit 的日志
journalctl -u nginx.service
journalctl -u nginx.service --since today
#实时滚动显示某个 Unit 的最新日志
journalctl -u nginx.service -f
#合并显示多个 Unit 的日志
journalctl -u nginx.service -u php-fpm.service --since today
#查看指定优先级(及其以上级别)的日志,共有8级
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
journalctl -p err -b
#日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager
#日志管理journalctl
#以 JSON 格式(单行)输出
journalctl -b -u nginx.service -o json
#以 JSON 格式(多行)输出,可读性更好
journalctl -b -u nginx.serviceqq -o json-pretty
#显示日志占据的硬盘空间
journalctl --disk-usage
#指定日志文件占据的最大空间
journalctl --vacuum-size=1G
#指定日志文件保存多久
journalctl --vacuum-time=1years
MySQL管理日志
实验1:rsyslog将日志记录于MySQL中
- 实现此功能需要两台主机
主机1:rsyslog服务器(IP: 172.20.54.1)
主机2:mysql数据库(IP: 172.20.54.2)
1️⃣主机1安装mysql与rsyslog的接口
[root@Centos7 ~]# yum -y install rsyslog-mysql
[root@Centos7 ~]# rpm -ql rsyslog-mysql
/usr/lib64/rsyslog/ommysql.so
/usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
/ 把数据库创建脚本传给mysql服务器
[root@Centos7 ~]# scp /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql 172.20.54.2:/root
2️⃣主机2安装并配置数据库
[root@Centos7 ~]# yum -y install mariadb-server
[root@Centos7 ~]# systemctl start mariadb
[root@Centos7 ~]# mysql < mysql-createDB.sql
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Syslog |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> SHOW TABLES FROM Syslog;
+------------------------+
| Tables_in_Syslog |
+------------------------+
| SystemEvents |
| SystemEventsProperties |
+------------------------+
2 rows in set (0.00 sec)
/ 创建授权用户
MariaDB [(none)]> GRANT ALL ON Syslog.* TO 'syslog'@'%' IDENTIFIED BY 'centos';
Query OK, 0 rows affected (0.00 sec)
3️⃣主机1配置rsyslog
- 编辑/etc/rsyslog.conf文件
/ 载入mysql模块
$modload ommysql
/ 设置rules
local2.* :ommysql:172.20.54.2,Syslog,syslog,centos
systemctl rstart rsyslog
4️⃣查看数据库
MariaDB [Syslog]> USE Syslog;
MariaDB [Syslog]> SELECT * FROM SystemEvents\G;
*************************** 1. row ***************************
ID: 1
CustomerID: NULL
ReceivedAt: 2019-12-15 09:08:18
DeviceReportedTime: 2019-12-15 09:08:18
Facility: 18
Priority: 6
FromHost: Centos7
Message: this is good message
NTSeverity: NULL
Importance: NULL
EventSource: NULL
EventUser: NULL
EventCategory: NULL
EventID: NULL
EventBinaryData: NULL
MaxAvailable: NULL
CurrUsage: NULL
MinUsage: NULL
MaxUsage: NULL
InfoUnitID: 1
SysLogTag: root:
EventLogType: NULL
GenericFileName: NULL
SystemID: NULL
1 row in set (0.00 sec)
实验2:通过loganalyzer展示数据库中的日志
-
本实验环境承接实验1,并且需要添加主机3用于通过web界面展示数据库的日志
-
主机分工:
主机1:rsyslog服务器(IP: 172.20.54.1)
主机2:mysql数据库(IP: 172.20.54.2)
主机3:apache httpd服务器,php,loganalyzer(IP: 172.20.54.3)
1️⃣主机3安装apache httpd, php
yum install httpd php-fpm php-mysqlnd php-gd
systemctl restart httpd
2️⃣主机3编译安装loganalyzer
tar xvf loganalyzer-4.1.5.tar.gz
cd loganalyzer-4.1.5
cp -r src/ /var/www/html/log //只复制src子目录的文件至网页存放目录
cd /var/www/html/log/
touch config.php //准备安装配置文件
chmod 666 config.php
3️⃣配置loganalyzer
- 浏览器登录http://172.20.54.3/log/,出现提示如下图