参考:Linux下的rsyslog系统日志梳理(用户操作记录审计) - 云+社区 - 腾讯云
参考:syslog(3) - Linux manual page
参考:syslog简介——系统日志写入API - bonelee - 博客园
参考:18.2 rsyslog.service :记录登录文件的服务 · 鸟哥的 Linux 私房菜:基础学习篇 第四版 · 看云
参考:syslog 详解 - 阳水平的博客 - CSDN博客(该博文含syslog协议相关说明)
参考:系统运维|Linux日志文件总管——logrotate
参考:Linux下logrotate命令使用.配置和理解 - junli_chen的博客 - CSDN博客
简介
syslog是Linux系统默认的日志守护进程,出现在老版本的Linux上。syslog本身也是Unix类操作系统上的一种协议,广泛应用于系统日志。
rsyslog多线程增强版的syslog,数据库支持(MySQL、PostgreSQL、Oracle等)、日志内容筛选、定义日志格式模板等。目前大多数Linux发行版默认也是使用rsyslog进行日志记录。提供了三种远程传输协议:UDP、TCP、RELP传输协议。后文所述的syslog指新版的rsyslog。
logrotate可让你轻松管理系统所产生的记录文件。它提供自动替换,压缩,删除和邮寄记录文件。定义好rotate规则以免造成磁盘空间消耗过大。
※下文的实验主要以Ubuntu 16.04为环境基础进行。
rsyslog编程
需要#include <syslog.h>。
openlog():打开日志连接
void openlog(const char *ident, int option, int facility);
openlog() opens a connection to the system logger for a program. The string pointed to by ident is prepended to every message, and is typically set to the program name. If ident is NULL, the program name is used.
The option argument specifies flags which control the operation of openlog() and subsequent calls to syslog(). The facility argument establishes a default to be used if none is specified in subsequent calls to syslog(). The values that may be specified for option and facility are described below.
The use of openlog() is optional; it will automatically be called by syslog() if necessary, in which case ident will default to NULL.
关于ident参数,通常为设置为进程名,如果只为null,则默认使用进程名。
关于option参数,通常设置为 LOG_CONS | LOG_PID 。
Values for option The option argument to openlog() is a bit mask constructed by ORing together any of the following values:
LOG_CONS Write directly to the system console if there is an
error while sending to the system logger.
LOG_NDELAY Open the connection immediately (normally, the
connection is opened when the first message is
logged). This may be useful, for example, if a
subsequent chroot(2) would make the pathname used
internally by the logging facility unreachable.
LOG_NOWAIT Don't wait for child processes that may have been
created while logging the message. (The GNU C library
does not create a child process, so this option has no
effect on Linux.)
LOG_ODELAY The converse of LOG_NDELAY; opening of the connection
is delayed until syslog() is called. (This is the
default, and need not be specified.)
LOG_PERROR (Not in POSIX.1-2001 or POSIX.1-2008.) Also log the
message to stderr.
LOG_PID Include the caller's PID with each message.
关于facility参数,对于如我一样通过syslog为自己的应用程序记录log的话,一版采用 LOG_LOCAL0 ~ LOG_LOCAL7。
Values for facility The facility argument is used to specify what type of program is
logging the message. This lets the configuration file specify that
messages from different facilities will be handled differently.
LOG_AUTH security/authorization messages
LOG_AUTHPRIV security/authorization messages (private)
LOG_CRON clock daemon (cron and at)
LOG_DAEMON system daemons without separate facility value
LOG_FTP ftp daemon
LOG_KERN kernel messages (these can't be generated from user
processes)
LOG_LOCAL0 through LOG_LOCAL7 reserved for local use
LOG_LPR line printer subsystem
LOG_MAIL mail subsystem
LOG_NEWS USENET news subsystem
LOG_SYSLOG messages generated internally by syslogd(8)
LOG_USER (default)
generic user-level messages
LOG_UUCP UUCP subsystem
openlog()是如何知道接下来的log该记录到哪个文件呢?
这便是rsyslog.conf文件的功劳了。LOG_LOCALx会被映射为某个action,可能写入某个文件,也可能发往某个IP地址。
syslog() and vsyslog():记录日志。
void syslog(int priority, const char *format, ...);
void vsyslog(int priority, const char *format, va_list ap);
syslog() generates a log message, which will be distributed by syslogd(8).
The priority argument is formed by ORing together a facility value and a level value (described below). If no facility value is ORed into priority, then the default value set by openlog() is used, or, if there was no preceding openlog() call, a default of LOG_USER is employed.
The remaining arguments are a format, as in printf(3), and any arguments required by the format, except that the two-character sequence %m will be replaced by the error message string strerror(errno). The format string need not include a terminating newline character.
The function vsyslog() performs the same task as syslog() with the difference that it takes a set of arguments which have been obtained using the stdarg(3) variable argument list macros.
关于priority参数,用于表示该条日志的重要度,取值如下:
Values for level This determines the importance of the message. The levels are, in
order of decreasing importance:
LOG_EMERG system is unusable
LOG_ALERT action must be taken immediately
LOG_CRIT critical conditions
LOG_ERR error conditions
LOG_WARNING warning conditions
LOG_NOTICE normal, but significant, condition
LOG_INFO informational message
LOG_DEBUG debug-level message
The function setlogmask(3) can be used to restrict logging to
specified levels only.
closelog():关闭日志连接。
void closelog(void);
closelog() closes the file descriptor being used to write to the system logger. The use of closelog() is optional.
rsyslog配置
/etc/rsyslog.conf作为主配置文件包含了/etc/rsyslog.d/目录下的若干conf文件。其中50-default.conf是syslog的默认配置文件。
rsyslog相关配置文件该配置文件的基本格式为:
facility.level action
※facility.level为选择条件,本身分为两个字段,之间用一个小数点(.)分隔。action和facility.level之间使用TAB隔开。
facility
有23种设备类型可选。
| 相对序号 | 服务类别 | 说明 |
| --- | --- |
| 0 | kern(kernel) | 就是核心 (kernel) 产生的讯息,大部分都是硬件侦测以及核心功能的启用 |
| 1 | user | 在使用者层级所产生的信息,例如后续会介绍到的用户使用 logger 指令来记录登录文件的功能 |
| 2 | mail | 只要与邮件收发有关的讯息记录都属于这个; |
| 3 | daemon | 主要是系统的服务所产生的信息,例如 systemd 就是这个有关的讯息! |
| 4 | auth | 主要与认证/授权有关的机制,例如 login, ssh, su 等需要帐号/密码的咚咚; |
| 5 | syslog | 就是由 syslog 相关协定产生的信息,其实就是 rsyslogd 这支程序本身产生的信息啊! |
| 6 | lpr | 亦即是打印相关的讯息啊! |
| 7 | news | 与新闻群组服务器有关的东西; |
| 8 | uucp | 全名为 Unix to Unix Copy Protocol,早期用于 unix 系统间的程序数据交换; |
| 9 | cron | 就是例行性工作调度 cron/at 等产生讯息记录的地方; |
| 10 | authpriv | 与 auth 类似,但记录较多帐号私人的信息,包括 pam 模块的运行等! |
| 11 | ftp | 与 FTP 通讯协定有关的讯息输出! |
| 16~23 | local0 ~ local7 | 保留给本机用户使用的一些登录文件讯息,较常与终端机互动。 |
* 通配符代表除了 mark 以外的所有功能
level
消息级别,指定syslog优先级。
| 等级数值 | 等级名称 | 说明 |
| --- | --- || 7 | debug | 用来 debug (除错) 时产生的讯息数据; |
| 6 | info | 仅是一些基本的讯息说明而已; |
| 5 | notice | 虽然是正常信息,但比 info 还需要被注意到的一些信息内容; |
| 4 | warning(warn) | 警示的讯息,可能有问题,但是还不至于影响到某个 daemon 运行的信息;基本上, info, notice, warn 这三个讯息都是在告知一些基本信息而已,应该还不至于造成一些系统运行困扰; |
| 3 | err(error) | 一些重大的错误讯息,例如配置文件的某些设置值造成该服务服法启动的信息说明, 通常借由 err 的错误告知,应该可以了解到该服务无法启动的问题呢! |
| 2 | crit | 比 error 还要严重的错误信息,这个 crit 是临界点 (critical) 的缩写,这个错误已经很严重了喔! |
| 1 | alert | 警告警告,已经很有问题的等级,比 crit 还要严重! |
| 0 | emerg(panic) | 疼痛等级,意指系统已经几乎要死机的状态! 很严重的错误信息了。通常大概只有硬件出问题,导致整个核心无法顺利运行,就会出现这样的等级的讯息吧! |
* 代表所有级别,除了none
设备类型与消息等级之前还有 [.=!] 的链接符号,代表:
. :代表“比后面还要严重的等级 (含该等级) 都被记录下来”的意思,例如: mail.info 代表只要是 mail 的信息,而且该信息等级严重于 info (含 info 本身)时,就会被记录下来的意思。.
=:代表所需要的等级就是后面接的等级而已, 其他的不要!
.!=:代表不等于, 亦即是除了该等级外的其他等级都记录。
一般来说,我们比较常使用的是“.”这个链接符号
※详细说明可参考:https://linux.die.net/man/5/syslog.conf
action
讯息记录的文件名或设备或主机。日志信息可以分别记录到多个文件里,还可以发送到命名管道、其他程序甚至另一台机器。
文件的绝对路径:通常就是放在 /var/log 里头的文件啦!
打印机或其他:例如 /dev/lp0 这个打印机设备
使用者名称:显示给使用者啰!
远端主机:例如 @study.vbird.tsai 当然啦,要对方主机也能支持才行!
*:代表“目前在线上的所有人”,类似wall这个指令的意义!
服务、daemon 与函数名称
例如,本人Ubuntu服务器的默认conf文件内容大致为:
50-default.conf的默认配置rsyslog实验
1)创建一个syslog_test.c文件,内容如下:
syslog_test.c其中的LOCAL0是我为本应用指定的日志设备,将来会在rsyslog.conf进行配置。
2)编译生成二进制可执行程序syslog_test。
3)在/etc/rsyslog.d/文件夹下copy既有文件,修改生成一个my_local0.conf的配置文件。
my_local0.conf4)由于/etc/rsyslog.d/文件夹下的所有conf文件都被include进了/etc/rsyslog.conf,所以本文件无需修改。直接重启rsyslog服务即可。
重启rsyslog服务5)执行2)中生成的syslog_test程序,查看/var/log/local0.log文件的生成与内容变化。
查看log文件关于log内容
参考上图,格式基本:
timestamp hostname ident[pid]: log message
※时间戳 主机名 ident指定字串[进程ID]: 日志内容
修改代码中ident指定为NULL,运行发现记录结果与上图无异。及ident默认使用程序名称进行打印。
logrotate配置
logrotate配置需要/etc/logrotate.conf文件,及/etc/logrotate.d/目录下的各conf文件。
/etc/logrotate.conf主要参数说明如下:
配置参数 功能说明
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
logrotate实验
1)在/etc/logrotate.d/目录下copy并修改/etc/logrotate.d/my_local0_rotate配置文件。
/etc/logrotate.d/my_local0_rotate※中间遇到权限问题,追加了su root root。
2)手动运行logrotate,-d指令用于预演方式运行,验证日志轮循和输出。
logrotate预演3)采用强制轮循方式检查logrotate结果。
强制轮循可见local0的gz压缩文件已经被创建。此时local0.log内容已被转储。
log被转储扩展
内核日志最终是如何通过rsyslog进行记录的,相关说明可参见:内核日志:API 及实现
网友评论