美文网首页
Linux的syslog与logrotate运用

Linux的syslog与logrotate运用

作者: a_one_and_a_two | 来源:发表于2018-12-04 21:15 被阅读0次

参考: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.conf

4)由于/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 及实现

相关文章

网友评论

      本文标题:Linux的syslog与logrotate运用

      本文链接:https://www.haomeiwen.com/subject/imnmcqtx.html