描述系统日志架构
系统日志:是为了记录进程和操作系统内核为发生事件,这些日志用来审计和问题的故障排查
- 日志一般保留在/var/log中,可以使用less和tail命令查看日志
- RHEL中内置了基于syslog协议的标准日志记录系统
- systemd-journald和rsyslog服务处理RHEL8中的syslog
- systemd-journald服务是操作系统时间日志架构的核心,默认该日志存储在系统重启后不保留的文件系统上。
- rsyslog服务对syslog消息进程排序,并存放在/var/log中
- 常用的系统日志文件
-- /var/log/messages:大多数系统日志消息记录在此处。包括身份信息验证、电子邮件处理和调度作业执行相关的信息以及纯粹与调试相关的syslog信息
-- /var/log/secure:与安全性和身份验证时间相关的syslog消息
-- /var/log/maillog:与邮件服务器相关的syslog日志
-- /var/log/cron:与调度作业执行相关的syslog消息
-- /var/log/boot.log:与系统启动相关的非syslog控制台消息
查看系统日志文件
- 许多程序使用syslog协议将事件记录到系统。
- 每一日志消息根据设备(消息的类型)和优先级(消息的严重性)分类
-- 消息的类型
-- 消息的严重程度
- rsyslog服务使用日志消息的设备和优先级来确定如何进行处理
- 配置文件为/etc/rsyslog.conf和/etc/rsyslog.d/*.conf中
vim /etc/rsyslog.conf
#该文件的规则编写
设备名.优先级 日志存放的位置以及文件名
... ...
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
... ...
- 测试编写一个rsyslog配置文件(如果一个自己开发的服务,可以自己去编写日志规则,存放在指定目录中)
[root@serverb ~]# vim /etc/rsyslog.d/all.conf
*.* /var/log/all.log #所有设备所有优先级的日志,存放在/var/log/all.log中
#重启服务加载配置
[root@serverb ~]# systemctl restart rsyslog.service
#查看
[root@serverb ~]# ls -l /var/log/all.log
-rw-------. 1 root root 796 Apr 27 19:20 /var/log/all.log
- 日志的轮转
logrotate工具会轮转日志文件,以防止它们在含有/var/log目录文件系统占用太多空间
cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly #每个礼拜轮转一次
# keep 4 weeks worth of backlogs
rotate 4 #4次轮转
# create new (empty) log files after rotating old ones
create #轮转后创建一个空的日志文件
# use date as a suffix of the rotated file
dateext #使用日期来后缀命名轮转文件
#做一次轮转
]# logrotate -f /etc/logrotate.conf
- 分析rsyslog日志条目
-- 日志开头为最早的日志信息,结尾为最新的日志信息
-- rsyslog服务在日志文件中记录条目时采用一种标准的格式,如下:
(1)Apr 27 18:56:58 (2)serverb (3)systemd: (4)Started The Apache HTTP Server.
(1):记录该日志条目的时间戳
(2):发送该日志消息的主机
(3):发送该日志消息的程序或进程名称和PID编号
(4):发送的实际消息
- 监控日志
-- 使用tail命令可以监控日志
]# tail -f /var/log/messages
#可以直接看日志打印
- 手动发送syslog消息
logger命令可以发送消息到rsyslog服务。默认情况下,它将优先级为notice。
(mail.info)的消息发送给mail设备,除非通过-p选项另有指定。这是对测试rsyslog服务配置更改很有用
[root@serverb rsyslog.d]# logger -p mail.info "test log"
[root@serverb rsyslog.d]# tail -1 /var/log/maillog
Apr 28 00:24:56 serverb root: test log
查看系统日志条目
- 查找事件
-- systemd-journald服务将日志数据存储在带有索引的结构化二进制文件中,该文件称为日志
-- 要从日志文件中检索日志消息,使用journalctl命令
-- journalctl命令突出显示重要的日志消息:优先级为notice或warning的消息显示为粗体文本,error消息则显示红色文本。
[root@serverb ~]# journalctl #普通用户使用该命令可能会被限制查看某些消息
-- Logs begin at Wed 2023-03-22 20:06:02 CST, end at Fri 2023-04-28 00:24:56 CST. --
Mar 22 20:06:02 localhost.localdomain systemd-journal[96]: Runtime journal is using 8.0M (max allowed 91.8M, trying to leave 137.8M free of 910.9M availabl
Mar 22 20:06:02 localhost.localdomain kernel: Initializing cgroup subsys cpuset
Mar 22 20:06:02 localhost.localdomain kernel: Initializing cgroup subsys cpu
Mar 22 20:06:02 localhost.localdomain kernel: Initializing cgroup subsys cpuacct
... ... #退出按q
[root@serverb ~]# journalctl -n #-n选项默认显示最后10行消息
-- Logs begin at Wed 2023-03-22 20:06:02 CST, end at Fri 2023-04-28 00:24:56 CST. --
Apr 27 23:01:01 serverb run-parts(/etc/cron.hourly)[30783]: starting 0anacron
Apr 27 23:01:01 serverb run-parts(/etc/cron.hourly)[30789]: finished 0anacron
Apr 28 00:01:01 serverb systemd[1]: Started Session 209 of user root.
Apr 28 00:01:01 serverb CROND[1283]: (root) CMD (run-parts /etc/cron.hourly)
Apr 28 00:01:01 serverb run-parts(/etc/cron.hourly)[1286]: starting 0anacron
Apr 28 00:01:01 serverb anacron[1293]: Anacron started on 2023-04-28
Apr 28 00:01:01 serverb anacron[1293]: Normal exit (0 jobs run)
Apr 28 00:01:01 serverb run-parts(/etc/cron.hourly)[1295]: finished 0anacron
Apr 28 00:23:19 serverb root[2380]: log entry created on host
Apr 28 00:24:56 serverb root[2461]: test log
[root@serverb ~]# journalctl -n 5 #显示最后5行命令
-- Logs begin at Wed 2023-03-22 20:06:02 CST, end at Fri 2023-04-28 00:24:56 CST. --
Apr 28 00:01:01 serverb anacron[1293]: Anacron started on 2023-04-28
Apr 28 00:01:01 serverb anacron[1293]: Normal exit (0 jobs run)
Apr 28 00:01:01 serverb run-parts(/etc/cron.hourly)[1295]: finished 0anacron
Apr 28 00:23:19 serverb root[2380]: log entry created on host
Apr 28 00:24:56 serverb root[2461]: test log
[root@serverb ~]# journalctl -f #与tail -f命令相似,新日志会持续输出
-- Logs begin at Wed 2023-03-22 20:06:02 CST. --
Apr 27 23:01:01 serverb run-parts(/etc/cron.hourly)[30783]: starting 0anacron
Apr 27 23:01:01 serverb run-parts(/etc/cron.hourly)[30789]: finished 0anacron
Apr 28 00:01:01 serverb systemd[1]: Started Session 209 of user root.
Apr 28 00:01:01 serverb CROND[1283]: (root) CMD (run-parts /etc/cron.hourly)
Apr 28 00:01:01 serverb run-parts(/etc/cron.hourly)[1286]: starting 0anacron
Apr 28 00:01:01 serverb anacron[1293]: Anacron started on 2023-04-28
Apr 28 00:01:01 serverb anacron[1293]: Normal exit (0 jobs run)
Apr 28 00:01:01 serverb run-parts(/etc/cron.hourly)[1295]: finished 0anacron
Apr 28 00:23:19 serverb root[2380]: log entry created on host
Apr 28 00:24:56 serverb root[2461]: test log
-- 为了帮助问题进行故障排查,可能需要根据日志条目的优先级过滤日志输出,可以使用journalctl -p跟上优先级
[root@serverb ~]# journalctl -p err
-- Logs begin at Wed 2023-03-22 20:06:02 CST, end at Fri 2023-04-28 00:24:56 CST. --
Mar 22 21:09:21 serverb sudo[1867]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/bin/bash
Mar 22 21:14:39 serverb sudo[1879]: pam_unix(sudo-i:auth): conversation failed
Mar 22 21:14:39 serverb sudo[1879]: pam_unix(sudo-i:auth): auth could not identify password for [user]
Mar 22 21:14:41 serverb sudo[1879]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/bin/bash
Mar 22 21:16:45 serverb sudo[1915]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/bin/bash
Mar 22 21:24:55 serverb sudo[2045]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/bin/bash
Mar 22 21:37:42 serverb sudo[2127]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/bin/bash
Mar 22 21:37:50 serverb sudo[2136]: user : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/bin/bash
-- 查找具体的事件时,可以将输出限制为特定时间段,journalctl有两个选项--since和--until
[root@myhost ~]# journalctl --since today #查看今天的日志
#查看某段时间内的日志
[root@myhost ~]# journalctl --since "2023-03-29 15:30:00" --until "2023-03-29 15:31:00"
#指定上一个小时的所有条目
[root@myhost ~]# journalctl --since "-1 hour"
-- 除了日志的可见内容外,还附带了只有在打开详细输出时才可看到的字段
[root@myhost ~]# journalctl -o verbose -n 5
-- Logs begin at 四 2023-03-23 02:50:43 CST, end at 三 2023-03-29 20:21:19 CST. --
三 2023-03-29 20:21:09.392742 CST [s=4c65ae0d4aca4a79bbc335f97a66e398;i=3b60b;b=3830503512c342b99707e67f0fb4dda2;m=8e1455b4cf;t=5f80902d3f716;x=ed5e1382354
_UID=0 #是运行该进程的用户的UID
_GID=0
_CAP_EFFECTIVE=1fffffffff
_BOOT_ID=3830503512c342b99707e67f0fb4dda2
_MACHINE_ID=8027a11a7d0e40e7b63b463062feb818
_HOSTNAME=myhost
_TRANSPORT=syslog
PRIORITY=3
SYSLOG_FACILITY=10
SYSLOG_IDENTIFIER=agetty
MESSAGE=/dev/ttyS0: not a tty
_COMM=agetty #命令名称
_EXE=/usr/sbin/agetty #是进程的可执行文件的路径
_CMDLINE=/sbin/agetty --keep-baud 115200,38400,9600 ttyS0 vt220
_SYSTEMD_CGROUP=/system.slice/system-serial\x2dgetty.slice/serial-getty@ttyS0.service
_SYSTEMD_UNIT=serial-getty@ttyS0.service #启动该进程的systemd单元
_SYSTEMD_SLICE=system-serial\x2dgetty.slice
SYSLOG_PID=12112
_PID=12112 #是进程的PID
_SOURCE_REALTIME_TIMESTAMP=1680092469392742
... ...
-- 可以组合多个系统日志字段,以便在运行journalctl命令时形成精细的搜索查询。
[root@myhost ~]# journalctl _SYSTEMD_UNIT=sshd.service _PID=2041
-- Logs begin at 四 2023-03-23 02:50:43 CST, end at 三 2023-03-29 20:28:30 CST. --
3月 28 20:45:32 myhost sshd[2041]: Accepted password for root from 192.168.2.142 port 51637 ssh2
保留系统日志
- 永久存储系统日志
-- 默认情况下,日志保留在/run/log/journal中,重启后日志会被清除;
-- 可以在/etc/systemd/journald.conf中更改systemd-journald的服务的配置,将日志在系统重启后保留下来;
-- 修改的参数有persistent(永久存储在/var/log/journal中)、volatile(将日志存储在易失的/run/log/journal目录中)或auto(如果存在/var/log/journal目录,那么rsyslog会持久存储,此为默认选项);
-- systemd-journald虽然是持久保存,但是并非永久保留,该服务内置的轮转机制,每个月触发一次且不超过文件系统的10%以及保证文件系统有至少15%可用空间。 - 配置持久系统日志
#修改配置文件
[root@myhost ~]# vim /etc/systemd/journald.conf
[Journal]
Storage=persistent
... ...
#重启服务,使配置生效
[root@myhost ~]# systemctl restart systemd-journald.service
#此时/var/log/journal目录已创建
[root@myhost ~]# ls /var/log/journal/
8027a11a7d0e40e7b63b463062feb818
#只输出上次启动的日志
[root@myhost ~]# journalctl -b 1
维护准确的时间
对于多个系统间分析日志文件而言,正确同步系统时间至关重要。网络时间协议(NTP)是计算机通过互联网提供并获取正确时间信息的一种标准方法。
- timedatectl命令简要显示当前的时间相关系统设置,如系统的当前时间、时区和NTP同步设置。
- 系统还提供包含时区的数据库
[root@serverb ~]# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
... ...
- 可以使用timedatectl set-timezones来设置时区
- 可以使用timedatectl set-time来设置本地时间
[root@serverb ~]# timedatectl set-time 21:03
[root@serverb ~]# timedatectl
Local time: Fri 2023-04-28 21:03:02 CST
- 可以使用timedatectl set-ntp命令来启用和禁用NTP同步
- 配置和监控chronyd
-- RHEL8+默认使用chronyd服务向NTP服务同步时间,使通常不准确的本地硬件时钟(RTC)保持正确运行;
-- 如果没有可用网络连接,chronyd将计算RTC时钟漂移,记录在/etc/chronyd.conf配置文件指定的driftfile变量中
#安装chrony包
[root@serverb ~]# dnf install -y chrony
#修改时间源
[root@serverb ~]# vim /etc/chrony.conf
... ...
server ntp.aliyun.com iburst #可以使用网络时间源或指定某一台时间服务器
... ...
#重启生效
[root@serverb ~]# systemctl restart chronyd
- chronyc命令充当chronyd服务的客户端,设置ntp同步后,应当使用chronyc sources命令验证本地系统是否使用ntp服务无缝同步系统时间
[root@serverb ~]# 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
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 377 60 -714us[-1315us] +/- 20ms