内容来自实验楼
日志文件
常见的日志文件
1 | $ sudo service rsyslog start |
| 日志名称 | 信息说明 |
|---|---|
alternatives.log |
系统的更新替代信息 |
apport.log |
应用程序崩溃信息记录 |
apt/history.log |
使用 apt-get 安装卸载软件的信息记录 |
apt/term.log |
使用 apt-get 时的具体操作 |
auth.log |
登录认证的 log 信息 |
boot.log |
系统启动时的日志信息 |
btmp |
记录所有失败启动信息 |
dmesg |
内核缓冲信息,在系统启动时,显示屏幕上的与硬件有关的信息 |
dpkg.log |
安装或 dpkg 命令清除软件包的日志 |
kern.log |
内核产生的日志,有助于在定制内核时解决问题 |
lastlog |
记录所有用户的最近信息。这不是一个 ASCII 文件,因此需要用 lastlog 命令查看内容 |
faillog |
用户登录失败信息。此外,错误登录命令也会记录在本文件中 |
wtmp |
包含登录信息。使用 wtmp 可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等 |
syslog |
系统信息记录 |
日志格式
日志内容的一般格式
- 事件发生的时间
- 发生的主机名
- 启动的服务名称
- 实际信息内容
cat 命令来查看一下几个常见日志文件的格式:
1 | # 系统的更新替代信息 |
1 | ... |
1 | # 从 dpkg.log 文件中可以知道 dpkg 命令安装或清除软件包的时间、安装包版本等日志信息。 |
1 | ... |
在 apt 文件夹中的日志信息,其中有两个日志文件 history.log 与 term.log ,两个日志文件的区别在于 history.log 主要记录了进行了什么操作,相关的依赖有哪些,而 term.log 则是较为具体的一些操作,主要就是下载包,打开包,安装包等等的细节操作。
先来看 var/log/apt/history.log 文件:
1 | Start-Date: 2020-01-02 14:56:07 |
然后来看 var/log/apt/term.log 文件:
1 | Log started: 2020-01-02 14:56:07 |
像上面几个日志的格式内容大部分都是时间,操作这样。不过还有有两个比较特殊的日志,它们的查看的方式也比较与众不同,因为这两个日志并不是 ASCII 文件 而是被编码成了二进制文件,所以不能直接使用 less、cat、more 这样的工具命令来查看,这两个日志文件是 wtmp,lastlog。
查看的方法是使用 last 和 lastlog 工具来提取其中的信息。
- last
1 | $ last |
- lastlog
1 | $ lastlog --help |
1 | $ last |
rsyslog 系统日志
rsyslog 系统日志概述
日志产生的方式一般存在两种方式:
- 一种是由软件开发商自己来自定义日志格式然后指定输出日志位置;
- 一种方式就是 Linux 提供的日志服务程序,而我们这里系统日志是通过 syslog 来实现,提供日志管理服务。
syslog 是一个系统日志记录程序,在早期的大部分 Linux 发行版都是内置 syslog,让其作为系统的默认日志收集工具,虽然时代的进步与发展,syslog 已经跟不上时代的需求,所以他被 rsyslog 所代替了,较新的 Ubuntu、Fedora 等等都是默认使用 rsyslog 作为系统的日志收集工具。
rsyslog 的全称是 rocket-fast system for log,它提供了高性能,高安全功能和模块化设计。rsyslog 能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。
其默认的 rsyslog 配置文件是:
/etc/rsyslog.conf文件:该配置文件主要决定需要加载的模块、文件所属者等/etc/rsyslog.d/50-default.conf。该文件主要是配置Filter Conditions,详细内容后续会涉及。)
rsyslog 的结构框架
先通过一个简单的流程图来了解一下 rsyslog的结构框架和数据流走向。
通过上面的图片可以看出rsyslog 主要是由
InputOutputParser
三个模块构成的。
其流程是首先通过 Input module 来收集消息,然后将得到的消息传给Parser module,通过分析模块的层层处理,将真正需要的消息传给 Output module,然后便输出至日志文件中。
官方的 Rsyslog 架构如图中所示,rsyslog 还有一个核心的功能模块是 Queue,便是它的存在使得 rsyslog 高并发优势的突出:

Input 模块:主要功能就是从各种各样的来源收集 messages,通过这些接口实现:
| 接口名 | 作用 |
|---|---|
| im3195 | RFC3195 Input Module |
| imfile | Text File Input Module |
| imgssapi | GSSAPI Syslog Input Module |
| imjournal | Systemd Journal Input Module |
| imklog | Kernel Log Input Module |
| imkmsg | /dev/kmsg Log Input Module |
| impstats | Generate Periodic Statistics of Internal Counters |
| imptcp | Plain TCP Syslog |
| imrelp | RELP Input Module |
| imsolaris | Solaris Input Module |
| imtcp | TCP Syslog Input Module |
| imudp | UDP Syslog Input Module |
| imuxsock | Unix Socket Input |
Output 模块,也有许多可用的接口来实现。
Output 也被称为 actions。 一个组操作内容都是预先加载的(比如输出文件编写器,几乎在每个 rsyslog.conf 中都使用)。
通过 action(type =“type”…)对象调用一个动作。Type 是强制性的,并且必须包含要调用的插件的名称(例如 “omfile” 或 “ommongodb”)。 其他参数可能存在。 他们的类型和使用取决于问题的输出插件。
补充: 这些模块接口的都需要通过
$ModLoad指令来加载,在下文中会为大家展示/etc/rsyslog.conf的内容,大家可以注意前两行,其意思就是默认加载了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环境的配置文件想要深入了解的朋友可以参看一下 官方文档
配置文件内容
1 | $ cat /etc/rsyslog.conf |
rsyslog 系统日志的配置
查看系统中的配置
1 | $ vim /etc/rsyslog.d/50-default.conf |
配置文件格式说明: 日志设备(类型).(连接符号)日志级别 日志处理方式
日志设备(类型)
| 设备 | 说明 |
|---|---|
auth |
pam 产生的日志 |
authpriv |
ssh,ftp 等登录信息的验证信息,即权限系统 |
cron |
时间任务相关,计划安排 |
kern |
内核消息 |
lpr |
打印 |
mail |
邮件系统消息 |
mark(syslog) |
rsyslog 服务内部的信息,时间标识 |
news |
新闻组消息 |
user |
用户程序产生的相关信息 |
uucp |
unix 主机之间相关的通讯 |
local 1~7 |
自定义的日志设备 |
日志级别
从上到下,日志级别由高到低,记录的信息越来越少。
| priority 取值 | 值 | 说明 |
|---|---|---|
emerge |
0 | 发生严重事件,并有导致系统崩溃的潜在危险。报告软件或者硬件问题 |
alert |
1 | 严重错误消息,会导致程序关闭并可能影响其他程序 |
crit |
2 | 错误消息,可能会导致程序关闭的事件重 |
err |
3 | 程序中存在错误的通告 |
warning |
4 | 程序中存在潜在问题的警告信息 |
notice |
5 | 程序运行中产生了值得注意的事件 |
info |
6 | 关于程序当前状态的报告信息 |
debug |
7 | 编程人员或测试人员使用的调试信息 |
注:基本上,
info,notice,warn这三个讯息都是在告知一些基本信息,应该还不至于造成一些系统运作困扰。
- 优先级(priority)可参照 syslog 命令手册
连接符号
.xx: 表示大于等于 xx 级别的信息.=xx:表示等于 xx 级别的信息.!xx:表示在 xx 之外的等级的信息
可以从上面的文件中看到几项系统配置:
1 | # kern 的所有优先级信息异步写入 /var/log/kern.log 日志中 |
举例
通过命令行向日志文件写入信息:
1 | #首先将syslog启动起来 |
日志文件的转储
logrotate 管理日志文件
在本地的机器中每天都会有成百上千条日志被写入文件中,而服务器中每天更是有数十兆甚至更多的日志信息被写入文件中,那么每天日志文件就会不断的膨胀,就会占用许多的空间,这个时候 logrotate 的出现正好就解决了这样一个问题。
logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,然后创建新的日志文件。可以根据日志文件的大小,也可以根据其天数来切割日志、管理日志,这个过程又叫做“转储”。
大多数 Linux 发行版使用 logrotate 或 newsyslog对日志进行管理。logrotate 程序不但可以压缩日志文件,减少存储空间,还可以将日志发送到指定 E-mail,方便管理员及时查看日志。
其中 logrotate 是基于 CRON 来运行的,脚本是 /etc/cron.daily/logrotate;同时配置文件在 /etc/logrotate.conf 和 /etc/logrotate.d 中找到。
首先,我们一起来看看 /etc/logrotate.conf 这个文件中的内容。
1 | $ cat /etc/logrotate.conf |
logrotate 日志转储
logrotate 的配置文件是 /etc/logrotate.conf,是一个只读文件,通常不需要对它进行修改。而日志文件的转储设置在独立的配置文件中,放在 /etc/logrotate.d/目录下。
我们先通过 cat 命令来简单查看一下实验环境中已经配置的一些文件。
1 | $ ll /etc/logrotate.d/ |
1 | total 40 |
1 | $ cat /etc/logrotate.d/apt |
1 | /var/log/apt/term.log { |
举一个例子来详细说明一下日志是如何进行转储的。
首先创建一个日志文件,然后快速生成文件在其中填入一个 10MB 的随机比特流数据。
1 | $ sudo touch /var/log/log-file |
然后,我们为这个文件创建一个配置文件
1 | $ sudo touch /etc/logrotate.d/log-file |
说明:
monthly: 日志文件按月转储。可以换成daily,weekly或者yearly。rotate 5: 一次转储 最近的 5 个归档日志。compress: 在转储任务完成后,已转储的日志将使用gzip进行压缩。delaycompress: 和compress选项一起使用,delaycompress表示logrotate不会将最近的压缩,压缩将在下一次转储周期进行。missingok: 在日志转储的时候,任何错误将被忽略,例如“文件无法找到”之类的错误。notifempty: 如果日志文件为空,转储不会进行。create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。rsyslogd进程将立即再次读取其配置并继续运行。
上面的配置比较的全面,可以当做一个模板,在实际中的配置参数根据你的需求来进行调整。
例如,当文件满足 10M 就转储一个日志文件。
1 | $ sudo vim /etc/logrotate.d/log-file |
在配置文件的开始部分 su root root 来指定进行转储的用户,否则会报错:“parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.”。
保存退出后,通过 logrotate 命令来调用日志。
注:编写的配置文件的权限必须为:-rw-r--r-- ,否则logrotate 就无法正常工作。执行时就会提示:Ignoring mosquitto because of bad filemode。
1 | $ sudo su root |
使用 -d 选项是以预演方式运行 logrotate。不用实际转储任何日志文件,可以模拟演练日志轮循并显示其输出。