先上程序,该程序经过测试能够很好的实现写日志要求
/************************************************************************* > File Name: log.c > Author: ************************************************************************/#include <stdio.h>#include <sys/types.h> #include <unistd.h> #include <stdlib.h>#include <string.h>#include <errno.h>#include <stdarg.h>#include <time.h>#include <pthread.h>int safe_asprintf(char **strp, const char *fmt, ...);int safe_vasprintf(char **strp, const char *fmt, va_list ap);void plog(const char *format, ...) ;void pinfo(const char *format, ...) ;#define DEBUG#ifdef DEBUGvoid plog(const char *format, ...);void pinfo(const char *format, ...);#define debug(fmt, args...) plog(fmt, ##args) #else#define debug(fmt, args...) do{}while(0)#endifstatic pthread_mutex_t fileMutex = PTHREAD_MUTEX_INITIALIZER;int main(int argc, char *argv){ return 0;}/* * safe_asprintf(); */int safe_asprintf(char **strp, const char *fmt, ...) { va_list ap; int retval; va_start(ap, fmt); retval = safe_vasprintf(strp, fmt, ap); va_end(ap); return retval;}/* * safe_vasprintf(); */int safe_vasprintf(char **strp, const char *fmt, va_list ap) { int retval; retval = vasprintf(strp, fmt, ap); if (retval == -1) { printf("Failed to vasprintf: %s. Bailing out/n", strerror(errno)); return 1; } return retval;}/* * plog(); */void plog(const char *format, ...) { pthread_mutex_lock(&fileMutex); FILE *fp = NULL; va_list vlist; char *fmt = NULL; // Open debug info output file. if (!(fp = fopen("log.txt", "a+"))) { pthread_mutex_unlock(&fileMutex); return; } va_start(vlist, format); safe_vasprintf(&fmt, format, vlist); va_end(vlist); if (!fmt) { pthread_mutex_unlock(&fileMutex); return; } time_t timep; struct tm *ptm = NULL; time(&timep); ptm = localtime(&timep); fprintf(fp, "[%04d-%02d-%02d-%02d-%02d-%02d] %s", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, fmt); free(fmt); fsync(fileno(fp)); fclose(fp); pthread_mutex_unlock(&fileMutex);}/* * pinfo(); */void pinfo(const char *format, ...) { pthread_mutex_lock(&fileMutex); FILE *fp = NULL; va_list vlist; char *fmt = NULL; // Open debug info output file. if (!(fp = fopen("log.txt", "a+"))) { pthread_mutex_unlock(&fileMutex); return; } va_start(vlist, format); safe_vasprintf(&fmt, format, vlist); va_end(vlist); if (!fmt) { pthread_mutex_unlock(&fileMutex); return; } fprintf(fp, "%s", fmt); free(fmt); fsync(fileno(fp)); fclose(fp); pthread_mutex_unlock(&fileMutex);}
程序实现的日志格式为:
时间 + 空格 + 具体实现(自己的调试内容)
本段程序值得学习的地方:
va_list 结构体的使用 linux 的格式化输出字符串 文件操作过程中pthread_mutex锁的使用,以及他的优点 linux DEBUG 的应用,方便调试新闻热点
疑难解答