syslog日志介绍
要使用syslog
日志前,我们必须回答下面这个问题:
- syslog日志和我们自己定义一个日志文件,并向其写日志有何区别?
- 回答:syslog是面向管理员、面向整个系统的。一般syslog监控的是整个系统的状态,而我们自定义的日志一般只面向我们使用的进程。如果使用自定义日志文件,可以选择开源的
easyloger
日志库)。
- 回答:syslog是面向管理员、面向整个系统的。一般syslog监控的是整个系统的状态,而我们自定义的日志一般只面向我们使用的进程。如果使用自定义日志文件,可以选择开源的
- 为什么要使用linux自带的log日志?
- 回答:为了维护方便,我们使用日志输出时,需要有输出级别控制、输出信息定位字段选择(如时间、函数)等功能。syslog库已经封装好了这些功能。使用方便。
- syslog库有何优点?
- 回答:syslog日志消息既可以打印在控制台、记录在本地文件中,也可以通过网络发送到接收syslog的服务器。接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。常见应用场景是网络管理工具、安全管理系统、日志审计系统。
syslog日志用户空间接口详解:
- 一般的日志输出接口都包含下面四个部分:
输出级别
:英文术语一般为level
,syslog中叫prioritiy
.用于控制输出哪些等级的日志。比如我们在调试阶段通常会打印所有的信息,而在运行时只打印告警以上的信息。就可以通过控制输出级别来实现。下面是syslog的输出级别:- LOG_EMERG:系统不可用(断言)
- LOG_ALERT:需要立即采取动作
- LOG_CRIT:临界状态
- LOG_ERR:错误
- LOG_WARNING:警告
- LOG_NOTICE:正常但需要注意
- LOG_INFO:正常信息
- LOG_DEBUG:调试信息
谁输出的
(英文术语为facility
)。如这条信息是由哪种类型的进程打印的。syslog分为如下几种类别:- LOG_KERN:内核消息
- LOG_USER:用户进程消息
- LOG_MAIL:邮箱系统相关
- LOG_DAEMON:守护进程相关
- LOG_AUTH:用户授权
- LOG_SYSLOG:由syslogd在内部生成的消息
- LOG_LPR:与打印有关的信息
- LOG_NEWS:来自新闻服务器的信息
- LOG_UUCP:由uucp生成的信息。
- LOG_CRON:时钟守护进程
- LOG_AUTHPRIV:授权和安全
- LOG_FTP:ftp消息。
- LOG_LOCAL0~LOG_LOCAL7:本地用户消息
输出信息中包含哪些字段
,如时间、进程PID、文件名、函数名等。这个部分主要是为了方便用户查找打印信息的位置。用户信息
:用户要输出的打印信息。
下面是syslog用户空间的接口函数。使用时需要包含syslog.h
头文件。
void openlog(const char *ident, int option, int facility)
- 描述:打开或者重新打开一个日志连接。
- ident:是一个任意的标识字符串.会添加到日志信息的前面。用于区分各个进程的打印信息。如果为NULL,系统会默认使用进程名(即,
argv[0]
字符串).注意,ident指向的字符串必须为全局有效。 - option:可以是下面选项的组合:
- LOG_PID:在日志信息中包含进程标识符,这是系统分配给每个进程的一个唯一值.
- LOG_CONS:如果信息不能被记录到日志文件中,就把它们发送到控制台.
- LOG_ODELAY:在第一次调用syslog时才打开日志功能.
- LOG_NDELAY:立即打开日志功能,而不是等到第一次记录日志时.
- LOG_PERROR:同时打印到stderr。
- facility:见上面讲到的
谁输出的
部分。
void syslog(int priority, const char *format, ...)
- 描述:用来打印用户想输出的日志信息。
- priority:要输出的日志级别。
- 其他使用跟printf()一致。
void closelog(void)
- 描述:关闭当前打开的日志连接。
int setlogmask(int mask)
- 描述:用来设置日志输出的级别。
- mask:一般使用下面两个宏来进行设置。如果mask为0,则不修改优先级别。
- LOG_MASK(pri):屏蔽某个级别。
- LOG_UPTO(pri):屏蔽某个级别以下的所有日志显示。
- 其中参数pri为上面提到的优先级别。
- return:返回先前的优先级别。
当然,我们在使用时也可以不调用openlog()函数打开日志连接。而直接使用syslog().此时系统会自动先打开日志连接。(此时的ident为进程名,option为无,facility为LOG_USER))。
下面是一个简单的使用例程。
#include <syslog.h>
#include <stdio.h>
void main(void)
{
openlog("theboymoName", LOG_PID | LOG_PERROR,LOG_USER);
//setlogmask(LOG_MASK(LOG_ERR));//此时只打印LOG_ERR等级信息
setlogmask(LOG_UPTO(LOG_INFO));//此时只打印>=LOG_INFO等级信息
syslog(LOG_DEBUG,"this is DEBUG log");
syslog(LOG_INFO,"this is INFO log");
syslog(LOG_ERR,"this is ERR log");
closelog();
}
/* 使用setlogmask(LOG_MASK(LOG_ERR))输出结果为:
* theboymoName[214]: this is ERR log
* 使用setlogmask(LOG_UPTO(LOG_INFO))输出结果为:
* theboymoName[220]: this is INFO log
* theboymoName[220]: this is ERR log
*/
syslog客户端配置与使用
上面介绍的是linux系统日志用户空间的标准接口函数以及函数的使用。但是我们的日志输出到哪去了?好像不知道。下面的内容会涉及到这些。
linux通过守护进程rsyslogd
或syslogd
处理我们的日志消息(比如将消息发送到其他主机等)。rsyslogd
是syslogd
的升级版。目前很多Linux发行版已经用rsyslogd
代替了syslogd
。但二者的在配置上大同小异。下面按照rsyslogd
的配置介绍。配置涉及到的两个文件为
/etc/rsyslog.conf
:它里面指定了调用/etc/rsyslog.d/
目录下的所有配置文件。一般不需要我们修改。我们一般在/etc/rsyslog.d/
添加我们自己的配置文件,或者修改50-default.conf
文件。/etc/rsyslog.d/50-default.conf
:此配置文件用于修改我们日志输出的路径及文件。关于文件配置的详细语法使用man 5 rsyslog.conf
查看。下面只简单介绍配置为输出到具体文件:
# 此处用来设置输出到具体文件中,
# 语法格式为: facility.prioritiy filePathName
# 注意:filePathName必须存在,权限必须满足。
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
#daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
#lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
上面配置的语法格式为facility.prioritiy filePathName
.其中facility,prioritiy的具体值请参看上面讲解。配置的文件路径名必须存在,且权限必须满足。
修改完配置后需要重新启动守护进程。涉及到如下命令:
sudo service rsyslog start
sudo service rsyslog restart
sudo service rsyslog stop
查看syslog日志相关的命令和文件
- 内核日志的查看:
dmesg
命令:日志会写到kernel ring buffer
(环型缓冲区)中,dmesg是从环缓冲区中读取内核日志信息。/proc/kmsg
:通过读取/proc/kmsg
也可以得到环型缓冲区的日志,但是对其读操作后,环型缓冲区中被读取的数据将被清空。如果启用了rsyslogd
服务,则不能读取/proc/kmsg
文件(文件为空),同一时间只能用一种方法来获取日志文件。(网上找的,笔者没有找到这个文件).
- 通过配置好的日志文件查看。如
cat /var/log/user.log
.