首页 > 代码库 > GNU Linux syslog守护进程简介及syslog日志写入例子

GNU Linux syslog守护进程简介及syslog日志写入例子

rsyslog进程

syslog是记录系统中的日志记录的一个工具,可以支持本地的、也可以支持远程的日志的写入。

在LinuxMint环境中,基于upstart的机制的后台守护程序是放在/etc/init/目录下的,可使用下如下的命令进行查看具体的启动脚本:

ufo@ufo:/var/log$ less /etc/init/rsyslog.conf

查看当前rsyslogd是否已经启动:

ufo@ufo:/var/log$ initctl list | grep rsyslog
rsyslog start/running, process 634

  4、灵活运用syslog调用接口

  在实际的使用过程中,我们可以通过配置文件和查看相应的日志文件来使用syslog。然而,在许多应用场景下,我们往往需要通过程序产生输出信息并进 行记录,也就是说要把一些信息写成日志文件,下面将详细介绍如何通过syslog日志系统提供的API调用接口,来使用程序实现对syslog的使用。

  1.主要的函数

  在Linux中,提供了四个有关syslog日志系统的系统调用,供用户使用:

  openlog:打开日志设备,以供读取和写入,与文件系统调用的open类似;

  syslog:写入日志,与文件系统调用的write类似;

  closelog:关闭日志设备,与文件系统调用的close类似;

  vsyslog:它和syslog功能一样,负责写入日志,只是参数格式不同。

  (1)openlog函数

  该函数的声明如下:

  void openlog(const char *ident, int option, int facility);

  此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。

  openlog的第一个参数ident是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。第二个参数option一般是下列选项值取“与”运算(使用“|”表示,如“LOG_CONS | LOG_PID”)的结果:

  LOG_CONS:如果送到system logger时发生问题,直接写入系统终端;

  LOG_NDELAY:立即开启连接,通常连接是在第一次写入消息时才打开的;

  LOG_PERROR:将消息也同时送到stderr设备;

  LOG_PID:将进程PID含入所有消息中。

  第三个参数facility指明记录日志的程序的类型,它主要具有如下几类日志类型:

  LOG_AUTH :安全/授权消息

  LOG_AUTHPRIV:安全/授权消息

  LOG_CRON:时间守护进程(cron和at)专用

  LOG_DAEMON:其它系统守护进程

  LOG_KERN:核心消息

  LOG_LOCAL0到LOG_LOCAL7:系统保留

  LOG_LPR:printer子系统

  LOG_MAIL:mail子系统

  LOG_NEWS:USENET新闻子系统

  LOG_SYSLOG:syslogd进程内部所产生的消息

  LOG_USER(缺省):一般使用者缺省使用消息

  LOG_UUCP:UUCP子系统

  LOG_FTP:FTP子系统使用

  (2)syslog函数

  syslog函数的声明如下:

  void syslog(int priority, const char * message, ...);

  第一个参数是消息的紧急级别priority,第二个参数是消息及其格式,之后是格式对应的参数,如同C语言里面printf输出函数一样使用,具体的格式这里就不再详述,它不是本书介绍的重点。

  这里还需要详细介绍一下第一个参数priority,它是由severity level和facility组成的。Facility已经在上面介绍了,下面介绍一下severity level,也就是消息的重要级别,它主要包括:

  LOG_EMERG:紧急状况

  LOG_ALERT:高优先级问题,比如说数据库崩溃等,必须要立即采取反应行动

  LOG_CRIT:重要状况发生,比如硬件故障

  LOG_ERR:错误发生

  LOG_WARNING:警告发生

  LOG_NOTICE:一般状况,需要引起注意

  LOG_INFO:信息状况

  LOG_DEBUG:调试消息

  在实际使用中,如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。

  (3)closelog函数

  相对上述2个函数来说,该函数非常简单,其声明如下:

  void closelog( void );

  值得注意的是,虽然该函数的使用和调用情况非常简单,但是是必不可少的,因为在Linux系统中,打开的日志也是资源,如果只使用openlog函数 打开日志,而忘记使用closelog关闭日志的话,当打开的日志数量累积到一定程度,便会造成内存不足,从而引起系统问题。所以,提醒用户在使用中特别 注意。

测试的例子:

#include <stdio.h>
#include <syslog.h>

int main()
{
        int log_test;
        openlog("log_test",LOG_PID,LOG_USER);
        syslog(LOG_INFO,"PID information, pid=%d\n",getpid());
        syslog(LOG_DEBUG,"debug message");
        closelog();
}

可以查看/var/log/syslog文件中的最后是否出现了以上的打印信息,可使用less /var/log/syslog命令打开后,跳转到文件的尾部进行查看:

Dec 15 17:46:27 ufo log_test[7811]: PID information, pid=7811
Dec 15 17:46:27 ufo log_test[7811]: debug message


GNU Linux syslog守护进程简介及syslog日志写入例子