linux学习笔记(实验楼) 实验17 linux日志系统

一、实验介绍

1.1 实验内容

日志数据可以是有价值的信息宝库,也可以是毫无价值的数据泥潭。它可以记录下系统产生的所有行为,并按照某种规范表达出来。我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。收集你想要的数据,分析出有价值的信息,可以提高系统、产品的安全性,还可以帮助开发完善代码,优化产品。日志会成为在事故发生后查明“发生了什么”的一个很好的“取证”信息来源。日志可以为审计进行审计跟踪。

1.2 实验知识点

  • 常见的日志

  • 配置的日志

  • 轮替的日志

 

 

二、常见的日志

 

日志是一个系统管理员,一个运维人员,甚至是开发人员不可或缺的东西,系统用久了偶尔也会出现一些错误,我们需要日志来给系统排错,在一些网络应用服务不能正常工作的时候,我们需要用日志来做问题定位,日志还是过往时间的记录本,我们可以通过它知道我们是否被不明用户登录过等等。

在 Linux 中大部分的发行版都内置使用 syslog 系统日志,那么通过前期的课程我们了解到常见的日志一般存放在 /var/log 中,我们来看看其中有哪些日志

linux学习笔记(实验楼) 实验17 linux日志系统

根据图中所显示的日志,我们可以根据服务对象粗略的将日志分为两类

  • 系统日志

  • 应用日志

系统日志主要是存放系统内置程序或系统内核之类的日志信息如 alternatives.log 、btmp 等等,应用日志主要是我们装的第三方应用所产生的日志如 tomcat7 、apache2等等。

接下来我们来看看常见的系统日志有哪些,他们都记录了怎样的信息

linux学习笔记(实验楼) 实验17 linux日志系统

而在本实验环境中没有 apport.log 是因为 apport 这个应用程序需要读取一些内核的信息来收集判断其他应用程序的信息,从而记录应用程序的崩溃信息。而在本实验环境中我们没有这个权限,所以将 apport 从内置应用值剔除,自然而然就没有它的日志信息了。

只闻其名,不见其人,我们并不能明白这些日志记录的内容。首先我们来看 alternatives.log 中的信息,在本实验环境中没有任何日志输出是因为刚刚启动的系统中并没有任何的更新迭代。我可以看看从其他地方截取过来的内容

linux学习笔记(实验楼) 实验17 linux日志系统

我们可以从中得到的信息有程序作用,日期,命令,成功与否的返回码

我们用这样的命令来看看 auth.log 中的信息

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

我们可以从中得到的信息有日期与 ip 地址的来源以及的用户与工具

在 apt 文件夹中的日志信息,其中有两个日志文件 history.log 与 term.log,两个日志文件的区别在于 history.log 主要记录了进行了哪个操作,相关的依赖有哪些,而 term.log 则是较为具体的一些操作,主要就是下载包,打开包,安装包等等的细节操作。

我们通过这样的例子就可以很明显的看出区别,在本实验环境中因为是刚启动的环境,所以两个日志中的信息都是空的

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

然后我们来安装 git 这个程序,因为本实验环境中本有预装 git 所以这里真正执行的操作是一个更新的操作,但这并不影响

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

成功的执行之后我们再来查看两个日志的内容变化

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

其他的日志格式也都类似于之前我们所查看的日志,主要便是时间,操作。而这其中有两个比较特殊的日志,其查看的方式比较与众不同,因为这两个日志并不是 ASCII 文件而是被编码成了二进制文件,所以我们并不能直接使用 less、cat、more 这样的工具来查看,这两个日志文件是 wtmp,lastlog

linux学习笔记(实验楼) 实验17 linux日志系统

我们查看的方法是使用 last 与 lastlog 工具来提取其中的信息

linux学习笔记(实验楼) 实验17 linux日志系统

关于这两个工具的更深入使用我们可以使用前面的学习过的 man 来查看

 

 

三、配置的日志

 

这些日志是如何产生的?通过上面的例子我们可以看出大部分的日志信息似乎格式都很类似,并且都出现在这个文件夹中。

这样的实现可以通过两种方式:

  • 一种是由软件开发商自己来自定义日志格式然后指定输出日志位置;

  • 一种方式就是 Linux 提供的日志服务程序,而我们这里系统日志是通过 syslog 来实现,提供日志管理服务。

syslog 是一个系统日志记录程序,在早期的大部分 Linux 发行版都是内置 syslog,让其作为系统的默认日志收集工具,虽然随着时代的进步与发展,syslog 已经年老体衰跟不上时代的需求,所以他被 rsyslog 所代替了,较新的 Ubuntu、Fedora 等等都是默认使用 rsyslog 作为系统的日志收集工具

rsyslog的全称是 rocket-fast system for log,它提供了高性能,高安全功能和模块化设计。rsyslog 能够接受各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog 可以提供超过每秒一百万条消息给目标文件。

这样能实时收集日志信息的程序是有其守护进程的,如 rsyslog 的守护进程便是 rsyslogd

因为一些原因本实验环境中默认并没有打开这个服务,我们可以手动开启这项服务,然后来查看

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

 

既然它是一个服务,那么它便是可以配置,为我们提供一些我们自定义的服务

首先我们来看 rsyslog 的配置文件是什么样子的,而 rsyslog 的配置文件有两个,

  • 一个是 /etc/rsyslog.conf

  • 一个是 /etc/rsyslog.d/50-default.conf。

第一个主要是配置的环境,也就是 rsyslog 加载什么模块,文件的所属者等;而第二个主要是配置的 Filter Conditions

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

也不知道他在写什么,我们还是来看看 rsyslog 的结构框架,数据流的走向吧。

linux学习笔记(实验楼) 实验17 linux日志系统

通过这个简单的流程图我们可以知道 rsyslog 主要是由 Input、Output、Parser 这样三个模块构成的,并且了解到数据的简单走向,首先通过 Input module 来收集消息,然后将得到的消息传给 Parser module,通过分析模块的层层处理,将真正需要的消息传给 Output module,然后便输出至日志文件中。

上文提到过 rsyslog 号称可以提供超过每秒一百万条消息给目标文件,怎么只是这样简单的结构。我们可以通过下图来做更深入的了解

linux学习笔记(实验楼) 实验17 linux日志系统

(图片来源于http://www.rsyslog.com/doc/queues_analogy.html

Rsyslog 架构如图中所示,从图中我们可以很清楚的看见,rsyslog 还有一个核心的功能模块便是 Queue,也正是因为它才能做到如此高的并发。

第一个模块便是 Input,该模块的主要功能就是从各种各样的来源收集 messages,通过这些接口实现:

linux学习笔记(实验楼) 实验17 linux日志系统

而 Output 中也有许多可用的接口,可以通过 man 或者官方的文档查看

而这些模块接口的使用需要通过 $ModLoad 指令来加载,那么返回上文的图中,配置生效的头两行可以看懂了,默认加载了 imklog、imuxsock 这两个模块

在配置中 rsyslog 支持三种配置语法格式:

  • sysklogd

  • legacy rsyslog

  • RainerScript

sysklogd 是老的简单格式,一些新的语法特性不支持。而 legacy rsyslog 是以 dollar 符($)开头的语法,在 v6 及以上的版本还在支持,就如上文所说的 $ModLoad 还有一些插件和特性只在此语法下支持。而以 $ 开头的指令是全局指令,全局指令是 rsyslogd 守护进程的配置指令,每行只能有一个指令。 RainnerScript 是最新的语法。在官网上 rsyslog 大多推荐这个语法格式来配置

老的语法格式(sysklogd & legacy rsyslog)是以行为单位。新的语法格式(RainnerScript)可以分割多行。

注释有两种语法:

  • 井号 #

  • C-style /* .. */

执行顺序: 指令在 rsyslog.conf 文件中是从上到下的顺序执行的。

模板是 rsyslog 一个重要的属性,它可以控制日志的格式,支持类似 template() 语句的基于 string 或 plugin 的模板,通过它我们可以自定义日志格式。

legacy 格式使用 $template 的语法,不过这个在以后要移除,所以最好使用新格式 template():,以免未来突然不工作了也不知道为什么

模板定义的形式有四种,适用于不同的输出模块,一般简单的格式,可以使用 string 的形式,复杂的格式,建议使用 list 的形式,使用 list 的形式,可以使用一些额外的属性字段(property statement)

如果不指定输出模板,rsyslog 会默认使用 RSYSLOG_DEFAULT。若想更深入的学习可以查看官方文档

了解了 rsyslog 环境的配置文件之后,我们看向 /etc/rsyslog.d/50-default.conf 这个配置文件,这个文件中主要是配置的 Filter Conditions,也就是我们在流程图中所看见的 Parser & Filter Engine,它的名字叫 Selectors 是过滤 syslog 的传统方法,他主要由两部分组成,facility 与 priority,其配置格式如下

linux学习笔记(实验楼) 实验17 linux日志系统

其中一个 priority 可以指定多个 facility,多个 facility 之间使用逗号 , 分割开

rsyslog 通过 Facility 的概念来定义日志消息的来源,以便对日志进行分类,Facility 的种类有:

linux学习笔记(实验楼) 实验17 linux日志系统

而另外一部分 priority 也称之为 serverity level,除了日志的来源以外,对统一源产生日志消息还需要进行优先级的划分,而优先级的类别有以下几种:

linux学习笔记(实验楼) 实验17 linux日志系统

我们来看看系统中的配置

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

这里的意思是 auth 与 authpriv 的所有优先级的信息全都输出于 /var/log/auth.log 日志中

而其中有类似于这样的配置信息意思有细微的差别

linux学习笔记(实验楼) 实验17 linux日志系统

- 代表异步写入,也就是日志写入时不需要等待系统缓存的同步,也就是日志还在内存中缓存也可以继续写入无需等待完全写入硬盘后再写入。通常用于写入数据比较大时使用。

到此我们对 rsyslog 的配置就有了一定的了解,若想更深入学习模板,队列的高级应用,大家可去查看官网的文档,需要注意的是 rsyslog 每个版本之间差异化比较大,学习之前先查看自己所使用的版本,再去查看相关的文档

与日志相关的还有一个还有常用的命令 logger,logger 是一个 shell 命令接口,可以通过该接口使用 Syslog 的系统日志模块,还可以从命令行直接向系统日志文件写入信息。

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

从图中我们可以看到我们成功的将 ping 的信息写入了 syslog 中,格式也就是使用的 rsyslog 的默认模板

我们可以通过 man 来查看 logger 的其他用法,

linux学习笔记(实验楼) 实验17 linux日志系统

 

 

四、转储的日志

 

在本地的机器中每天都有成百上千条日志被写入文件中,更别说是我们的服务器,每天都会有数十兆甚至更多的日志信息被写入文件中,如果是这样的话,每天看着我们的日志文件不断的膨胀,那岂不是要占用许多的空间,所以有个叫 logrotate 的东西诞生了。

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件。我们可以根据日志文件的大小,也可以根据其天数来切割日志、管理日志,这个过程又叫做“转储”。

大多数 Linux 发行版使用 logrotate 或 newsyslog 对日志进行管理。logrotate 程序不但可以压缩日志文件,减少存储空间,还可以将日志发送到指定 E-mail,方便管理员及时查看日志。

显而易见,logrotate 是基于 CRON 来运行的,其脚本是 /etc/cron.daily/logrotate;同时我们可以在 /etc/logrotate 中找到其配置文件

linux学习笔记(实验楼) 实验17 linux日志系统

linux学习笔记(实验楼) 实验17 linux日志系统

这其中的具体意思是什么呢?

linux学习笔记(实验楼) 实验17 linux日志系统

当然在 /etc/logrotate.d/ 中有各项应用的 logrotate 配置,还有更多的配置参数,大家可以使用 man 查看,如按文件大小转储,按当前时间格式命名等等参数配置。