文档说明
本文档针对CentOS Linux release 7.2.1511 (Core)来进行操作系统日志的配置和分析,如使用的是其他版本,可能会存在一些差异。
系统日志说明
系统日志是记录系统活动信息的文件, 记录了:时间、地点 (IP)、用户(或服务名称)、做了哪些操作 等。 简单的说,就是记录系统在什么时候由哪个程序做了什么样的行为时,发生了哪些事件。
可以依据操作系统的记录解决系统方面的错误、解决网络服务的问题,了解系统中历史发生事件等。
日志在排查文件的时候至关重要,在Linux上一般跟系统相关的日志默认都会放到/var/log下面。
1.主要系统日志及其作用
1.1/var/log/boot.log
一般包含系统启动时的日志,包括自启动的服务。这个文件只会存储本次开机启动的信息,前次开机的信息并不会被保留下来。
可以看到此文件中存储的是系统引导的相关信息,就是Linux开机自检过程显示的信息。
1.2/var/log/cron
记录crontab自动任务相关信息。包括自动任务有没有实际被执行,执行过程是否发生错误等。
1.3/var/log/dmesg
记录系统在开机的时候核心侦测过程所产生的各项信息。由于 CentOS 默认将开机时核心的硬件侦测过程取消显示, 因此额外将数据记录一份在这个文件中。
1.4/var/log/lastlog
可以记录系统上面所有的账号最近一次登入系统时的相关信息。 该日志文件记录最近成功登录的事件和最后一次不成功的登录事件,由login生成。 在每次用户登录时被查询,该文件是二进制文件,需要使用 lastlog命令查看,根据UID排序显示登录名、端口号和上次登录时间。如果某用户从来没有登录过,就显示为"**Never logged in**"。该命令只能以root权限执行。简单地输入lastlog命令后就会看到类似如下的信息:
系统账户诸如bin、daemon、adm、uucp、mail等决不应该登录,如果发现这些账户已经登录,就说明系统可能已经被入侵了。若发现记录的时间不是用户上次登录的时间,则说明该用户的账户已经泄密了。
1.5/var/log/maillog
该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动。它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统。下面是该日志文件的片段。
其实主要是记录 postfix (SMTP 协议提供者) 与 dovecot (POP3 协议提供者) 所产生的讯息。 SMTP 是发信所使用的通讯协议, POP3 则是收信使用的通讯协议。 postfix 与 dovecot 则分别是两套达成通讯协议的软件。
1.6/var/log/messages
包括整体系统信息,其中也包含系统启动期间的日志。此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中。
IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,您可以在 messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。
该 文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括 号、一个冒号和一个空格,最后是消息。该文件有一个不足,就是被记录的入侵企图和成功的入侵事件,被淹没在大量的正常进程的记录中。但该文件可以由 /etc/syslog文件进行定制。由 /etc/syslog.conf配置文件决定系统如何写入/var/messages。有关如何配置/etc/syslog.conf文件决定系统日志 记录的行为,将在后面详细叙述。
1.7/var/log/secure
基本上,只要牵涉到『需要输入账号密码』的软件,那么当登入时 (不管登入正确或错误) 都会被记录在此文件中。 包括系统的 login 程序、图形接口登入所使用的 gdm 程序、 su, sudo 等程序、还有网络联机的ssh, telnet 等程序, 登入信息都会被记载在这里。
1.8/var/log/wtmp
该 日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常 运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文 件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端 tty或时间显示相应的记录。
命令last有两个可选参数:
last -u 用户名 显示用户上次登录的情况。
last -t 天数 显示指定天数之前的用户登录情况。
1.9/var/run/utmp
该 日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系 统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息,因为某些突发错误会终止用户登录会话,而系统没有及时 更新 utmp记录,因此该日志文件的记录不是百分之百值得信赖的。
以 上提及的3个文件(/var/log/wtmp、/var/run/utmp、 /var/log/lastlog)是日志子系统的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的,故 不能用less、cat之类的命令直接查看这些文件,而是需要使用相关命令通过这些文件而查看。其中,utmp和wtmp文件的数据结构是一样的,而 lastlog文件则使用另外的数据结构,关于它们的具体的数据结构可以使用man命令查询。
每 次有一个用户登录时,login程序在文件lastlog中查看用户的UID。如果存在,则把用户上次登录、注销时间和主机名写到标准输出中,然后 login程序在lastlog中记录新的登录时间,打开utmp文件并插入用户的utmp记录。该记录一直用到用户登录退出时删除。utmp文件被各种 命令使用,包括who、w、users和finger。
下一步,login程序打开文件wtmp附加用户的utmp记录。当用户登录退出时,具有更新时间戳的同一utmp记录附加到文件中。wtmp文件被程序last使用。
1.10其他文件或者目录
例如安装系统自带的一些软件的时候,默认的日志输出都是输出到这个路径下的,例如apache默认日志路径/var/log/httpd/,这个是为了遵循系统设计的一些规范。
2.记录日志文件的服务rsyslog.service
日志文件由rsyslog服务维护,所以需要保证已经启动rsyslog,而且已经设定开机时启动。
检查rsyslog服务进程是否存在:
ps -elf | grep rsyslog
rsyslog进程存在。
检查rsyslog服务是否已经开启并设定为开机启动:
systemctl status rsyslog
服务为启动状态,并且也已经预设为开机自动启动。
2.1配置日志文件:/etc/rsyslog.conf
rsyslogd针对各种服务的哪些等级的信息记录在哪些文件,是在/etc/rsyslog.conf中配置的。
下图为/etc/rsyslog.conf配置文件的内容:
可以看到该文件内容的设定语法是这样的:
服务名称[.=!]信息等级 信息记录的文件名或装置或主机
例:上图标红的记录可以解释为cron服务的任何等级的信息记录到/var/log/cron文件中。
服务名称:
相对序号 |
服务类别 |
说明 |
0 |
kern(kernel) |
核心 (kernel) 产生的讯息,大部分都是硬件侦测以及核心功能的启用; |
1 |
user |
在用户层级所产生的信息,例如用户使用 logger 指令来记录登录文件的功能; |
2 |
|
只要与邮件收发有关的讯息记录都属于这个; |
3 |
daemon |
主要是系统的服务所产生的信息,例如 systemd 就是这个有关的讯息; |
4 |
auth |
主要与认证/授权有关的机制,例如 login, ssh, su 等需要账号/密码的操作; |
5 |
syslog |
由 syslog 相关协议产生的信息,其实就是 rsyslogd 这支程序本身产生的信息; |
6 |
lpr |
打印相关的讯息啊; |
7 |
news |
与新闻组服务器有关的信息; |
8 |
uucp |
全名为 Unix to Unix Copy Protocol,早期用于 unix 系统间的程序数据交换; |
9 |
cron |
例行性工作排程 cron/at 等产生的讯息记录; |
10 |
authpriv |
与 auth 类似,但记录较多账号私人的信息,包括 pam 模块的运作等; |
11 |
ftp |
与 FTP 通讯协议有关的讯息输出; |
16-23 |
local0 ~ local7 |
保留给本机用户使用的一些登录文件讯息,较常与终端机互动。 |
信息等级:
等级数值 |
等级名称 |
说明 |
7 |
debug |
用来 debug (除错) 时产生的讯息数据; |
6 |
info |
仅是一些基本的讯息说明而已; |
5 |
notice |
虽然是正常信息,但比 info 还需要被注意到的一些信息内容; |
4 |
warning |
(warn)警示的讯息,可能有问题,但是还不至于影响到某个 daemon 运作的信息;基本上, info,notice, warn 这三个讯息都是在告知一些基本信息而已,应该还不至于造成一些系统运作困扰; |
3 |
err |
(error)一些重大的错误讯息,例如配置文件的某些设定值造成该服务无法启动的信息说明, 通常藉由 err 的错误告知,应该可以了解到该服务无法启动的问题; |
2 |
crit |
比 error 还要严重的错误信息,这个 crit 是临界点 (critical) 的缩写,这个错误已经很严重了喔; |
1 |
alert |
警告警告,已经很有问题的等级,比 crit 还要严重; |
0 |
emerg |
(panic)等级,意指系统已经几乎要宕机的状态。 很严重的错误信息了。通常大概只有硬件出问题,导致整个核心无法顺利运作,就会出现这样的等级的讯息。 |
注意服务名称和信息等级之间还有[.=!]的连接符号,具体含义如下:
. :代表比后面还要严重的等级 (含该等级) 都被记录下来的意思,例如: mail.info 代表只要是 mail的信息,而且该信息等级严重于 info (含 info 本身)时,就会被记录下来的意思。
.=:代表所需要的等级就是后面接的等级而已, 其他的不要;
.!:代表不等于, 即除了该等级外的其他等级都记录。
一般来说,我们比较常使用的是『.』这个链接符号。
信息记录的文件名或装置或主机
信息要放置在哪。通常我们使用的都是记录的文件。但是也可以输出到装置。也可以记录到不同的主机上头。具体有如下几类:
文件的绝对路径:通常就是放在 /var/log 里头的文件;
打印机或其他:例如 /dev/lp0 这个打印机装置;
使用者名称:显示给指定用户;
远程主机:例如 @study.vbird.tsai 当然,要对方主机也能支持才可以;
*:代表『目前在线的所有人』,类似 wall 这个指令的意义。
示例1:
我要将新闻组资料 (news) 及例行性工作排程 (cron) 的讯息都写入到 /var/log/cronnews 的文件中,但是这两个程序的警告讯息则额外的记录在 /var/log/cronnews.warn 中, 那该如何设定我的 rsyslog.conf呢?
vim /etc/rsyslog.conf
添加如下内容即可
示例2:
messages 这个文件需要记录所有的信息,但是就是不想要记录 cron, mail 及 news 的信息,那么应该怎么写?
vim /etc/rsyslog.conf
添加如下内容即可
使用『,』分隔时,那么等级只要接在最后一个即可,如果是以『;』来分的话, 那么就需要将服务与等级都写上去。
2.2添加自定义记录日志
例如想在/etc/rsyslog.conf文件中添加一行日志定义,将所有服务的info等级的日志记录到/var/log/log_test.log文件
vi /etc/rsyslog.conf
添加如下内容:
*.info /var/log/log_test.log
保存该文件,然后重启rsyslog服务的命令使修改生效。
systemctl restart rsyslog.service
使用logger工具测试配置是否成功。(logger是一个Shell命令接口,可以模拟产生各类rsyslog信息)
logger -p user.info "test info"
查看/var/log/log_test.log日志文件内容看是否有"test info"日志记录,确认日志设置是否修改成功。
cat /var/log/log_test.log
可见已经配置成功。
3.日志文件轮转
用日志轮转服务logrotate来自动实现日志文件的定期清理。
CentOS7系统默认安装有logrotate,logrotate的执行由crond服务实现。
检查系统中是否安装有logrotate
rpm -qa | grep logrotate
在/etc/cron.daily目录中有一个名为logrotate的脚本文件用来启动logrotate程序,以查看是否有任何日志需要轮转。
轮转配置文件为/etc/logrotate.conf的默认配置
logrotate的主要功能就是将旧的登录文件移动成旧档,并且重新建立一个新的空文件来记录,它的执行结果有点类似底下的图示:
由上面的图示我们可以清楚的知道,当第一次执行完 rotate 之后,原本的 messages 会变成messages.1 而且会制造一个空的 messages 给系统来储存日志文件。而第二次执行之后,则messages.1 会变成 messages.2 而 messages 会变成 messages.1 ,又造成一个空的 messages 来储存日志信息!那么如果我们仅设定保留三个登录档而已的话,那么执行第四次时,则 messages.3 这个文件就会被删除,并由后面的较新的保存登录档所取代。
4.查看和分析系统日志条目
4.1日志条目示例
以我们自己添加的/var/log/log_test.log 为例:
日志文件记录顺序按时间顺序排列,开头显示最早的消息,末尾显示最新的消息。
4.2使用tail工具实时监控日志文件
通常使用tail工具来监控日志文件。它输出指定文件的最后10行,并实时滚动显示最新的日志记录。
tail -f 日志文件
以/var/log/log_test.log 为例:
日志会实时滚动,按ctrl+c结束监控。
系统日志注意事项
注意:rsyslogd的日志文件只要被编辑过就无法继续记录。假如发现系统日志不能记录信息了,那么很可能是因为使用“:wq”来离开vim的环境,所以才会导致不能记录的问题。
解决方式为:重新启动rsyslog.service让它继续提供服务。