linux下C语言实现写日志功能

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

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

> 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 DEBUG

void plog(const char *format, ...);

void pinfo(const char *format, ...);

#define debug(fmt, args...) plog(fmt, ##args)

#else

#define debug(fmt, args...) do{}while(0)

#endif

static 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);

}

程序实现的日志格式为:

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

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

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

linux如何查看日志:

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

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

以上是 linux下C语言实现写日志功能 的全部内容, 来源链接: utcz.com/z/359298.html

回到顶部