一、一些基本知识
1.日志文件是什么?
进程和操作系统内核需要能够为发生的事件记录日志,这些日志可用于系统审核和问题的故障排除。
日志简单的说就是记录系统活动信息的几个文件,例如:何时、何地(来源IP)、何人(什么服务名称)、做了什么操作(信息日志)。换句话说就是:记录系统在什么时候由哪个进程做了什么样的行为时,发生了何种的事件等。
2.日志文件的重要性
我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。
收集你想要的数据,分析出有价值的信息,可以提高系统、产品的安全性,可以帮助开发完善代码,优化产品。
日志会成为在事故发生后查明“发生了什么”的一个很好的“取证”信息来源。日志可以为审计进行审计跟踪。系统用久了偶尔也会出现一些错误,我们需要日志来给系统排错,在一些网络应用服务不能正常工作的时候,我们需要用日志来做问题定位。
3.一般日志永久的存储在linux中存放在/var/log/中。
4.Linux常见的日志文件名
/var/log/messages | 服务信息日志,大多数系统日志信息记录在此处 |
---|---|
/var/log/secure | 安全和身份认证相关的消息和错误的日志文件 |
/var/log/cron | 与定时任务相关的日志文件 |
/var/log/maillog | 与邮件相关的日志文件 |
/var/log/boot.log | 与系统启动有关的日志文件 |
日志类型分类
auth | pam产生的日志 |
---|---|
authpriv | ssh,ftp等登录信息的验证信息 |
cron | 时间任务相关,就是例行工作调度cron/at 等生成信息日志的地方 |
kern | 内核产生信息的地方 |
lpr | 打印相关的信息 |
邮件收发相关的信息记录 | |
mark(syslog)-rsyslog | 服务内部的信息,时间标识 |
news | 与新闻组服务器相关的东西 |
user | 用户程序产生的相关信息 |
uucp | unix to unix copy,unix主机之间相关的通讯 |
local 1~7 | 自定义的日至设备 |
日志级别分类
debug | 有调式信息的,日志信息最多 |
---|---|
Info | 一般信息的日志,最常用 |
notice | 最具有重要性的普通条件的信息(除了info外还需要注意的一些信息内容) |
warning | 警告的信息,可能有问题,但是还不至于影响到某个daemon运行的信息;基本上,info,notice,warning 这三个信息都是告知一些基本信息而已,应该还不至于造成一些系统运行的困扰 |
err | 一些重大的错误信息,例如配置文件的某些设置造成该服务无法启动的信息说明,通常通过err 错误告知,应该可以了解到该服务无法启动的问题 |
crit | 严重级别,比err 还严重的错误信息,阻止整个系统或者软件不能正常工作的信息 |
alert | 警告,已经很有问题,比crit 还要严重,需要立刻修改的信息 |
emerg | 内核崩溃等严重信息,意指系统已经几乎要死机的状态,很严重的错误信息。通常大概只有硬件出问题导致整个内核无法顺利运行,就会出现这样的等级的信息 |
None | 什么都不记录 |
注意:从上到下,级别从高到低,记录的信息越来越少
详情见:man 3 syslog
二、rsyslog服务
1.rsyslog 服务是一个开元工具,被广泛用于 Linux 系统以通UDP/
TCP协议转发或接收日志消息。
示例一:rsyslog 进行日志采集
[root@node1 ~]# systemctl status rsyslog.service
rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled)
Active: active (running) since Mon 2019-10-21 06:54:47 EDT; 12s ago
Main PID: 480 (rsyslogd)
CGroup: /system.slice/rsyslog.service
└─480 /usr/sbin/rsyslogd -n
Oct 21 06:54:47 node1.example.com systemd[1]: Started System Logging Service.
[root@node1 ~]# systemctl stop rsyslog.service
[root@node1 ~]# > /var/log/messages
[root@node1 ~]# systemctl restart sshd.service
[root@node1 ~]# cat /var/log/messages
[root@node1 ~]# systemctl start rsyslog.service
[root@node1 ~]# cat /var/log/messages
Oct 21 06:56:03 node1 rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="1602" x-info="http://www.rsyslog.com"] start
Oct 21 06:56:03 node1 rsyslogd-2307: warning: ~ action is deprecated, consider using the 'stop' statement instead [try http://www.rsyslog.com/e/2307 ]
Oct 21 06:55:10 node1 systemd: Stopping System Logging Service...
Oct 21 06:55:10 node1 systemd: Stopped System Logging Service.
Oct 21 06:55:25 node1 fprintd: ** Message: No devices in use, exit
Oct 21 06:55:42 node1 systemd: Stopping OpenSSH server daemon...
Oct 21 06:55:42 node1 systemd: Starting OpenSSH server daemon...
Oct 21 06:55:42 node1 systemd: Started OpenSSH server daemon.
Oct 21 06:56:03 node1 systemd: Starting System Logging Service...
Oct 21 06:56:03 node1 systemd: Started System Logging Service.
实验发现,当rsyslog服务关闭时,在/var/log/messages 中将不记录日志信息,但是其实在内存中日志信息是记录了的,所以当rsyslog 服务重新打开时,会采集内存中产生的日志信息,并记录于/var/log/messages 中。
示例二:rsyslog 服务的日志采集规则设定
rsyslog 服务的主配置文件为 /ect/rsyslog.conf
实验将所有类型、所有级别的日志采集到/var/log/ahtl 中;
将auth类型的 info 类型(信息)日志,采集到/var/log/ahtm 中。
[root@node1 ~]# vim /etc/rsyslog.conf
[root@node1 ~]# systemctl restart rsyslog.service
[root@node1 ~]# ll /var/log/ahtl
-rw-r--r--. 1 root root 476 Oct 21 07:15 /var/log/ahtl
[root@node1 ~]# ll /var/log/ahtm
ls: cannot access /var/log/ahtm: No such file or directory
重启服务后不产生/var/log/ahtm 目录,因为/ahtm 中记录的是认证的信息,重启服务之后不产生认证信息。
在另一台主机中使用sshd 服务进行远程登陆,将产生登陆信息,/var/log/ahtm 目录将存在。
另一台主机:
[kiosk@foundation50 ~]$ ssh root@172.25.254.150
root@172.25.254.150's password:
Last login: Mon Oct 21 06:54:54 2019 from 172.25.254.50
[root@node1 ~]#
node1:
[root@node1 ~]# ll /var/log/ahtm
-rw-r--r--. 1 root root 66 Oct 21 07:21 /var/log/ahtm
[root@node1 ~]# cat /var/log/ahtm
Oct 21 07:21:09 node1 systemd-logind: New session 6 of user root.
在/var/log/ahtl 下也会记录该次的登陆信息日志,因为/var/log/ahtl 记录的是所有类型所有级别的信息。而比如重启系统中某个服务时,仅在/var/log/ahtl 中记录日志信息,而在/var/log/ahtl 中不记录。
示例三:日志的远程同步
准备两台主机,分别命名为node1.example.com 和node2.example.com ,将node1 作为接受方,node2 作为发送方。
使用man 5 rsyslog.conf 来查看日志的采集规则
在node2 (日志发送方):
Vim /etc/rsyslog.conf
“* . *” @172.25.254.122 ##”@”表示udp协议发送,“@@”表示tcp协议发送
Systemctl restart rsyslog
在node1 (日志接收方):
Vim /etc/rsyslog.conf
[root@node1 ~]# vim /etc/rsyslog.conf
[root@node1 ~]# systemctl restart rsyslog.service
[root@node1 ~]# netstat -antlupe | grep rsyslog
udp 0 0 0.0.0.0:514 0.0.0.0:* 0 54045 2789/rsyslogd
udp6 0 0 :::514 :::* 0 54046 2789/rsyslogd
[root@node1 ~]# systemctl stop firewalld.service
注意接收端需要关闭火墙。
测试:
在发送方和接收方都要清空日志文件
在node2(日志发送方):
[root@node2 ~]# > /var/log/messages
[root@node2 ~]# logger test
[root@node2 ~]# cat /var/log/messages
Oct 21 08:26:27 node2 root: test
在node1(日志接收方)将能查看到日志信息
示例三:日志采集格式的设定
在日志的生成端
vim /etc/rsysylog.conf
默认的日志采集格式
更改后的日志采集格式
其中:
%timegenerated% 显示日志时间
%FROMHOST-IP% 显示主机IP
%syslogtag% 日志记录目标
%msg% 日志内容
\n 换行
指定/var/log/messages 采集日志为 AHTL 格式
修改系统默认日志采集格式为 AHTL
2.系统时间调整工具 timedatectl
timedatectl 管理系统时间
timedatectl status ##显示当前时间信息
timedatectl set-time ##设定当前时间
timedatectl set-timezone ##设定当前时区
timedatectl set-local-rtc 0|1 ##设定是否在使用utc时间
timedatectl list-timezone ##查看支持的所有时区
timedatectl set-ntp true|false ##是否启用网络时间ntp
3.时间同步服务
node2 的时间
[root@node2 ~]# timedatectl set-time "2019-10-21 16:30:00"
[root@node2 ~]# date
Mon Oct 21 16:30:02 EDT 2019
node1 的时间
[root@node1 ~]# date
Mon Oct 21 12:29:23 EDT 2019
假设以node1 的时间为准
服务名称 chronyd
配置文件为 /etc/chrony.conf
在node1 :
22 允许哪些客户端来同步本机的时间
29 本机不同不任何主机的时间,本机作为时间源
[root@node1 ~]# vim /etc/chrony.conf
[root@node1 ~]# systemctl restart chronyd.service
[root@node1 ~]# systemctl stop firewalld.service
在node2:
iburst 表示服务重启后立即同步172.25.254.150 的时间
发现node2 中时间发生同步
[root@node2 ~]# chronyc sources -v
210 Number of sources = 1
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| / xxxx = adjusted offset,
|| Log2(Polling interval) -. | yyyy = measured offset,
|| \ | zzzz = estimated error.
|| | |
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 172.25.254.150 10 6 17 64 +1636ns[ +19us] +/- 967us
3.journalctl 命令的用法
journalctl ##日志查看工具
journalctl -n 3 ##查看最近3条日志
journalctl -p err ##查看错误日志
journalctl -verbose ##查看日志详细参数
journalctl --since ##查看从什么时间开始的日志
journalctl --since time --until time ##查看从什么时间开始到什么时间结束的日志
查看进程的详细信息
journalctl -o verbose 查看日志的详细参数
journalctl 后接相应的参数
4.利用systemd-journal 采集日志
默认systemd-journald是不保存系统日志到硬盘的
那么那么关机后再次开机只能看到本次开机之后的日志
上一次关机之前的日志是无法查看的
经过设定,我们可以永久保存系统日志到硬盘
在硬盘创建一个区域,专门存放journal采集日志(只能查看之前日志)
[root@node2 ~]# mkdir /var/log/journal
[root@node2 ~]# chgrp systemd-journal /var/log/journal/ ##系统初始化程序控制这个日志,改这个文件的所有组为systemd-journal,这样系统就能识别这个文件了
[root@node2 ~]# chmod 2755 /var/log/journal/ ##使在该目录下产生的文件都属于systemd-journal这个组
[root@node2 ~]# killall -1 systemd-journald ##在进程不关闭的情况下刷新进程
[root@node2 ~]# cd /var/log/journal/
[root@node2 journal]# ls
946cb0e817ea4adb916183df8c4fc817 ##当前主机的机器码
[root@node2 journal]# bootctl
System:
Machine ID: 946cb0e817ea4adb916183df8c4fc817
Boot ID: 243b06765d364542afefaf7d18f97031
No suitable data is provided by the boot manager. See:
http://www.freedesktop.org/wiki/Software/systemd/BootLoaderInterface
http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec
for details.
当机器码生成后,日志将采集到硬盘里,重启后发现关机前的日志信息依然还在。