今天来简单总结一下 Linux 的 日志系统。参考:
日志文件
概述
位置:
1 | 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 | 系统信息记录 |
apport.log | 读取内核信息来收集判断其他应用程序的信息,从而记录应用程序的崩溃信息。 |
格式
一般格式:
- 事件发生的时间
- 发生的主机名
- 启动的服务名称
- 实际信息内容
e.g. cat 查看日志 (从 alternatives.log 中得到信息有程序作用,日期,命令,成功与否的返回码等信息)
1 | cat /var/log/alternatives.log |
显示结果:
1 | update-alternatives 2016-08-18 18:03:40: run with --quiet --install /usr/bin/c++ c++ /usr/bin/clang++ 10 |
一般日志的格式内容大部分都是时间,操作这样。不过还有两个比较特殊的日志,它们并不是 ASCII 文件,而是被编码成了二进制文件,所以不能直接使用 less、cat、more 这样的工具命令来查看,这两个日志文件是 wtmp,lastlog。
查看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
框架
通过上面可以看出rsyslog 主要是由三个模块构成:
- Input
- Output
- Parser
其流程是首先通过 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 |
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 | 打印 |
邮件系统消息 | |
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 之外的等级的信息
可以从上面的文件中看到几项系统配置:
auth
与authpriv
的所有优先级的信息全都输出于/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 | # 设置每周转储一次(daily、weekly、monthly当然可以使用这些参数每天、星期,月 ) |
logrotate 日志转储
logrotate 的配置文件是 /etc/logrotate.conf
,是一个只读文件,通常不需要对它进行修改。而日志文件的转储设置在独立的配置文件中,放在 /etc/logrotate.d/
目录下。
我们先简单查看一下实验环境中已经配置的一些文件:
1 | ll /etc/logrotate.d/ |
举例说明日志如何转储:
创建日志文件:
1 | touch /var/log/log-file |
快速生成文件在其中填入一个 10MB 的随机比特流数据:
1 | chmod 777 /var/log/log-file |
为这个文件创建一个配置文件:
1 | touch /etc/logrotate.d/log-file |
Vim中编辑:
1 | /var/log/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 | vim /etc/logrotate.d/log-file |
在配置文件的开始部分 su root root
来指定进行转储的用户,否则会报错 (parent directory has insecure permissions)。
注:编写的配置文件的权限必须为:
-rw-r--r--
,否则logrotate 就无法正常工作。执行时就会提示:Ignoring mosquitto because of bad filemode。
使用 -d 选项是以预演方式运行 logrotate。不用实际转储任何日志文件,可以模拟演练日志轮循并显示其输出:
1 | sudo su root |
注:即使轮循条件没有满足,也可以通过使用 -f 选项来强制 logrotate 轮循日志文件,-v参数提供了详细的输出。
下面我们对所有配置文件进行转储操作。并且通过输出日志信息查看错误日志信息等。
1 | logrotate /etc/logrotate.d/ |
查看转储的情况:
1 | ll /var/log |