【Linux学习笔记十六】Linux 日志系统

Linux之日志系统

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

  • 常见的日志
  • 配置的日志
  • 轮替的日志

一、常见的日志

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

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

ll /var/log

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

  • 系统日志
  • 应用日志

系统日志主要是存放系统内置程序或系统内核之类的日志信息如 alternatives.log 、btmp 等等

应用日志主要是我们装的第三方应用所产生的日志如 tomcat7 、apache2 等等。

常见的系统日志

图片描述

并不能直接使用 less、cat、more 这样的工具来查看,这两个日志文件是 wtmp,lastlog

使用 last 与 lastlog 工具来提取其中的信息

二、配置的日志

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

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

较新的Ubuntu、Fedora 等等都是默认使用 rsyslog 作为系统的日志收集工具

rsyslog能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog可以提供超过每秒一百万条消息给目标文件,

sudo service rsyslog start

![图片描述](https://dn-simplecloud.shiyanlou.com/uid/332831/1484217102636.png-wm)

ps aux | grep syslog

rsyslog 的配置文件有两个,一个是 /etc/rsyslog.conf 一个是 /etc/rsyslog.d/50-default.conf

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

第二个主要是配置的 Filter Conditions

rsyslog 的结构框架,数据流的走向

图片描述

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

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

图片描述

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

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

图片描述

而 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 的模板,便是通过它来自定义我们的日志格式

最好使用新格式 template():,以免未来突然不工作了也不知道为什么

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

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

facility.priority     log_location

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

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

图片描述

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

图片描述

系统中的配置

auth,authpriv.*       /var/log/auth.log

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

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

kern.*      -/var/log/kern.log

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

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

#首先将syslog启动起来
sudo service rsyslog start

#向 syslog 写入数据
ping 127.0.0.1 | logger -it logger_test -p local3.notice &

#查看是否有数据写入
tail -f /var/log/syslog

通过 man 来查看 logger 的更深入用法,上诉命令中

参数 内容

-i 在每行都记录进程ID

-t 添加tag标签

-p 设置日志的facility与priority

三、转储的日志

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

大多数Linux发行版使用 logrotate 或 newsyslog 对日志进行管理

logrotate 程序不但可以压缩日志文件,减少存储空间,还可以将日志发送到指定 E-mail,方便管理员及时查看日志。

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

cat /etc/logrotate
# see "man logrotate" for details  //可以查看帮助文档
# rotate log files weekly
weekly                             //设置每周转储一次(daily、weekly、monthly当然可以使用这些参数每天、星期,月 )
# keep 4 weeks worth of backlogs
rotate 4                           //最多转储4次
# create new (empty) log files after rotating old ones
create                             //当转储后文件不存在时创建它
# uncomment this if you want your log files compressed
compress                          //通过gzip压缩方式转储(nocompress可以不压缩)
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d           //其他日志文件的转储方式配置文件,包含在该目录下
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {                    //设置/var/log/wtmp日志文件的转储参数
    monthly                        //每月转储
    create 0664 root utmp          //转储后文件不存在时创建它,文件所有者为root,所属组为utmp,对应的权限为0664
    rotate 1                       //最多转储一次
}

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

了解系统日志结构,以及我们可以从中获取什么样的信息,给我们带来什么样的价值。还有日志工具的配置,以及省心省力的 logrotate

发表评论

电子邮件地址不会被公开。 必填项已用*标注