linux下C语言实现写日志功能
author:一佰互联 2019-04-23   click:396

先上程序,该程序经过测试能够很好的实现写日志要求

/*************************************************************************  > 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", 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);}

程序实现的日志格式为:

时间 + 空格 + 具体实现(自己的调试内容)

本段程序值得学习的地方:

  1. va_list 结构体的使用
  2. linux 的格式化输出字符串
  3. 文件操作过程中pthread_mutex锁的使用,以及他的优点
  4. linux DEBUG 的应用,方便调试

linux如何查看日志:

使用tail 命令可以实现日志的查询,以及其他功能,不了解的话,自行查资料解决。

对上面应用不明白的请自行查资料解决。