4.1.3 ELK
ELK:由Elasticsearch、Logstash、Kibana三个软件组成。
- 非关系型分布式数据库基于apache软件基金会jakarta项目组的项目lucene
- Elasticsearch是个开源分布式搜索引擎,可以处理大规模日志数据,比如:Nginx、Tomcat、系统日志等功能
- Logstash对日志进行收集、分析,过滤,并将其存储供以后使用
- Kibana 可以提供的日志分析友好的 Web 界面
4.2 rsyslog管理
4.2.1 系统日志术语
- facility:设施,从功能或程序上对日志进行归类
#内置分类 auth(验证), authpriv, cron(定时任务), daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, syslog #自定义的分类 local0-local7 复制代码
- Priority 优先级别,从低到高排序
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic) 复制代码
- 参看帮助: man 3 syslog,man logger
[root@localhost ~]# yum -y install man-pages [root@localhost ~]# man 3 syslog level This determines the importance of the message. The levels are, in order of decreasing impor‐ tance: LOG_EMERG system is unusable LOG_ALERT action must be taken immediately LOG_CRIT critical conditions LOG_ERR error conditions LOG_WARNING warning conditions LOG_NOTICE normal, but significant, condition LOG_INFO informational message LOG_DEBUG debug-level message 复制代码
- 日志等级:
级号 | 消息 | 级别 | 说明 |
0 | EMERG | 紧急 | 会导致主机系统不可用的情况 |
1 | ALERT | 警告 | 必须马上采取措施解决的问题 |
2 | CRIT | 严重 | 比较严重的情况 |
3 | ERR | 错误 | 运行出现错误 |
4 | WARNING | 提醒 | 可能会影响系统功能的事件 |
5 | NOTICE | 注意 | 不会影响系统但值得注意 |
6 | INFO | 信息 | 一般信息 |
7 | DEBUG | 调试 | 程序或系统调试信息等 |
- 服务名称(即什么服务产生的日志):
服务名称 | 说 明 |
auth(LOG AUTH) | 安全和认证相关消息 (不推荐使用authpriv替代) |
authpriv(LOG_AUTHPRIV) | 安全和认证相关消息(私有的) |
cron (LOG_CRON) | 系统定时任务cront和at产生的日志 |
daemon (LOG_DAEMON) | 与各个守护进程相关的曰志 |
ftp (LOG_FTP) | ftp守护进程产生的曰志 |
kern(LOG_KERN) | 内核产生的曰志(不是用户进程产生的) |
Iocal0 ~ local7 (LOG_LOCAL0-7) | 为本地使用预留的服务 |
lpr (LOG_LPR) | 打印产生的日志 |
mail (LOG_MAIL) | 邮件收发信息 |
news (LOG_NEWS) | 与新闻服务器相关的日志 |
syslog (LOG_SYSLOG) | 存syslogd服务产生的曰志信息(虽然服务名称己经改为reyslogd,但是很多配罝依然沿用了 syslogd服务的,所以这里并没有修改服务名称) |
user (LOG_USER) | 用户等级类别的日志信息 |
uucp (LOG_UUCP> | uucp子系统的日志信息,uucp是早期Linux系统进行数据传递的协议,后来 也常用在新闻组服务中 |
4.2.2 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
4.2.3 rsyslog 配置文件
/etc/rsyslog.conf配置文件格式(由三部分组成):
- MODULES:相关模块配置
- GLOBAL DIRECTIVES:全局配置
- RULES:日志记录相关的规则配置
查看/etc/rsyslog.conf 文件中的RULES模块:
RULES配置格式:
facility.priority; #分类 优先级 # priority 的表示 # *: 所有级别 none:没有级别,即不记录 PRIORITY:指定级别(含)以上的所有级别 =PRIORITY:仅记录指定级别的日志信息 文件路径:通常在/var/log/,文件路径前的-表示异步写入。 用户:将日志事件通知给指定的用户,* 表示登录的所有用户。 日志服务器:@host,把日志送往至指定的远程UDP日志服务器;@@host,将日志发送到远程TCP日志服务器。 管道: | COMMAND,转发给其它命令处理。 复制代码
4.3 rsyslog 应用实例
4.3.1 将ssh服务的日志单独设置
实验步骤:
步骤1:修改rsyslog服务的配置文件/etc/rsyslog.conf,设置LOCAL0对应的日志路径。
[root@localhost ~]# vim /etc/rsyslog.conf ------------------------ local0.* /var/log/sshd.log 复制代码
步骤2:修改ssh服务的配置文件/etc/ssh/sshd_config,将ssh的日志修改为记录在LOCAL0对应的路径下。
(ssh服务的日志默认放在authpriv服务对应的路径下,需先将该行注释掉。)
[root@localhost ~]# vim /etc/ssh/sshd_config ------------------------ #SyslogFacility AUTHPRIV //原路径,注释掉这一行 SyslogFacility LOCAL0 //添加自定义路径 复制代码
步骤3:重启 rsyslog 服务和 ssh 服务。
[root@localhost ~]# systemctl restart {rsyslog,sshd} 复制代码
步骤4:打开第二台机器,远程连接原服务器。故意输错2次密码,稍后查看原服务器的日志。
[root@192 ~]# ssh 192.168.72.10 root@192.168.72.10's password: Permission denied, please try again. root@192.168.72.10's password: Permission denied, please try again. root@192.168.72.10's password: 复制代码
步骤5:查看原服务器的日志记录。/var/log/sshd.log 成功记录了第二台机器的行为。
[root@localhost ~]# tail -3 /var/log/sshd.log Mar 12 01:32:04 localhost sshd[8398]: Connection closed by 192.168.72.129 port 55592 [preauth] Mar 12 01:32:29 localhost sshd[9433]: Failed password for root from 192.168.72.129 port 55594 ssh2 Mar 12 01:32:48 localhost sshd[9433]: Failed password for root from 192.168.72.129 port 55594 ssh2 复制代码
4.3.2 网络日志(远程日志功能)
远程日志,即通过网络,将本地的日志远程备份到另一台机器,这样,就算本机系统崩溃,我们可以查看另一台机器备份的日志,来排查故障。
实验思路:
假设服务器A需要将日志备份到服务器B,那么A是发送方,B是接收方。
接收方需要开启TCP功能(或UDP功能)和514接口,发送方需填写想要传输的日志和接收方的地址。
实验步骤:
步骤1:接收方开启TCP功能和514端口(编辑rsyslog的配置文件 /etc/rsyslog.conf)。
关闭防火墙;
编辑配置文件,开启TCP功能和514端口(去掉这两行原有的#号);
重启rsyslog 服务;
检查514端口是否开启。
[root@192 ~]# systemctl stop firewalld //关闭防火墙 [root@192 ~]# vim /etc/rsyslog.conf //编辑配置文件 ------------------------ # Provides TCP syslog reception $ModLoad imtcp //开启TCP功能 $InputTCPServerRun 514 //开启514端口 [root@192 ~]# systemctl restart rsyslog //重启日志服务 [root@192 ~]# ss -ntap | grep 514 //检查514端口是否开启 LISTEN 0 25 *:514 *:* users:(("rsyslogd",pid=12528,fd=3)) FIN-WAIT-2 0 0 192.168.72.129:514 192.168.72.10:42556 LISTEN 0 25 :::514 :::* users:(("rsyslogd",pid=12528,fd=4)) 复制代码
步骤2:发送方填写需要传输的日志和接收方的IP地址(编辑配置文件 /etc/rsyslog.conf)。
关闭防火墙;
编辑配置文件,填写需要传输的日志和接收方地址;
重启rsyslog 服务;
测试日志打印。
(@地址表示使用UDP功能;@@地址表示使用TCP地址)
[root@localhost log]# systemctl stop firewalld //关闭防火墙 [root@localhost log]# vim /etc/rsyslog.conf //编辑配置文件 ------------------------ *.info;mail.none;authpriv.none;cron.none @@192.168.72.129 [root@localhost log]# systemctl restart rsyslog //重启日志服务 [root@localhost log]# logger "this test 777777" //测试日志打印 [root@localhost log]# tail -1 /var/log/messages //查看日志记录 Mar 8 12:14:51 localhost root: this test 777777 复制代码
步骤3:查看接收方能否成功接收日志记录。
接收方服务器成功记录测试日志。
[root@192 ~]# grep 7777 /var/log/messages Mar 8 12:12:44 localhost root: this test 777777 Mar 8 12:14:51 localhost root: this test 777777 Mar 8 12:21:20 localhost root: this test 777777 Mar 8 12:23:30 localhost root: this test 777777 复制代码
5 日志管理工具 journalctl
CentOS 7 以后,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核及系统日志和应用日志)。
日志的配置文件:
/etc/systemd/journald.conf 复制代码
journalctl命令格式:
journalctl [OPTIONS...] [MATCHES...] 复制代码
示例:
1)journalctl,查看所有日志。 默认情况下,只保存本次启动的日志。
[root@localhost ~]# journalctl | head -- Logs begin at 六 2022-03-12 18:55:23 CST, end at 六 2022-03-12 19:05:17 CST. -- 3月 12 18:55:23 localhost.localdomain systemd-journal[87]: Runtime journal is using 8.0M (max allowed 91.1M, trying to leave 136.7M free of 903.6M available → current limit 91.1M). 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuset 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpu 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuacct 3月 12 18:55:23 localhost.localdomain kernel: Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017 3月 12 18:55:23 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-693.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet 3月 12 18:55:23 localhost.localdomain kernel: Disabled fast string operations 3月 12 18:55:23 localhost.localdomain kernel: e820: BIOS-provided physical RAM map: 3月 12 18:55:23 localhost.localdomain kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable 复制代码
2)journalctl -k, 只查看内核日志(不显示应用日志)。
[root@localhost ~]# journalctl -k |head -- Logs begin at 六 2022-03-12 18:55:23 CST, end at 六 2022-03-12 19:13:14 CST. -- 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuset 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpu 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuacct 3月 12 18:55:23 localhost.localdomain kernel: Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017 3月 12 18:55:23 localhost.localdomain kernel: Command line: BOOT_IMAGE=/vmlinuz-3.10.0-693.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet 3月 12 18:55:23 localhost.localdomain kernel: Disabled fast string operations 3月 12 18:55:23 localhost.localdomain kernel: e820: BIOS-provided physical RAM map: 3月 12 18:55:23 localhost.localdomain kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable 3月 12 18:55:23 localhost.localdomain kernel: BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved 复制代码
3)journalctl -b ,查看本次启动的日志。
journalctl -b -0,查看本次启动的日志。
journalctl -b -1,查看上一次启动的日志。
以此类推。
[root@localhost ~]# journalctl -b -0 |head -5 //查看本次启动的日志 -- Logs begin at 六 2022-03-12 18:55:23 CST, end at 六 2022-03-12 19:20:01 CST. -- 3月 12 18:55:23 localhost.localdomain systemd-journal[87]: Runtime journal is using 8.0M (max allowed 91.1M, trying to leave 136.7M free of 903.6M available → current limit 91.1M). 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuset 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpu 3月 12 18:55:23 localhost.localdomain kernel: Initializing cgroup subsys cpuacct 复制代码
4)查看指定时间的日志。
journalctl --since="2022-03-05 18:10:30" journalctl --since "20 min ago" journalctl --since yesterday journalctl --since "2022-03-05" --until "2022-03-10 03:00" journalctl --since 09:00 --until "1 hour ago" 复制代码
5) journalctl -n <数字>,显示尾部指定行数。默认10行。
journalctl -n //显示尾部的最新10行日志 journalctl -n 20 //显示尾部的最新20行日志 复制代码
6)journalctl -f,实时滚动显示最新日志(显示最新10行)
[root@localhost ~]# journalctl -f -- Logs begin at 六 2022-03-12 18:55:23 CST. -- 3月 12 19:11:12 localhost.localdomain systemd[1]: Starting Cleanup of Temporary Directories... 3月 12 19:11:12 localhost.localdomain systemd[1]: Started Cleanup of Temporary Directories. 3月 12 19:13:14 localhost.localdomain chronyd[815]: Selected source 111.230.189.174 3月 12 19:20:01 localhost.localdomain systemd[1]: Started Session 6 of user root. 3月 12 19:20:01 localhost.localdomain systemd[1]: Starting Session 6 of user root. 3月 12 19:20:01 localhost.localdomain CROND[20970]: (root) CMD (/usr/lib64/sa/sa1 1 1) 3月 12 19:30:01 localhost.localdomain systemd[1]: Started Session 7 of user root. 3月 12 19:30:01 localhost.localdomain systemd[1]: Starting Session 7 of user root. 3月 12 19:30:01 localhost.localdomain CROND[33816]: (root) CMD (/usr/lib64/sa/sa1 1 1) 3月 12 19:32:32 localhost.localdomain chronyd[815]: Source 84.16.67.12 replaced with 139.199.214.202 复制代码
7) 查看指定服务的日志
journalctl /usr/lib/systemd/systemd 复制代码
8)查看指定进程的日志
journalctl _PID=1 //查看某个路径的脚本的日志 journalctl /usr/bin/bash 复制代码
9)查看指定用户的日志
journalctl _UID=33 --since today 复制代码
10)查看某个 Unit 的日志;
实时滚动显示某个 Unit 的最新日志
journalctl -u nginx.service journalctl -u nginx.service --since today journalctl -u nginx.service -f //实时滚动显示某个 Unit 的最新日志 复制代码
11)合并显示多个 Unit 的日志
journalctl -u nginx.service -u php-fpm.service --since today 复制代码
12)查看指定优先级的日志,表示仅显示小于或等于此等级的日志 (也就是重要程度等于或高于此等级的日志)。
共有8级 0: emerg 1: alert 2: crit 3: err 4: warning 5: notice 6: info 7: debug journalctl -p 3 -b //显示重要程度等于和高于err的日志 复制代码
13)其他选项
#日志默认分页输出,--no-pager 改为正常的标准输出 journalctl --no-pager #以 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