Merikanto

一簫一劍平生意,負盡狂名十五年

Linux Log System

今天来简单总结一下 Linux 的 日志系统。参考:

Rsyslog 官方文档

Rsyslog 官方配置文件



日志文件

概述

位置

1
2
service rsyslog start
ll /var/log

常见日志文件

日志名称 信息说明
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 系统信息记录
apport.log 读取内核信息来收集判断其他应用程序的信息,从而记录应用程序的崩溃信息。

格式

一般格式:

  • 事件发生的时间
  • 发生的主机名
  • 启动的服务名称
  • 实际信息内容

e.g. cat 查看日志 (从 alternatives.log 中得到信息有程序作用,日期,命令,成功与否的返回码等信息)

1
cat /var/log/alternatives.log

显示结果:

1
2
3
update-alternatives 2016-08-18 18:03:40: run with --quiet --install /usr/bin/c++ c++ /usr/bin/clang++ 10
update-alternatives 2016-08-18 18:03:40: run with --quiet --install /usr/bin/cc cc /usr/bin/clang 10
...

一般日志的格式内容大部分都是时间,操作这样。不过还有两个比较特殊的日志,它们并不是 ASCII 文件,而是被编码成了二进制文件,所以不能直接使用 less、cat、more 这样的工具命令来查看,这两个日志文件是 wtmplastlog

查看lastlog:

1
last
选项 解释
-b 仅打印早于 DAYS 的最近登录记录
-h 显示此帮助信息并推出
-R chroot 到的目录
-t 仅打印晚于 DAYS 的最近登录记录
-u 打印 LOGIN 用户的最近登录记录

e.g.

1
lastlog -u merikanto

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

框架

struct

通过上面可以看出rsyslog 主要是由三个模块构成:

  • Input
  • Output
  • Parser

其流程是首先通过 Input module 来收集消息,然后将得到的消息传给Parser module,通过分析模块的层层处理,将真正需要的消息传给 Output module,然后便输出至日志文件中。

官方的 Rsyslog 架构如下图所示,rsyslog 还有一个核心的功能模块是 Queue,便是它的存在使得 rsyslog 高并发优势的突出:

struct

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
imrelp RELP Input Module
imsolaris Solaris Input Module
imptcp Plain TCP Syslog
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 是以 $ 开头的语法,指令是全局指令 (全局指令是 rsyslogd 守护进程的配置指令,每行只能有一个指令)。

RainnerScript 是最新的语法。在官网上 rsyslog 大多推荐这个语法格式来配置。

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


注释有两种语法:

  • 井号 #
  • C-style/* .. */

配置

查看系统中的配置

1
vim /etc/rsyslog.d/50-default.conf 

配置文件格式说明

1
日志设备(类型).(连接符号)日志级别  日志处理方式

日志设备(类型):

设备 说明
auth pam 产生的日志
authpriv ssh, ftp 等登录信息的验证信息,即权限系统
cron 时间任务相关,计划安排
kern 内核消息
lpr 打印
mail 邮件系统消息
mark(syslog) rsyslog 服务内部的信息,时间标识
news 新闻组消息
user 用户程序产生的相关信息
uucp unix 主机之间相关的通讯
local 1~7 自定义的日志设备

日志级别:

从上到下,日志级别由高到低,记录的信息越来越少。基本上,warning (4), notice (5), info (6) 这三个讯息都是在告知一些基本信息,应该还不至于造成一些系统运作困扰。

priority 取值 说明
emerge 0 发生严重事件,并有导致系统崩溃的潜在危险。报告软件或者硬件问题
alert 1 严重错误消息,会导致程序关闭并可能影响其他程序
crit 2 错误消息,可能会导致程序关闭的事件重
err 3 程序中存在错误的通告
warning 4 程序中存在潜在问题的警告信息
notice 5 程序运行中产生了值得注意的事件
info 6 关于程序当前状态的报告信息
debug 7 编程人员或测试人员使用的调试信息

连接符号:

  • .xx : 表示大于等于 xx 级别的信息

  • .=xx:表示等于 xx 级别的信息

  • .!xx:表示在 xx 之外的等级的信息

可以从上面的文件中看到几项系统配置:

  • authauthpriv 的所有优先级的信息全都输出于 /var/log/auth.log 日志中

    1
    auth,authpriv.* /var/log/auth.log
  • kern 的所有优先级信息异步写入 /var/log/kern.log 日志中

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

    -代表异步写入,也就是说日志写入时不需要等待系统缓存的同步。通常写入数据比较大时使用。


举例:

syslog启动

1
sudo service rsyslog start

向 syslog 写入数据

1
ping 127.0.0.1 | logger -it logger_test -p local3.notice &

查看:

1
sudo tail -f /var/log/syslog

退出:

1
Ctrl + C

日志的转储

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

文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 设置每周转储一次(daily、weekly、monthly当然可以使用这些参数每天、星期,月 )
weekly

# 最多转储4次
rotate 4

# 当转储后文件不存在时创建它
create

# 通过gzip压缩方式转储(nocompress可以不压缩)
compress

# 其他日志文件的转储方式配置文件,包含在该目录下
include /etc/logrotate.d

# 设置/var/log/wtmp日志文件的转储参数
/var/log/wtmp {

# 每月转储
monthly

# 转储后文件不存在时创建它,文件所有者为root,所属组为utmp,对应的权限为0664
create 0664 root utmp

# 最多转储一次
rotate 1
}

logrotate 日志转储

logrotate 的配置文件是 /etc/logrotate.conf,是一个只读文件,通常不需要对它进行修改。而日志文件的转储设置在独立的配置文件中,放在 /etc/logrotate.d/ 目录下。

我们先简单查看一下实验环境中已经配置的一些文件:

1
2
3
4
ll /etc/logrotate.d/

cat /etc/logrotate.d/apt
cat /etc/logrotate.d/dpkg

举例说明日志如何转储:

创建日志文件:

1
touch /var/log/log-file

快速生成文件在其中填入一个 10MB 的随机比特流数据:

1
2
chmod 777 /var/log/log-file
head -c 10M </dev/urandom > /var/log/log-file

为这个文件创建一个配置文件:

1
2
touch /etc/logrotate.d/log-file
vim /etc/logrotate.d/log-file

Vim中编辑:

1
2
3
4
5
6
7
8
9
10
11
/var/log/log-file {
monthly
rotate 5
compress
delaycompress
missingok
notifempty
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}

说明

  • monthly : 日志文件按月转储。可以换成 daily,weekly 或者 yearly 。
  • rotate 5 : 一次转储 最近的 5 个归档日志。
  • compress : 在转储任务完成后,已转储的日志将使用 gzip 进行压缩。
  • delaycompress : 和 compress 选项一起使用,delaycompress 表示 logrotate 不会将最近的压缩,压缩将在下一次转储周期进行。
  • missingok : 在日志转储的时候,任何错误将被忽略,例如“文件无法找到”之类的错误。
  • notifempty : 如果日志文件为空,转储不会进行。
  • create 644 root root : 以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。
  • postrotate/endscript : 在所有其它指令完成后,postrotateendscript 里面指定的命令将被执行。rsyslogd 进程将立即再次读取其配置并继续运行。

例如,当文件满足 10M 就转储一个日志文件:

1
2
3
4
5
6
7
8
9
10
11
vim /etc/logrotate.d/log-file

/var/log/log-file{
su root root
size=10M
rotate 5
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}

在配置文件的开始部分 su root root 来指定进行转储的用户,否则会报错 (parent directory has insecure permissions)。

注:编写的配置文件的权限必须为:-rw-r--r-- ,否则logrotate 就无法正常工作。执行时就会提示:Ignoring mosquitto because of bad filemode。

使用 -d 选项是以预演方式运行 logrotate。不用实际转储任何日志文件,可以模拟演练日志轮循并显示其输出:

1
2
sudo su root
logrotate -d /etc/logrotate.d/log-file

注:即使轮循条件没有满足,也可以通过使用 -f 选项来强制 logrotate 轮循日志文件,-v参数提供了详细的输出。


下面我们对所有配置文件进行转储操作。并且通过输出日志信息查看错误日志信息等。

1
logrotate /etc/logrotate.d/

查看转储的情况:

1
ll /var/log