简易日志库实现(C语言)

此日志库具有以下功能:

  • 具有多个日志级别
  • 能输出到标准输出或文件
  • 输出时带有时间信息(精确到秒)
  • 能每天生成一个新的文件

//log.h

//
//log.h 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/timeb.h>

/*Change the row control log output level (that is, change LDG_LEVEL_DEBUG)*/
#define LOG_LEVEL   LOG_LEVEL_ALL
#define LOG_NOOP    (void) 0

//Define levels
#define LOG_LEVEL_ALL       1   /*All*/
#define LOG_LEVEL_TRACE     2   /*Trace*/
#define LOG_LEVEL_DEBUG     3   /*Debug*/
#define LOG_LEVEL_INFO      4   /*INformation*/
#define LOG_LEVEL_WARN      5   /*Warning*/
#define LOG_LEVEL_ERROR     6   /*Error*/
#define LOG_LEVEL_FATAL     7   /*Fatal*/
#define LOG_LEVEL_SILENT    8   /*Silent*/ 
#define TITLE_ALL           " A:"
#define TITLE_TRACE         " T:"
#define TITLE_DEBUG         " D:"
#define TITLE_INFO          " I:"
#define TITLE_WARN          " W:"
#define TITLE_ERROR         " E:"
#define TITLE_FATAL         " F:"

//Output prototypes at all levels
#define LOGA(format,...)    LOG_ALL(format,##__VA_ARGS__)
#define LOGT(format,...)    LOG_TRACE(format,##__VA_ARGS__)
#define LOGD(format,...)    LOG_DEBUG(format,##__VA_ARGS__)
#define LOGI(format,...)    LOG_INFO(format,##__VA_ARGS__)
#define LOGW(format,...)    LOG_WARN(format,##__VA_ARGS__)
#define LOGE(format,...)    LOG_ERROR(format,##__VA_ARGS__)
#define LOGF(format,...)    LOG_FATAL(format,##__VA_ARGS__)

//Define variables
static FILE *fp_log;
static time_t timep;
static struct tm *p, *now;
static struct timeb tb;
static char fn[20];
static double size;

//Gets the file size in KB 
double LOG_SIZE(char* filename)
{
	FILE *fp = fopen(filename, "r");
	if (!fp) return -1;
	fseek(fp, 0L, SEEK_END);
	double size = ftell(fp);
	fclose(fp);
	return size;
}

//Control file size and output file size
void PRINT_LOGSIZE()
{
	size = LOG_SIZE(fn) / 1024;
	if (size >= 100) fp_log = fopen(fn, "w");
	else fp_log = fopen(fn, "r");
	printf(">> The current file size is:%.3fKB\n\n", size);
	fclose(fp_log);
}

//Log file creation and output 
#define  LOG_PRINT(level,fmt,...)    \
ftime(&tb);\
now = localtime(&tb.time);\
sprintf(fn, "%04d-%02d-%02d.txt", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);  \
if(level==TITLE_FATAL){\
printf(">> Now date: %d-%d-%d\n\n", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday);\
PRINT_LOGSIZE();}\
fp_log=fopen(fn,"a");   \
time(&timep);   \
p =localtime(&timep);           \
fprintf(fp_log,"%d-%d-%d %d:%d:%d In %s Line:%4u " level fmt "\n",1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec,__FILE__,__LINE__,##__VA_ARGS__);   \
fclose(fp_log); \
fp_log=NULL

//All
#if LOG_LEVEL_ALL >= LOG_LEVEL
#define LOG_ALL(fmt,...) LOG_PRINT(TITLE_ALL,fmt,##__VA_ARGS__)
#else
#define LOG_ALL(...)   LOG_NOOP
#endif

//Trace
#if LOG_LEVEL_TRACE >= LOG_LEVEL
#define LOG_TRACE(fmt,...) LOG_PRINT(TITLE_TRACE,fmt,##__VA_ARGS__)
#else
#define LOG_TRACE(...) LOG_NOOP
#endif

//Debug
#if LOG_LEVEL_DEBUG >= LOG_LEVEL
#define  LOG_DEBUG(fmt,...)  LOG_PRINT(TITLE_DEBUG,fmt,##__VA_ARGS__)
#else
#define LOG_DEBUG(...) LOG_NOOP
#endif

//Information 
#if LOG_LEVEL_INFO>= LOG_LEVEL
#define  LOG_INFO(fmt,...)   LOG_PRINT(TITLE_INFO,fmt,##__VA_ARGS__)
#else
#define LOG_INFO(...)  LOG_NOOP
#endif

//Warning
#if LOG_LEVEL_WARN >= LOG_LEVEL
#define  LOG_WARN(fmt,...)   LOG_PRINT(TITLE_WARN,fmt,##__VA_ARGS__)
#else
#define LOG_WARN(...)  LOG_NOOP
#endif

//Error
#if LOG_LEVEL_ERROR >= LOG_LEVEL
#define  LOG_ERROR(fmt,...)  LOG_PRINT(TITLE_ERROR,fmt,##__VA_ARGS__)
#else 
#define LOG_ERROR(...) LOG_NOOP
#endif

//Fatal 
#if LOG_LEVEL_FATAL >= LOG_LEVEL
#define  LOG_FATAL(fmt,...)  LOG_PRINT(TITLE_FATAL,fmt,##__VA_ARGS__)
#else
#define LOG_FATAL(...) LOG_NOOP
#endif

//main.c

//
//main.c

#include <stdio.h>
#include "log.h"

int main()
{
	LOGA("all");
	LOGT("trace");
	LOGD("debug");
	LOGI("infomation");
	LOGW("warning");
	LOGE("error");
	LOGF("fatal,program ended with exit code:1");
	printf(">> Press any key to continue!");
	getch();
}

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值