前言: 

 本文章转自我的个人博客 http://www.anyisalin.com 欢迎大家访问


此文章是我学习RHCE7.0时所记笔记,希望能够对大家有所帮助

    


系统日志架构



系统日志

进程和操作系统内核需要能够未发生的时间记日志。这些日志可用于系统审核和问题的故障排除。依照惯例,这些日志永久存储在 /var/log 目录中

RHEL7中的日志系统

红帽企业Linux 中内建了一个基于系统日志协议的标准日志记录系统。许多程序使用此系统记录事件,并将它们整理到日志文件中。Red Hat Enterprise Linux 7 中的系统日志消息由两个服务负责处理,他们是systemd-journald和rsyslog。


systemd-journald 守护进程提供一种改进的日志管理服务,可以收集来自内核,启动过程的早期阶段,标准输出,系统日志,以及守护进程启动和运行期间的错误的消息。它将这些消息写到一个结构化的事件日志中,默认情况下不在重新启动之间保留。这允许系统日志所错过的系统日志消息和时间收集到一个中央数据库中。系统消息可以由systemd-journald 转发到 rsyslog 以做进一步处理。

rsyslog 服务随后根据类型(或设备)和优先级排列系统日志消息,将他们写入到 /var/log 目录内的永久文件中。


/var/log 目录保管由rsyslog维护的各种特定于系统和服务的日志文件。


系统日志文件概述

日志文件用途

/var/log/messages大多数系统日志消息记录在此。例外是与身份验证,电子邮件处理相关的定期运行作业的消息以及纯粹与调试相关的信息。

/var/log/secure安全和身份验证相关的消息和错误的日志文件。

/var/log/maillog与邮件服务器相关的日志文件。

/var/log/boot.log与系统启动相关的消息记录在此。



系统日志文件

许多程序使用syslog协议将时间记录到系统。每一日志消息根据设备(消息的类型)和优先级(消息的严重性)分类。可用的设备在rsyslog.conf(5) man page 中予以概述。

八个优先级按照如下所述进行了标准化和评级

编码优先级严重性

0    emerg    系统不可用。

1    alert    必须立即采取措施。

2    crit      严重状况。

3    err       非常严重错误状况。

4    warning    警告状况。

5    notice    正常但重要的事件。

6    info      信息性事件。

7    debug    调试级别消息。



rsyslogd 服务使用日志消息的设备和优先级来确定如何进行处理。这通过/etc/rsyslog.conf文件,以及/etc/rsyslog.d中*.conf文件进行配置。程序和管理员可以将带有.conf后缀的自定义文件放入/etc/rsyslog.d目录,以更改rsyslogd配置而不被rsyslog更新所覆盖。


/etc/rsyslog.conf中 #####RULES######部分包定义日志消息保存位置的相关指令。每行左侧表示与指令匹配的日志消息的设备和严重性。rsyslog.conf 文件的设备和严重性字段中可能包含*字符作为通配符,代表所有设备和所有严重性级别。每行右侧表示要将日志消息保存的文件。日志消息通常保存在/var/log目录中的文件中。



日志文件由rsyslog服务维护,/var/log 目录中包含各种特定于某些服务的日志文件。

例如 Apache Web 服务器或者Samba将自己的日志文件写入到/var/log目录中对应的子目录中。


rsyslog 处理的消息可能会出现在多个不同日志文件中,为了避免这种情况,可以将严重性字段设为none,

表示定向到这一设备的所有消息都不添加到指定的日志文件中。


除了将日志文件消息记录到文件中外,也可以将他们打印到所有已登录用户的终端中。在默认的rsyslog.conf文件中,对优先级为“emerg”的所有消息执行此操作。



日志文件轮转

日志通过logrotate 实用工具“轮转”,以防止他们将包含 /var/log/中的文件系统填满。轮转日志文件时,会使用名称扩展对其进行重命名,名称扩展指示轮转日期:如果文件在2014年10月30日轮转后,则原来的/var/log/messages 文件会变成 /var/log/messages-20141030。轮原文件之后,会创建新的日志文件,并通知对他执行写操作的服务。


轮转若干次之后(通常轮转四次),丢弃原日志文件以释放磁盘空间。cron作业每日运行一次logrotate程序,以查看是否有任何日志需要轮转。大多数日志文件每周轮转一次,但是logrotate轮转文件的速度有时比较快,有时较慢,或在文件达到特定大小时进行轮转。

关于logrotate的配置参见 logrotate(8) man page





分析系统日志条目

rsyslog所写的系统日志文件在文件的开头显示最旧的消息,在文件的末尾显示最新的消息。由rsyslog 管理的日志文件中所有的日志条目都以标准的格式记录。下例深入介绍 /var/log/secure日志文件中的日志消息。


①Feb 11 20:11:48② localhost ③sshd[1438] ④Failed password for student from 172.25.0.10 port 59344


①记录该日志条目的时间戳

②发送该日志消息的主机

③发送该日志消息的程序或进程

④发送的实际消息




使用tail 监控日志文件

监控事件的一个或多个日志文件,这对重现问题特别有帮助。tail -f /path/to/file 命令输出指定文件的最后0行,并在新写入到被监控文件中继续输出它们。


使用logger发送系统日志消息

logger命令可以发送消息到 rsyslog服务。默认情况下,他的严重性为 notice(user.notice)的消息发送给设备用户,除非通过-p 选项指定另外。测试对rsyslog 配置的更改特别有用。


若要向rsyslogd 发送消息并记录在 /var/log/boot.log 日志文件中,可以执行:

logger -p local7.notice LOGSTRING





查看systemd日志条目


通过journalctl 查找事件

systemd 日志将日志数据存储在带有索引的结构化二进制文件中。此数据包含与日志事件相关的额外信息。例如,对于系统日志时间,这可包含原始消息的设备和优先级。


在Red Hat Enterprise Linux 7 中,systemd 日志默认存储在/run/log中其内容会在重启后予以清除。此设置可以由系统管理员更改。


journalctl 命令从最旧的日志条目开始显示完整的系统日志。


journalctl 命令以粗文本突出显示优先级为 notice 或 warning的信息,以红色文本突显出级别为error或更高级的消息。


成功利用日志进行故障排除和审核的关键在于,将日志搜索限制为仅显示相关输出。


默认情况下,journalctl -n 显示最后10个日志条目。他可以接受通过可选参数指定显示最后多少个日志条目。若要显示最后5个日志条目,可运行

journalctl -n 5


在对问题进行故障排除时候,根据日志条目的优先级过滤日志文件输出非常有种 journalctl -p 可以接受已知优先级的名称或编号作为参数,显示所有指定级别及更高级别的条目。

journalctl -p err


与tail -f 命令相似,journalctl -f输出日志的最后10行,并在新日志条目写入到日志中继续输出他们

journalctl -f


查找具体时间的事件时,将输出限制为特定的时间段非常有用,journalctl 命令有两个选项,可以将输出限制为特定的时间范围,分别是 --since 和 --until 选项,两个选项都接受格式为 YYYY-MM-DD hh:mm:ss 的时间参数。如果省略日期,则命令会假定日志为当天;如果省略时间部分,则假定为自00:00:00起的一整天,除了日期和时间字段外,这两个选项还接受yesterday,today和tomorrow作为有效日期的参数。


输出当天记录的所有日志条目。

journalctl --since today


输出2014年2月10日20:30:00到2014年2月13日12:00:00的日志条目

journalctl --since "2014-02-10 20:30:00" --until "2014-02-13 12:00:00"


除了日志的可见内容外,日志条目中还附带了只在打开详细输出时才能看到的字段,所有显示的额外字段都可以用于过滤日志查询的输出。这可用于减少查找日志中特定事件的复杂搜索的输出。

journalctl -o verbose

其他用于搜索关于特定进程或事件的行的选项还有

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


可以组合成多个选项。例如查询显示与systemd 单元文件 sshd.service 启动,并且PID为1182的进程相关的所有日志条目。

journalctl _SYSTEMD_UNIT=sshd.service _PID=1182




保存systemd日志


永久存储系统日志

默认情况下,systemd日志保存在/run/log/journal中,这意味着系统重启时它会被清除。该日志是Red Hat Enterprise Linux 7 中的一种新机制,而对于大多数安装来说,自上一次启动的详细日志就以足够。


如果存在 /var/log/journal 目录,该日志会改为记录在这个目录中。这样做的优点是启动后就可以立即使用历史数据。然而,即便是永久日志,并非所有数据都永久保留。该日志具有一个内置的日志轮转机制,会在每个月出发。此外,在默认情况下,日志的大小不能超过文件系统的10%,也会能造成文件系统的可用空间低于15%。这些值可以再/etc/systemd/journald.conf中调节,日志文件大小的当前限制在 systemd-journald进程启动时予以记录,可通过下列命令进行查看,该命令显示journalctl输出的前两行:

journalctl | head -2


可以作为root用户创建/var/log/journal 目录,使systemd 日志变为永久日志。

确保/var/log/journal目录由root用户和组systemd-journal 所有,且权限为2775

需要重启系统或者以root用户身份将特殊信号USR1大送到systemd-journald进程里

killall -USER1 systemd-journal


由于systemd 日志现在已经在重新启动之间永久保留,可以通过journal -b仅显示系统自上一次启动以来的日志消息,以减少输出。

journalctl -b -1  #表示将输出限制为上一次启动




保持准确的时间

对于在多个系统间分析日志文件而言,正确的同步系统时间非常重要,网络时间协议(NTP)是计算机用于通过互联网提供并获取正确时间信息的而一种标准方式。计算机可以通过互联网上的公共NTP服务获取正确的时间信息


timedatectl  #命令简要显示当前的事件相关的系统设置,如系统的当前时间,时区和NTP同步设置。
timedatectl list-timezones  #列出系统包含已知时区的数据库
timedatectl set-timezone 时区  #设置时间
timedatectl set-time 9:00:00  #设置时间
timedatectl set-ntp  true|false  #打开或关闭NTP同步
chronyc sources -v  #验证NTP服务器