一:概述
当我们的系统出现问题时,常常需要检查日志文件中的内容来判断系统的运行状况。日志文件中记录了非常多的重要信息,比如Linux系统内和程序会产生的各种警告信息、错误信息和提示信息,这些信息对系统管理员分析系统的运行状况很有用。日志文件中的信息量非常大,如果不借助任何分析工具单凭肉眼观察判断是非常困难的,所以需要学会分析日志文件。
二:识别日志文件
日志文件就是记录系统和应用程序的运行状态以及发生的各种其他事件文件。日志文件的名称和位置取决于Linux系统的发行版本,应用程序类型和设置、检查内容的方法取决于日志文件的类型。
日志文件的类型有以下两种格式:
- 文字格式:可以使用cat、less等命令直接查看的日志文件。
- 二进制格式:可以使用专有命令查看或者确认二进制格式的日志文件。
CentOS中的主要日志文件如下表所示:
文件名称 |
说明 |
/var/run/utmp |
存储当前登录到系统的用户信息(二进制格式) |
/var/log/wtmp |
使用last命令存储登录的用户、使用时间和系统重启信息(二进制格式) |
/var/log/btmp |
使用lastb命令显示存储无效的登录历史记录,例如密码验证失败(二进制格式) |
/var/log/messages |
存储主系统日志信息 |
/var/log/dmesg |
在启动时存储从内核输出信息 |
/var/log/maillog |
存储有关邮件系统的信息 |
/var/log/secure |
存储与安全相关的信息 |
/var/log/lastlog |
使用lastlog命令显示存储每个用户的最新登录信息(二进制格式) |
/var/log/yum.log |
包含使用yum安装的软件包信息 |
/var/lo/cron |
存储cron历史记录信息已安排服务 |
下面是Ubuntu中的主要日志格式:
文件名称 |
说明 |
/var/log/wtmp |
使用last命令存储登录的用户、使用时间和系统重启信息(二进制格式) |
/var/log/btmp |
使用lastb命令显示存储无效的登录历史记录,例如密码认证失败(二进制格式) |
/var/log/auth.log |
将登录历史信息存储到系统中 |
/var/log/syslog |
存储大量系统的日志信息 |
/var/log/kern.log |
存储从内核输出的信息 |
/var/log/boot.log |
系统启动时存储服务启动信息 |
/var/log/dmesg |
启动时存储从内核输出的信息 |
/var/log/maillog |
存储有关邮件系统的信息 |
/var/log/lastlog |
使用lastlog命令显示存储每个用户的最新登录信息(二进制格式) |
/var/log/apt/history.log |
存储软件包管理系统的apt历史信息 |
一般情况下,系统产生很多的信息,这些信息中基本包括事件发生的具体时间、主机名、服务名称等。通过这些信息可以帮助我们排查系统产生的错误信息以及原因。
三:查看日志文件的信息
想要查看这些日志文件里的具体内容,可以使用之前说过的cat命令。演示如下图所示:
使用who命令显示当前系统中登录的用户信息,这个命令的执行结果引用了日志文件/var/run/utmp。last命令显示登录用户、使用时间和系统重启信息,该执行结果中的信息参照了/var/log/wtmp日志文件。通过不同的命令可以浏览各种日志文件。如下图所示:
大多数情况下,系统管理员会集中管理多台服务器。通过记录并关注系统日志来检测故障并调查原因,学会使用各种日志管理工具管理日志文件,就不会发生由于网络故障或机械故障导致日志文件丢失的情况。管理日志文件的工具如下表所示:
日志管理工具 |
说明 |
syslog |
广泛应用于系统日志,包括管理日志信息的优先级等 |
rsylog |
基于syslog协议,支持多线程,增强了安全性 |
systemd-journald |
是systemd日志的守护程序,可以将系统日志文件传输到其他syslog守护程序中存储 |
上面这些都是管理日志文件的工具,管理系统就必须要了解软件在系统上产生的各种信息,处了系统上的这些日志文件,管理日志文件的工具也很重要。
四:日志管理工具管理日志文件
rsyslog管理日志文件的服务是rsyslog.service,主要用来收集登录系统和网络等相关的信息。rsyslog由rsyslogd守护程序控制,rsyslog.service服务配置文件是/etc/rsyslog.conf,这个配置文件里面规定了服务的等级以及被记录的位置。使用cat命令查看/etc/rsyslog.conf文件中的内容,如下图所示:
Linux系统中的大多数日志文件存储在/var/log目录下,/etc/rsyslog.conf文件描述了与日志文件记录相关的各种设置,包括选择器和动作字段。选择器字段在facility.priority中指定并选择要处理的信息。facility指定信息的功能;priority指定信息的优先级,action字段由选择器字段选择,指定消息输出的目的地。当指定facility.priority时,将记录所有指定的优先级或者更高的优先级信息,指定特定的优先级使用facility.=priority,*表示优先级。
- rsyslog的配置主要有以下的模块组成:
- modules:配置加载模块。
- global directivves:全局配置,配置rsyslog守护进程的全局属性。
- rules:规则(选择器+动作),每个规则由selector部分和acrion部分组成。selector部分指定源和日志等级,acrion部分指定对应的操作。
- 模板。
- 输出。
规则中的selector(选择器)也由两部分组成,即facility和priority,由.(点号)间隔。
rsyslogd主要通过Linux内核提供的syslog相关的规范来设置数据的分类。我们可以通过syslog支持的一些服务类型来存储系统的信息,syslog支持的服务类型如下表所示:
服务类型 |
代码 |
说明 |
kern |
0 |
内核信息 |
user |
1 |
用户级别信息 |
2 |
邮件系统 |
|
daemon |
3 |
系统守护程序 |
auth |
4 |
安全/身份认证信息 |
syslog |
5 |
rsyslog程序产生的信息 |
lpr |
6 |
打印相关的信息 |
news |
7 |
news子系统 |
uucp |
8 |
UUCP子系统 |
cron |
9 |
cron守护进程产生的信息 |
authpriv |
10 |
安全/身份认证信息 |
ftp |
11 |
ftp守护程序 |
local0-local7 |
16-23 |
保留共本地使用 |
同一个服务产生的信息也是有差别的,既然有差别就有等级分类。syslog将这些信息纷争了八个主要的等级:
符号 |
说明 |
/绝对路径 |
输出至以绝对路径指定的文件或设备文件 |
|命令 |
将信息输出到指定的命令中,程序由输入命令程序读取 |
@主机名 |
指定要将日志传输到远程主机 |
. |
发送给所有登录用户(显示在用户端上) |
用户名 |
发送给由用户名指定的用户(显示在用户端上) |
下面再看一下/etc/rsyslog.conf文件中的内容。*,info;mail.none;authpriv.none;cron.none表示除了mail(邮件)、authpriv(专用身份验证)和cron之外的信息均记录在/var/log/messages中,显示与mail相关的日志文件都记录在/var/log/maillog中,/etc/rsysllog.conf文件中与邮件有关的信息
在Ubuntu中需要查看/etc/rsyslog.d/50-default.conf文件的内容来获取日志信息。*.*;authpriv.none表示除了auth和authpriv之外的所有信息都记录在/var/log/syslog中,如下图所示:
五:创建记录(在系统的日志文件)
logger命令用于将facility和priority的信息发送到rsyslogd守护程序。
格式:logger [选项] [消息]
logger命令有连个常用的选项,如下表所示:
选项 |
说明 |
-f |
发送指定文件的内容 |
-p |
设置优先级,默认值为user.notice |
在Ubuntu中使用logger命令在系统中创建一条记录,如下图所示。使用-p指定服务类型为user,优先级指定为info,并向rsyslogd守护程序发送"syslog user test"消息。
还有logrotate可以对日志进行轮循,每个日志文件都可以被设置为每日、每周或每月处理,也可以设置文件太太时立即处理。系统默认每周执行一次轮循工作,旧的日志文件最多轮循4次就会被删除。
文件的轮循设置,可以在/etc/logrotate.conf文件中定义,如下如所示。weekly表示每周轮循一次,rotate 4表示默认轮循4次,及指定日志文件删除之前轮循的次数;create表示轮循后立即创建新的日志文件;datetxt表示代办事项扩展名是日期;include /etc/logrotate.d表示读取该目录文件。
演示操作如下图所示:
管理日志文件的轮循可以使用logrotate命令,可以在配置文件中指定日志名称、间隔次数进行日志文件轮转。logrotate命令通常每天由/etc/cron.daily/logrotate脚本指定一次。
格式:logrotate [选项] 配置文件
一般情况下指定/etc/logrotate.conf配置文件。比如在这个配置文件中将每周(weekly)轮循更改为每天(daily)轮循,指定logrotate命令轮循日志文件,如下图所示。ls /var/log/syslog*表示检查当前的消息文件,使用date命令检查当天的日期,然后执行logrotate命令,再次查看当前的消息文件,显示已添加了执行日期文件。
systemd是系统启动时第一个被执行的程序,这个程序可以主动调用systemd-journald来管理日志文件。systemd-journald负责手机来自内核、启动程序早期、标准输出、系统日志、守护进程启动和运行期间的日志,它会将手机的日志存储在非易失性存储器或易失性存贮器中,日志文件存储为结构化二进制数据。在非易失性存储器中,重新引导系统后日志文件依然保留存在,在易失性存储器中,重新引导系统后日志文件会消失。
journalctl命令用于查看日志内容,可以查看systemd-journald收集的日志,但不能查看其他守护进程收集的日志,例如syslog和rsyslogd。Journalctl命令可以在配置文件/etc/system/journald.conf中设置各种参数。
格式:journalctl [选项] [字段=值]
journalctl命令主要选项如下表所示:
选项 |
说明 |
-b、--boot |
显示从ID中指定的引导到停止的日志 |
-f、--follow |
实时显示 |
-o、--output |
指定输出格式。例如指定-o verbose显示详细信息 |
-p、--priority |
显示具有指定格式优先级的日志 |
-n、--lines |
指定要显示的最新记录 |
-e、--pager-end |
跳到最新部分显示 |
-r、--reverse |
以相反的顺序显示、顶部显示最新数据 |
--no-pager |
显示时使用页眉 |
--since |
在指定日期和时间之后显示 |
--until |
在指定日期和时间之前显示 |
通过指定”--since=“和"--until="指定日期和时间范围,指定-p或"--priority="指定系统日志的优先级。如果指定了两个或者多个不同的字段,则将显示所有的匹配项;如果指定了两个或者多个相同的字段,则显示匹配项之一内容。journalctl命令的主要字段及说明如下表所示:
字段 |
说明 |
PRIORITY |
syslog优先级,例如PRIORITY=4(warning) |
SYSLOG_FACILITY |
syslog工具,例如SYSLOG_FACILITY=2(mail) |
_PID |
进程ID |
_UID |
用户ID |
_KERNEL_DEVICE |
内核设备名称 |
_KERNEL_SUBSYSTEM |
内核子系统名称 |
下面演示一下journalctl命令优先于warning的日志,如下图所示: