美文网首页
RH214|第十一章 分析和存储日志

RH214|第十一章 分析和存储日志

作者: Hi_小熊 | 来源:发表于2020-04-15 22:57 被阅读0次

    描述系统日志架构

    目标

    完成本节内容后,你能够描述Red Hat Enterprise Linux用于记录事件的基本日志架构。

    系统登录

    进程和操作系统内核记录了发生的事件的日志。这些日志用于审计系统和排除故障。

    许多系统将事件的日志记录在文本文件中,保存在/var/log目录下。这些日志可以用普通的文本工具来检查,比如lesstail

    Red Hat Enterprise Linux 中内置了一个基于 Syslog 协议的标准日志系统。许多程序都使用这个系统来记录事件并将其组织成日志文件。Systemd-journald和rsyslog服务处理Red Hat Enterprise Linux 8中的syslog消息。

    systemd-journald服务是操作系统事件记录架构的核心。它从许多来源收集事件消息,包括内核、启动进程早期阶段的输出、守护进程启动和运行时的标准输出和标准错误,以及系统日志事件。然后,它将它们重组成标准格式,并将它们写入一个结构化的、有索引的系统日志中。默认情况下,这个日志被存储在一个文件系统中,不会在重启时持续存在。

    但是,rsyslog服务会在systemd-journald收到的syslog消息到达时读取syslog消息。然后,它会处理syslog事件,将其记录到日志文件中,或者根据自己的配置将其转发到其他服务中。

    rsyslog服务将syslog消息分类并写入到/var/log中的日志文件中,这些消息在重启后会持续存在。rsyslog服务根据发送每个消息的程序类型或设施,以及每个syslog消息的优先级,将日志消息排序到特定的日志文件中。

    除了syslog消息文件之外,/var/log目录还包含系统上其他服务的日志文件。下表列出了/var/log目录中的一些有用的文件。

    选定的系统日志文件

    日志文件 储存的信息类型
    /var/log/messages 大多数系统日志消息都会在这里记录。例外情况包括与身份验证和电子邮件处理、计划任务执行有关的消息,以及那些纯粹与调试有关的消息。
    /var/log/secure 与安全和认证事件相关的Syslog消息。
    /var/log/maillog 与邮件服务器相关的Syslog消息。
    /var/log/cron 与定时任务执行相关的系统日志消息。
    /var/log/boot.log 与系统启动相关的非系统日志控制台消息。

    查看系统日志文件

    目标

    完成本节内容后,您应该能够解释相关系统日志文件中的事件以排除故障或查看系统状态。

    记录事件到系统中

    许多程序使用syslog协议将事件记录到系统中。 每个日志消息均按功能(消息的类型)和优先级(消息的严重性)分类。 可用的功能记录在rsyslog.conf(5)man page中。

    下表从高到低列出了标准的8个系统日志优先级。

    Syslog优先级概述

    代码 优先级 严重程度
    0 emerg 系统无法使用
    1 alert 必须立即采取行动
    2 crit 危急情况
    3 err 非严重错误条件
    4 warning 警告条件
    5 notice 正常但重要的事件
    6 info 信息事件
    7 debug 调试级消息

    rsyslog服务使用日志消息的设施和优先级来决定如何处理它们。这是由 /etc/rsyslog.conf 文件和 /etc/rsyslog.d 目录中的任何以 .conf 为扩展名的文件中的规则配置的。软件包可以通过在/etc/rsyslog.d目录下安装一个适当的文件来轻松地添加规则。

    每个控制如何对syslog消息进行排序的规则都是配置文件中的一行。每一行的左边表示该规则所匹配的系统日志消息的功能和严重程度。每行的右边表示要将日志消息保存在什么文件中(或在其他地方传递消息)。星号 (*) 是匹配所有值的通配符。

    例如,下面这一行将记录发送到 authpriv 工具的消息,以任何优先级记录到 /var/log/secure 文件中。

    authpriv.*                  /var/log/secure
    

    日志消息有时与rsyslog.conf中的多个规则匹配。 在这种情况下,一条消息存储在多个日志文件中。 为了限制存储的消息,优先级字段中的关键字none指示在指定的文件中不应存储有关所指示功能的消息。

    除了将syslog消息记录到文件中之外,还可以将它们打印到所有已登录用户的终端上。 rsyslog.conf文件具有一个设置,可将所有具有emerg优先级的syslog消息打印到所有已登录用户的终端。

    rsyslog规则示例

    #### 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
    

    日志文件切割

    logrotate工具可以切割日志文件,以防止它们在包含/var/log目录的文件系统中占用过多的空间。当一个日志文件被切割时,它将被重命名,并以一个扩展名表示它被轮换的日期。例如,旧的/var/log/messages文件可能会变成/var/log/messages-2019-01-30,如果在2019-01-30切割,那么旧的/var/log/messages-20190130就会变成/var/log/messages-20190130。一旦旧的日志文件被切割,就会创建一个新的日志文件,并通知写到它的服务。

    经过一定的切割次数后,一般在四周后,最老的日志文件会被丢弃,以释放磁盘空间。一个定时任务每天运行logrotate程序,查看是否有日志需要切割。大多数日志文件都是每周切割一次,但logrotate会切割一些速度较快的日志文件,或较慢的日志文件,或当它们达到一定的大小时,就会切割。

    本课程不介绍logrotate的配置。 有关更多信息,请参见logrotate(8)man page。

    分析syslog日志

    日志信息从最上面的最旧的信息开始,最新的信息在日志文件的最后。rsyslog服务在记录日志文件中的条目时,使用了一个标准格式。下面的例子解释了/var/log/secure日志文件中的日志消息的剖析。

    Feb 11 20:11:48 localhost sshd[1433]: Failed password for student from 172.25.0.10 port 59344 ssh2
    
    • 记录日志条目的文件的时间戳。
    • 发送日志消息的主机
    • 发送日志消息的程序或进程名称和PID号
    • 发送的信息

    监控日志

    监视一个或多个日志文件的事件,有助于重现问题和问题。tail -f /path/to/file 命令会输出指定的文件的最后10行,并在文件中写入新的行时继续输出。

    例如,为了监控登录失败的尝试,在一个终端中运行tail命令,然后在另一个终端中以root用户的身份运行ssh命令,当一个用户尝试登录系统时,以root用户的身份运行ssh命令。

    在第一个终端中,运行以下尾部命令:

    [root@host ~]# tail -f /var/log/secure
    

    在第二个终端中,运行下面的ssh命令:

    [root@host ~]# ssh root@localhost 
    root@localhost's password: redhat 
    ...output omitted...
    [root@host ~]# 
    

    返回到第一个终端,查看日志。

    ...output omitted...
    Feb 10 09:01:13 host sshd[2712]: Accepted password for root from 172.25.254.254  port 56801 ssh2
    Feb 10 09:01:13 host sshd[2712]: pam_unix(sshd:session): session opened for user  root by (uid=0)
    

    手动发送SYSLOG消息

    logger命令可以向rsyslog服务发送消息。默认情况下,它以notice优先级(user.notice)向user工具发送消息,除非用 -p 选项指定了其他选项。这对测试rsyslog服务配置的任何更改都很有用。

    要向记录在 /var/log/boot.log 文件中的 rsyslog 服务发送消息,请执行以下logger命令。

    [root@host ~]# logger -p local7.notice "Log entry created on host"
    

    审阅系统日志

    目标

    完成本节内容后,您能够在系统日志中找到并解释系统日志中的条目,以排除故障或查看系统状态。

    发现事件

    systemd-journald服务将日志数据存储在一个称为日志的结构化的、有索引的二进制文件中。这些数据包括关于日志事件的额外信息。例如,对于syslog事件,这包括工具和原始消息的优先级。

    要从日志中检索日志消息,请使用 journalctl 命令。您可以使用此命令查看日志中的所有消息,或根据各种选项和标准搜索特定事件。如果您以根用户身份运行该命令,您可以完全访问日志。普通用户也可以使用此命令,但可能会被限制查看某些消息。

    [root@host ~]# journalctl 
    ...output omitted...
    Feb 21 17:46:25 host.lab.example.com systemd[24263]: Stopped target Sockets.
    Feb 21 17:46:25 host.lab.example.com systemd[24263]: Closed D-Bus User Message Bus  Socket.
    Feb 21 17:46:25 host.lab.example.com systemd[24263]: Closed Multimedia System.
    Feb 21 17:46:25 host.lab.example.com systemd[24263]: Reached target Shutdown.
    Feb 21 17:46:25 host.lab.example.com systemd[24263]: Starting Exit the Session...
    Feb 21 17:46:25 host.lab.example.com systemd[24268]: pam_unix(systemduser:session): session c> Feb 21 17:46:25 host.lab.example.com systemd[1]: Stopped User Manager for UID  1001. Feb 21 17:46:25 host.lab.example.com systemd[1]: user-runtime-dir@1001.service:
     Unit not neede>
    Feb 21 17:46:25 host.lab.example.com systemd[1]: Stopping /run/user/1001 mount  wrapper... Feb 21 17:46:25 host.lab.example.com systemd[1]: Removed slice User Slice of UID  1001.
    Feb 21 17:46:25 host.lab.example.com systemd[1]: Stopped /run/user/1001 mount  wrapper. Feb 21 17:46:36 host.lab.example.com sshd[24434]: Accepted publickey for root from
     172.25.250.> Feb 21 17:46:37 host.lab.example.com systemd[1]: Started Session 20 of user root.
    Feb 21 17:46:37 host.lab.example.com systemd-logind[708]: New session 20 of user  root.
    Feb 21 17:46:37 host.lab.example.com sshd[24434]: pam_unix(sshd:session): session  opened for u> Feb 21 18:01:01 host.lab.example.com CROND[24468]: (root) CMD (run-parts /etc/ cron.hourly) Feb 21 18:01:01 host.lab.example.com run-parts[24471]: (/etc/cron.hourly) starting
     0anacron
    Feb 21 18:01:01 host.lab.example.com run-parts[24477]: (/etc/cron.hourly) finished
     0anacron lines 1464-1487/1487 (END) q
    
    

    journalctl 命令突出显示重要的日志消息:noticewarning优先级的消息用黑体字显示,而error优先级或更高的消息用红体字显示。

    成功使用日志进行故障排除和审核的关键是限制日志搜索以仅显示相关输出。

    默认情况下, journalctl -n 会显示最近10个日志条目。您可以通过指定要显示多少条日志条目的可选参数来调整。对于最近的五个日志条目,运行下面的 journalctl 命令。

    [root@host ~]# journalctl -n 5 
    -- Logs begin at Wed 2019-02-20 16:01:17 +07, end at Thu 2019-02-21 18:01:01 +07.
     -
     ...output omitted...
    Feb 21 17:46:37 host.lab.example.com systemd-logind[708]: New session 20 of user  root. Feb 21 17:46:37 host.lab.example.com sshd[24434]: pam_unix(sshd:session): session  opened for u> Feb 21 18:01:01 host.lab.example.com CROND[24468]: (root) CMD (run-parts /etc/ cron.hourly) Feb 21 18:01:01 host.lab.example.com run-parts[24471]: (/etc/cron.hourly) starting
     0anacron
    Feb 21 18:01:01 host.lab.example.com run-parts[24477]: (/etc/cron.hourly) finished
     0anacron 
     lines 1-6/6 (END) q
    

    tail -f 命令类似, journalctl -f 命令输出系统日志的最后 10 行,并在日志中写入新的日志条目时继续输出。要退出 journalctl -f 进程,请使用 Ctrl+C 组合键。

    [root@host ~]# journalctl -f
    -- Logs begin at Wed 2019-02-20 16:01:17 +07. --
    ...output omitted...
    Feb 21 18:01:01 host.lab.example.com run-parts[24477]: (/etc/cron.hourly) finished
     0anacron
    Feb 21 18:22:42 host.lab.example.com sshd[24437]: Received disconnect from
     172.25.250.250 port 48710:11: disconnected by user
    Feb 21 18:22:42 host.lab.example.com sshd[24437]: Disconnected from user root
     172.25.250.250 port 48710
    Feb 21 18:22:42 host.lab.example.com sshd[24434]: pam_unix(sshd:session): session  closed for user root Feb 21 18:22:42 host.lab.example.com systemd-logind[708]: Session 20 logged out.
     Waiting for processes to exit.
    Feb 21 18:22:42 host.lab.example.com systemd-logind[708]: Removed session 20.
    Feb 21 18:22:43 host.lab.example.com sshd[24499]: Accepted  publickey for root from 172.25.250.250 port 48714 ssh2: RSA  SHA256:1UGybTe52L2jzEJa1HLVKn9QUCKrTv3ZzxnMJol1Fro
    Feb 21 18:22:44 host.lab.example.com systemd-logind[708]: New session 21 of user  root. Feb 21 18:22:44 host.lab.example.com systemd[1]: Started Session 21 of user root. 
    Feb 21 18:22:44 host.lab.example.com sshd[24499]: pam_unix(sshd:session): session  opened for user root by (uid=0) 
    ^C
    [root@host ~]# 
    

    为了帮助排查问题,您可能希望根据日志条目的优先级来过滤日志的输出。journalctl -p 取一个优先级的名称或编号,显示该优先级及以上的日志条目。journalctl 命令可以理解 debug, info, notice, warning, err, crit, alertemerg 优先级。

    运行下面的 journalctl 命令来列出err优先级或更高的日志条目。

    [root@host ~]# journalctl -p err 
    -- Logs begin at Wed 2019-02-20 16:01:17 +07, end at Thu 2019-02-21 18:01:01 +07.
     --
     ..output omitted...
    Feb 20 16:01:17 host.lab.example.com kernel: Detected CPU family 6 model 13  stepping 3 Feb 20 16:01:17 host.lab.example.com kernel: Warning: Intel Processor - this  hardware has not undergone testing by Red Hat and might not be certif> 
    Feb 20 16:01:20 host.lab.example.com smartd[669]: DEVICESCAN failed: glob(3)  aborted matching pattern /dev/discs/disc* Feb 20 16:01:20 host.lab.example.com smartd[669]: In the system's table of devices
     NO devices found to scan 
     lines 1-5/5 (END) q
    

    在查找特定事件时,可以将输出限制在特定的时间范围内。journalctl 命令有两个选项可以将输出限制到特定的时间范围,即 --since--until 选项。这两个选项都需要一个时间参数,格式为 "YYY-MM-DD hh:mm:ss"(双引号是为了保留选项中的空间)。如果省略了日期,该命令假定为当前日期,如果省略了时间,该命令假定从00:00:00:00开始的整整一天。除了日期和时间字段外,这两个选项都以 yesterdaytoday,和 tomorrow 作为有效参数。

    运行下面的 journalctl 命令来列出今天记录中的所有日志条目。

    [root@host ~]# journalctl --since today 
    -- Logs begin at Wed 2019-02-20 16:01:17 +07, end at Thu 2019-02-21 18:31:14 +07.
     --
     ...output omitted...
    Feb 21 18:22:44 host.lab.example.com systemd-logind[708]: New session 21 of user  root. Feb 21 18:22:44 host.lab.example.com systemd[1]: Started Session 21 of user root. 
    Feb 21 18:22:44 host.lab.example.com sshd[24499]: pam_unix(sshd:session): session  opened for user root by (uid=0) 
    Feb 21 18:31:13 host.lab.example.com systemd[1]: Starting dnf makecache...
    Feb 21 18:31:14 host.lab.example.com dnf[24533]: Red Hat Enterprise Linux 8.0
     AppStream (dvd)    637 kB/s | 2.8 kB     00:00
    Feb 21 18:31:14 host.lab.example.com dnf[24533]: Red Hat Enterprise Linux 8.0
     BaseOS (dvd)       795 kB/s | 2.7 kB     00:00 
    Feb 21 18:31:14 host.lab.example.com dnf[24533]: Metadata cache created.
    Feb 21 18:31:14 host.lab.example.com systemd[1]: Started dnf makecache.
    lines 533-569/569 (END) q
    

    运行以下 journalctl 命令,列出从 2019-02-10 20:30:002019-02-13 12:00:00:00 的所有日志条目。

    [root@host ~]# journalctl --since "2014-02-10 20:30:00" --until "2014-02-13
     12:00:00" 
     ...output omitted...
    

    你也可以指定一个时间以来的所有条目相对于现在的所有条目。例如,要指定最近一个小时内的所有条目,可以使用以下命令。

    [root@host ~]# journalctl --since "-1 hour" 
    ...output omitted...
    

    除了日志的可见内容外,还有一些附加到日志条目上的字段,这些字段只有在开启了常规输出时才能看到。任何显示的额外字段都可以用来过滤日志查询的输出。这对于减少日志中某些事件的复杂搜索输出很有用。

    [root@host ~]# journalctl -o verbose 
    -- Logs begin at Wed 2019-02-20 16:01:17 +07, end at Thu 2019-02-21 18:31:14 +07.
     --
     ...output omitted...
    Thu 2019-02-21 18:31:14.509128 +07... 
        PRIORITY=6
        _BOOT_ID=4409bbf54680496d94e090de9e4a9e23
        _MACHINE_ID=73ab164e278e48be9bf80e80714a8cd5
        SYSLOG_FACILITY=3
        SYSLOG_IDENTIFIER=systemd
        _UID=0
        _GID=0
        CODE_FILE=../src/core/job.c
        CODE_LINE=826
        CODE_FUNC=job_log_status_message
        JOB_TYPE=start
        JOB_RESULT=done
        MESSAGE_ID=39f53479d3a045ac8e11786248231fbf
        _TRANSPORT=journal
        _PID=1
        _COMM=systemd
        _EXE=/usr/lib/systemd/systemd
        _CMDLINE=/usr/lib/systemd/systemd --switched-root --system --deserialize 18
        _CAP_EFFECTIVE=3fffffffff
        _SELINUX_CONTEXT=system_u:system_r:init_t:s0
        _SYSTEMD_CGROUP=/init.scope
        _SYSTEMD_UNIT=init.scope
        _SYSTEMD_SLICE=-.slice
        UNIT=dnf-makecache.service     MESSAGE=Started dnf makecache.
        _HOSTNAME=host.lab.example.com
        INVOCATION_ID=d6f90184663f4309835a3e8ab647cb0e
        _SOURCE_REALTIME_TIMESTAMP=1550748674509128 
    lines 32239-32275/32275 (END) q
    

    下面列出了系统日志的常用字段,可以用来搜索与特定过程或事件相关的行。

    • _COMM 命令的名称
    • _EXE 进程的可执行文件的路径
    • _PID 进程的PID
    • _UID 运行该进程的用户的UID
    • _SYSTEMD_UNIT 启动该进程的systemd单元

    可以用 journalctl 命令将多个系统日志字段组合起来,形成一个细粒度的搜索查询。例如,下面的 **journalctl **命令显示了来自 PID 1182 进程的所有与 sshd.service systemd 服务相关的日志条目。

    [root@host ~]# journalctl _SYSTEMD_UNIT=sshd.service _PID=1182 
    Apr 03 19:34:27 host.lab.example.com sshd[1182]: Accepted password for root  from ::1 port 52778 ssh2 
    Apr 03 19:34:28 host.lab.example.com sshd[1182]: pam_unix(sshd:session): session  opened for user root by (uid=0) 
    ...output omitted...
    

    保存系统日志

    目标

    完成本节内容后,您能够配置系统日志,以保存服务器重启时的事件记录。

    永久存储系统日志

    默认情况下,系统日志被保存在/run/log/journal目录下,这意味着当系统重启时,日志会被清除。你可以在/etc/systemd/journald.conf文件中更改systemd-journald服务的配置设置,使日志在重启时持续存在。

    /etc/systemd/journald.conf 文件中的存储参数定义了是以易失性方式存储系统日志,还是在重启时持久地存储系统日志。将此参数设置为persistentvolatileauto,方法如下。

    • persistent:将日志存储在/var/log/journal目录下,并在重启后持续存在。如果/var/log/journal目录不存在,systemd-journald服务将创建该目录。
    • volatile:将日志存储在易失性/ run / log / journal目录中。由于/run文件系统是临时性的,只存在于运行时内存中,所以存储在其中的数据,包括系统日志,在重启后不会持久化。
    • auto: rsyslog决定使用持久性存储还是易失性存储。如果/var/log/ journal目录存在,那么rsyslog使用持久性存储,否则使用易失性存储。如果没有设置存储参数,这是默认的操作。

    持久性系统日志的优点是在启动时可以立即获得历史数据。但是,即使有了持久化日志,也不是所有的数据都会永远保存。日志有一个内置的日志切割机制,每月触发一次。此外,在默认情况下,日志不允许获得大于它所处的文件系统的10%,也不允许留下少于15%的文件系统空闲的日志。这些值可以在/etc/systemd/journald.conf中对运行时和持久化日志进行调整。当systemdjournald进程启动时,当前对日志的大小限制会被记录下来。下面的命令输出显示了反映当前大小限制的日志条目。

    [user@host ~]$ journalctl | grep -E 'Runtime|System journal' 
    Feb 25 13:01:46 localhost systemd-journald[147]: Runtime journal (/run/log/journal/ae06db7da89142138408d77efea9229c) is 8.0M, max 91.4M, 83.4M free. 
    Feb 25 13:01:48 remotehost.lab.example.com systemd-journald[548]: Runtime journal  (/run/log/journal/73ab164e278e48be9bf80e80714a8cd5) is 8.0M, max 91.4M, 83.4M  free. 
    Feb 25 13:01:48 remotehost.lab.example.com systemd-journald[548]: System journal  (/var/log/journal/73ab164e278e48be9bf80e80714a8cd5) is 8.0M, max 3.7G, 3.7G free.
    Feb 25 13:01:48 remotehost.lab.example.com systemd[1]: Starting Tell Plymouth To  Write Out Runtime Data...
    Feb 25 13:01:48 remotehost.lab.example.com systemd[1]: Started Tell Plymouth To  Write Out Runtime Data.
    

    配置持久性系统日志

    要配置 systemd-journald 服务在重启时持久地保存系统日志,请在 /etc/systemd/journald.conf 文件中设置 Storage 为 persistent。以超级用户的身份运行你选择的文本编辑器来编辑 **/etc/systemd/journald.conf **文件。

    [Journal]
    Storage=persistent 
    ...output omitted...
    

    编辑配置文件后,重新启动systemd-journald服务,使配置更改生效。

    [root@host ~]# systemctl restart systemd-journald
    

    如果 systemd-journald 服务成功重启,可以看到 /var/log/ journal 目录被创建,并包含一个或多个子目录。这些子目录的长名中有十六进制字符,并包含*.journald文件。这些 *.journal 文件是二进制文件,用于存储结构化和索引化的日志条目。

    [root@host ~]# ls /var/log/journal
    73ab164e278e48be9bf80e80714a8cd5 
    [root@host ~]# ls /var/log/journal/73ab164e278e48be9bf80e80714a8cd5 
    system.journal  user-1000.journal
    

    当系统日志会在重启时持续存在,你会在 journalctl 命令的输出中得到大量的条目,其中包括当前系统启动和之前的条目。要将输出限制在特定的系统启动中,请使用 journalctl 命令的 -b 选项。下面的 journalctl 命令将检索仅限于第一次系统启动时的条目。

    [root@host ~]# journalctl -b 1 
    ...output omitted...
    

    下面的 journalctl 命令可以检索仅限于第二次系统启动时的条目。下面的参数只有在系统重启两次以上时才有意义:

    [root@host ~]# journalctl -b 2
    

    下面的 journalctl 命令可以检索仅限于当前系统启动的条目:

    [root@host ~]# journalctl -b
    

    保持准确的时间

    目标

    完成本节后,您能够使用NTP保持准确的时间同步,并配置时区,以确保系统日志和日志记录的事件的正确时间戳。

    设置本地时钟和时区

    正确的同步系统时间对于跨系统的日志文件分析至关重要。网络时间协议(NTP)是机器在互联网上提供和获取正确时间信息的标准方式。机器可以从互联网上的公共NTP服务中获得准确的时间信息,如NTP Pool Project.。另一种选择是使用高质量的硬件时钟向本地客户提供准确的时间。

    timedatectl命令显示了当前时间相关的系统设置概览,包括系统当前的时间、时区和NTP同步设置。

    [user@host ~]$ timedatectl
                   Local time: Fri 2019-04-05 16:10:29 CDT
               Universal time: Fri 2019-04-05 21:10:29 UTC
                     RTC time: Fri 2019-04-05 21:10:29
                    Time zone: America/Chicago (CDT, -0500)
    System clock synchronized: yes
                  NTP service: active
              RTC in local TZ: no
    
    

    可以使用timedatectl list-timezones命令列出一个时区数据库。

    [user@host ~]$ timedatectl list-timezones
    Africa/Abidjan
    Africa/Accra
    Africa/Addis_Ababa
    Africa/Algiers
    Africa/Asmara
    Africa/Bamako ...
    

    时区名称以IANA维护的公共时区数据库为基础。时区的命名是根据大陆或海洋来命名的,然后通常是以时区内最大的城市来命名,但不一定是以时区内最大的城市来命名。例如,美国的大部分山地时区是America/Denver。

    在时区内的地方有不同的夏令时规则的情况下,选择正确的名称可能是不直观的。例如,在美国,亚利桑那州(美国山地时间)的大部分地区根本没有夏令时的调整,而是处于America/Phoenix时区。

    tzselect 命令用于识别正确的 zoneinfo 时区名称。它可以交互式地提示用户关于系统位置的问题,并输出正确的时区名称。它不会对系统的时区设置进行任何更改。

    超级用户可以使用timedatectl set-timezone命令改变系统设置,更新当前时区。下面的 timedatectl 命令将当前时区更新为America/Phoenix。

    [root@host ~]# timedatectl set-timezone America/Phoenix
    [root@host ~]# timedatectl
                   Local time: Fri 2019-04-05 14:12:39 MST
               Universal time: Fri 2019-04-05 21:12:39 UTC
                     RTC time: Fri 2019-04-05 21:12:39
                    Time zone: America/Phoenix (MST, -0700)
    System clock synchronized: yes
                  NTP service: active
              RTC in local TZ: no
    

    使用 timedatectl set-time 命令来改变系统的当前时间。时间是以 "YYY-MM-DD hh:mm:ss "格式指定的,可以省略日期或时间。下面的 timedatectl 命令将时间改为 09:00:00:00。

    [root@host ~]# timedatectl set-time 9:00:00
    [root@serverX ~]$ timedatectl
                   Local time: Fri 2019-04-05 09:00:27 MST
               Universal time: Fri 2019-04-05 16:00:27 UTC
                     RTC time: Fri 2019-04-05 16:00:27
                    Time zone: America/Phoenix (MST, -0700)
    System clock synchronized: yes
                  NTP service: active
              RTC in local TZ: no
    

    timedatectl set-ntp命令可以开启或关闭NTP同步,以实现时间自动调整。该选项需要一个truefalse参数来开启或关闭。下面的 timedatectl 命令可以打开 NTP 同步。

    [root@host ~]# timedatectl set-ntp true
    

    在 Red Hat Enterprise Linux 8 中,timedatectl set-ntp 命令将调整 chronyd NTP 服务是否运行。其他Linux发行版可能会使用这个设置来调整不同的NTP或SNTP服务。

    使用 Red Hat Enterprise Linux 中的其他实用程序(例如在图形化 GNOME 设置应用程序中)启用或禁用 NTP,也会更新此设置。

    配置和监视CHRONYD

    chronyd服务通过将通常不准确的本地硬件时钟(RTC)与配置的NTP服务器同步,使其保持正常状态。如果没有网络连接, chronyd会计算RTC时钟漂移,并记录在/etc/ chrony.conf配置文件中指定的 driftfile 文件中。

    默认情况下,CHRONYD服务使用NTP Pool Project中的服务器进行时间同步,不需要额外配置。当有关机器位于一个孤立的网络上时,改变NTP服务器可能会很有用。

    NTP时间源的层次决定了其质量。 层次决定了机器与高性能参考时钟之间的跳数。 参考时钟是第0层时间源。 直接连接到它的NTP服务器是第1层,而来自NTP服务器的计算机同步时间是第2层的时间源。

    /etc/ chrony.conf配置文件中,服务器和peer是时间源的两类。服务器比本地NTP服务器高一个地层,而对等者则在同一地层。可以指定一个以上的服务器和一个以上的对等者,每行一个。

    server行的第一个参数是NTP服务器的IP地址或DNS名。在服务器的IP地址或名称之后,可以列出服务器的一系列选项。建议使用iburst选项,因为在服务启动后,为了更准确的初始时钟同步,会在短时间内进行四次测量。

    /etc/chrony.conf文件中的以下服务器classroom.examplex.com iburst行会导致chronyd服务使用classroom.examplex.com NTP时间源。

    # Use public servers from the pool.ntp.org project.
    ...output omitted...
    server classroom.example.com iburst 
    ...output omitted...
    

    chronyd指向本地时间源classroom.examplex.com后,应该重新启动服务。

    [root@host ~]# systemctl restart chronyd
    

    chronyc命令的作用是作为 chronyd 服务的客户端。在设置了 NTP 同步后,您应该使用 chrony sources 命令来验证本地系统是否无缝地使用 NTP 服务器来同步系统时钟。要获得更多关于输出的详细说明,请使用 chronyc sources -v 命令。

    [root@host ~]# 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
    ===============================================================================
    ^* classroom.example.com         8   6    17    23   -497ns[-7000ns] +/-  956us
    
    

    S(Source state)字段中的*字符表示Classroom.examplex.com服务器被用作时间源,是机器当前同步到的NTP服务器。

    总结

    • systemd-journald和rsyslog服务捕获日志消息并写入相应的文件。
    • /var/log目录中包含日志文件。
    • 日志文件的周期性切割,避免了文件系统空间被占满。
    • 系统日志是临时性的,不会在重启时持续存在。
    • chronyd服务有助于将时间设置与时间源同步。
    • 可以根据服务器的位置来更新服务器的时区。

    相关文章

      网友评论

          本文标题:RH214|第十一章 分析和存储日志

          本文链接:https://www.haomeiwen.com/subject/lrukvhtx.html