2023-03-25分析和存储日志

描述系统日志架构

系统日志:是为了记录进程和操作系统内核为发生事件,这些日志用来审计和问题的故障排查

  • 日志一般保留在/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协议将事件记录到系统。
  • 每一日志消息根据设备(消息的类型)和优先级(消息的严重性)分类
    -- 消息的类型
image.png

-- 消息的严重程度

image.png
  • 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同步设置。
image.png
  • 系统还提供包含时区的数据库
[root@serverb ~]# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
... ...
  • 可以使用timedatectl set-timezones来设置时区
image.png
  • 可以使用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同步
image.png
  • 配置和监控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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容