设为首页 加入收藏

TOP

日志模块的C语言实现(三)
2013-07-22 17:55:06 来源: 作者: 【 】 浏览:438
Tags:日志 模块 语言 实现

 

  四,关于openlog调用

  在写系统日志时,不是必须要调用openlog,如果没有调用openlog,那么在第一次调用syslog时,会自动调用openlog,此函数原型如下:

  [cpp]

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

  这个函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里记录日志。

  ident:这个参数是一个标记,在写入日志时,每行都会在前面自动的加上这个标记,通常可以写成当前程序的名称或者是同一程序不同的端口调用。

  option:该参数可以取值LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID。都表示不同的意思,我们这里取LOG_PID表示每一行日志都包含当前程序的进程ID号。

  facility:表示往哪个日志里写,其实也是表示由哪个具体的系统日志类型来记录日志。

  五,写日志

  在调用log_new之后,此时log_st有两种可能:

  类型为系统日志类型,那么已经打开了系统日志。接下来只要直接调用syslog函数就OK了。

  日志类型不是系统日志,而是文件或者标准输出,此时log_st结构体的域FILE *file,已经指向了具体的文件,后面只要调用fwrite类函数就可以了。

  代码如下:

  [cpp]

  #define MAX_LOG_LINE (1024)

  void log_write(log_t log, int level, const char *msgfmt, ...)

  {

  va_list ap;

  char *pos, message[MAX_LOG_LINE+1];

  int sz, len;

  time_t t;

  if(log->type == log_SYSLOG) { //  写入系统日志

  va_start(ap, msgfmt);

  len = vsnprintf(message, MAX_LOG_LINE, msgfmt, ap);

  if (len > MAX_LOG_LINE)

  message[MAX_LOG_LINE] = '\0';

  else

  message[len] = '\0';

  syslog(level, "%s", message); // 下面会说明syslog调用。

  va_end(ap);

  return;

  }

  t = time(NULL);   // 时间戳

  pos = ctime(&t);

  sz = strlen(pos);

  pos[sz-1]=' ';

  len = snprintf(message, MAX_LOG_LINE, "%s[%s] ", pos, _log_level[level]);

  if (len > MAX_LOG_LINE)

  message[MAX_LOG_LINE] = '\0';

  else

  message[len] = '\0';

  for (pos = message; *pos != '\0'; pos++); /*empty statement */

  sz = pos - message;

  va_start(ap, msgfmt);

  vsnprintf(pos, MAX_LOG_LINE - sz, msgfmt, ap);

  va_end(ap);   // 根据传入参数,组织文本信息

  fprintf(log->file,"%s", message);  // 写入文件。

  fprintf(log->file, "\n");

  fflush(log->file);

  }

  六,syslog调用

  函数的声明如下:

  [cpp]

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

  priority:消息的紧急级别。

  message:第二个参数是消息及其格式,之后是格式对应的参数,如同C语言里面printf输出函数一样使用。

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

  [html]

  LOG_EMERG:紧急状况

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

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

  LOG_ERR:错误发生

  LOG_WARNING:警告发生

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

  LOG_INFO:信息状况

  LOG_DEBUG:调试消息

  七,释放

  这个操作就很简单了,

  [cpp]

  void log_free(log_t log) {

  if(log->type == log_SYSLOG)

  closelog();

  else if(log->type == log_FILE)

  fclose(log->file);

  free(log);

  }

  八,使用的例子

  这个使用也是很简单的,分成三部:创建,写入,释放

  [cpp]

  log_t log = log_new(log_SYSLOG, "Example", "local5"); // 创建日志模块变量。

  log_write(log, LOG_NOTICE, "应用程序正在启动中");

  log_free(log);

        

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇利用C语言找出直系亲属 下一篇C中结构体大小的计算

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: