此日志库具有以下功能:
- 具有多个日志级别
- 能输出到标准输出或文件
- 输出时带有时间信息(精确到秒)
- 能每天生成一个新的文件
//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();
}