Chinaunix首页 | 论坛 | 博客
  • 博客访问: 617173
  • 博文数量: 204
  • 博客积分: 5172
  • 博客等级: 上校
  • 技术积分: 2092
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-08 21:48
个人简介

一个毫无毅力之人的自勉

文章分类

全部博文(204)

文章存档

2014年(1)

2013年(54)

2012年(50)

2011年(94)

2010年(3)

2009年(3)

分类: LINUX

2011-08-12 22:39:33

这里面的三个函数openlog, syslog, closelog是一套系统日志写入接口。另外那个vsyslog和syslog功能一样,只是参数格式不同。
    通常,syslog守护进程读取三种格式的记录消息。此守护进程在启动时读一个配置文件。一般来说,其文件名为/etc/syslog.conf,该文件 决定了不同种类的消息应送向何处。例如,紧急消息可被送向系统管理员(若已登录),并在控制台上显示,而警告消息则可记录到一个文件中。该机制提供了 syslog函数,其调用格式如下
#include
void openlog (char*ident,int option ,int facility);
void syslog(int priority,char*format,……)
void closelog();

    调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的, 它只是关闭被用于与syslog守护进程通信的描述符。调用openlog 使我们可以指定一个ident,以后, 此ident 将被加至每则记录消息中。ident 一般是程序的名称(例如 ,cron ,ine 等)


程序的用法示例代码如下:


#include
int main(int argc, char **argv)
{
    openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);
    syslog(LOG_DEBUG,
           "This is a syslog test message generated by program '%s'\n",
           argv[0]);
    closelog();
    return 0;
}
 
编译生成可执行程序后,运行一次程序将向/var/log/message文件添加一行信息如下:
        Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'
 
openlog及closelog函数说明
此函数原型如下:
void openlog(const char *ident, int option, int facility);
此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。
openlog 的第一个参数ident将是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。第二个参 数option是下列值取与运算的结果:LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID,各值意义请参考man openlog手册:
       LOG_CONS
              Write directly to system console if there is an error while sending to system logger.

       LOG_NDELAY
              Open the connection immediately (normally, the connection is opened when the first message is logged).

       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 SUSv3.) Print to stderr as well.

       LOG_PID
              Include PID with each message.
 
第三个参数指明记录日志的程序的类型。

syslog函数及参数
syslog函数用于把日志消息发给系统程序syslogd去记录,此函数原型是:
void syslog(int priority, const char *format, ...);
第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。

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

/***********************************************************************************/

关于syslog系统的使用,在写程序时倒是可以一劳永逸,先写下摘录备份了

 

在此文件中加入了主函数、测试通过

  1. #include <syslog.h>
  2. #include <stdarg.h>


  3. void debug (char *fmt, ...)
  4. {
  5.     char buff[100]={0};
  6.     va_list pvar;
  7. #if defined(__STDC__)
  8.         va_start(pvar, fmt);
  9. #else
  10.         char *fmt;
  11.         va_start(pvar);
  12.         fmt = va_arg(pvar, char *);
  13. #endif
  14.     vsprintf(buff,fmt,pvar);
  15.     va_end(pvar);

  16.     logit(LOG_DEBUG,buff);
  17. }
  18. void info (char *fmt, ...)
  19. {
  20.     char buff[100]={0};
  21.     va_list pvar;
  22. #if defined(__STDC__)
  23.         va_start(pvar, fmt);
  24. #else
  25.         char *fmt;
  26.         va_start(pvar);
  27.         fmt = va_arg(pvar, char *);
  28. #endif
  29.     vsprintf(buff,fmt,pvar);
  30.     va_end(pvar);

  31.     logit(LOG_INFO,buff);
  32. }
  33. void notice (char *fmt, ...)
  34. {
  35.     char buff[100]={0};
  36.     va_list pvar;
  37. #if defined(__STDC__)
  38.         va_start(pvar, fmt);
  39. #else
  40.         char *fmt;
  41.         va_start(pvar);
  42.         fmt = va_arg(pvar, char *);
  43. #endif
  44.     vsprintf(buff,fmt,pvar);
  45.     va_end(pvar);

  46.     logit(LOG_NOTICE,buff);
  47. }
  48. void warning (char *fmt, ...)
  49. {
  50.     char buff[100]={0};
  51.     va_list pvar;
  52. #if defined(__STDC__)
  53.         va_start(pvar, fmt);
  54. #else
  55.         char *fmt;
  56.         va_start(pvar);
  57.         fmt = va_arg(pvar, char *);
  58. #endif
  59.     vsprintf(buff,fmt,pvar);
  60.     va_end(pvar);

  61.     logit(LOG_WARNING,buff);
  62. }
  63. void error (char *fmt, ...)
  64. {
  65.     char buff[100]={0};
  66.     va_list pvar;
  67. #if defined(__STDC__)
  68.         va_start(pvar, fmt);
  69. #else
  70.         char *fmt;
  71.         va_start(pvar);
  72.         fmt = va_arg(pvar, char *);
  73. #endif
  74.     vsprintf(buff,fmt,pvar);
  75.     va_end(pvar);

  76.     logit(LOG_ERR,buff);
  77. }

  78. void fatal (char *fmt, ...)
  79. {
  80.     char buff[100]={0};
  81.     va_list pvar;
  82. #if defined(__STDC__)
  83.         va_start(pvar, fmt);
  84. #else
  85.         char *fmt;
  86.         va_start(pvar);
  87.         fmt = va_arg(pvar, char *);
  88. #endif
  89.     vsprintf(buff,fmt,pvar);
  90.     va_end(pvar);

  91.     logit(LOG_DEBUG,buff);
  92.     exit(-1);
  93. }

  94. void logit(int level,char* fmt)
  95. {
  96.     openlog("UNIT_CYK", LOG_CONS | LOG_PID, 0);
  97.     syslog(level,"%s", fmt);
  98.     closelog();
  99. }

  100. int main()
  101. {
  102.     int i=100,j=222;
  103.     //fatal("This is a test programm, num=%d",i);
  104.     error("This is a test programm, num=%d,num2=%d",i,j);
  105.     warning("This is a test programm, num=%d",i);
  106.     notice("programm, num=%d",i);
  107.     info("This is a test num=%d",i);
  108.     debug("This ist programm, num=%d",i);
  109.     return 0;
  110. }
阅读(904) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~