Linux的多任务编程(6)

该记录服务器和线程池没有直接的关系,如果有需要,可以很方便的该记录服务器移植到自己的项目中.

lprintf函数的功能是打印记录,log指针指向了一个通过log_open函数打开的记录文件,所有的记录信息都将保存在这个文件中.通过level参数指定记录内容的分类,在log.h中定义了6种分类,分别是:DEBUG,INFO,WARN,ERROR和FATAL,便于对大量的记录信息进行分类.

/* -------------------------------------------------------------------------
 * log.c – 记录函数实现
  * -------------------------------------------------------------------------
 */
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "log.h"
int lprintf( log_t *log, unsigned int level, char *fmt, ... )
{
    int fd;
    int rc;
    va_list ap;
    time_t now;
    char date[50];
    static char line[LOGLINE_MAX];
    static char threadnum[10];
    int cnt;
    static char *levels[6] = { "[(bad)] ", "[debug] ", "[info ] ", "[warn ] ",  "[error] ", "[fatal] " };
    if(!log) return -1;
    if( !(log->flags&LOG_DEBUG) && level == DEBUG ) return 0;
    fd=log->fd;
    /*日期*/
    if( !(log->flags&LOG_NODATE) )
    {
        now=time(NULL);
        strcpy(date,ctime(&now));
        date[strlen(date)-6]=' ';
        date[strlen(date)-5]='\0';
    }
    /*线程号*/
    if( !(log->flags&LOG_NOTID) )
    {
        sprintf(threadnum, "(TID:%lu) ", pthread_self());
    }
    cnt = snprintf(line, sizeof(line), "%s%s%s",
                  log->flags&LOG_NODATE ? "" : date,
                  log->flags&LOG_NOLVL  ? "" :
                  (level > FATAL ? levels[0] : levels[level]),
                  log->flags&LOG_NOTID  ? "" : threadnum);
    va_start(ap, fmt);
    vsnprintf(line+cnt, sizeof(line)-cnt, fmt, ap);    /*如果输入的日志过长会自动截取*/
    va_end(ap);
    line[sizeof(line)-1] = '\0';
    if( !(log->flags&LOG_NOLF) )
    {
        /*chomp(line);*/
        /*strcpy(line+strlen(line), "\n");*/
    }
    sem_wait(&log->sem);        /*用信号实现同步*/
    rc = write(fd, line, strlen(line));
    if (log->flags&LOG_STDERR)
  write(2, line, strlen(line));
    sem_post(&log->sem);
    if( !rc ) errno = 0;
    return rc;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/2171544ed330f750996edb69a5ca4e43.html