//log打印日誌,可以保存到文件中,當日志文件大於5M,自動備份到DebugLog2.log中,DebugLog1.log繼續存放最新的日誌,這樣就保證5M以上的最新日誌
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <time.h>
#include <sys/time.h>
//==================================================================
// debug with time and show type with stdout or file
// if DebugLog1.log > 5M ,copy to DebugLog2.log save
//===================================================================
#define MAXLOGSIZE 5000000
#define MAXLINSIZE 16000
char logfilename1[]="DebugLog1.log";
char logfilename2[]="DebugLog2.log";
#define DEBUG_FILE 1
time_t timep;
struct tm *tmp;
typedef enum G_LOG_LEVEL
{
LOG_LEVEL_DEBUG = 0,
LOG_LEVEL_INFO,
LOG_LEVEL_WARN,
LOG_LEVEL_ERROR,
LOG_LEVEL_FATAL,
LOG_LEVEL_NONE,
}d_log_level_t;
d_log_level_t g_LogLevel;
void d_common_log_set_level(d_log_level_t LogLevel);
#define D_LOG_DEBUG(...) \
{\
if(g_LogLevel <= LOG_LEVEL_DEBUG)\
{\
{ \
time(&timep); \
tmp=localtime(&timep); \
fprintf(stdout,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(stdout,"[DEBUG] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(stdout,__VA_ARGS__); \
fflush(stdout); \
}\
if (DEBUG_FILE == 1 ) \
{ \
FILE *fp = fopen(logfilename1,"a"); \
time(&timep); \
tmp=localtime(&timep); \
fprintf(fp,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(fp,"[DEBUG] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(fp,__VA_ARGS__); \
if (ftell(fp)>MAXLOGSIZE) {\
fclose(fp);\
rename(logfilename1,logfilename2);\
}\
else \
fclose(fp); \
}\
}\
}
#define D_LOG_INFO(...) \
{\
if(g_LogLevel <= LOG_LEVEL_INFO)\
{\
{ \
time(&timep); \
tmp=localtime(&timep); \
fprintf(stdout,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(stdout,"[INFO] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(stdout,__VA_ARGS__); \
fflush(stdout); \
}\
if (DEBUG_FILE == 1 ) \
{ \
FILE *fp = fopen(logfilename1,"a"); \
time(&timep); \
tmp=localtime(&timep); \
fprintf(fp,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(fp,"[INFO] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(fp,__VA_ARGS__); \
if (ftell(fp)>MAXLOGSIZE) {\
fclose(fp);\
rename(logfilename1,logfilename2);\
}\
else \
fclose(fp); \
}\
}\
}
#define D_LOG_WARN(...) \
{\
if(g_LogLevel <= LOG_LEVEL_WARN)\
{\
{ \
time(&timep); \
tmp=localtime(&timep); \
fprintf(stdout,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(stdout,"[WARN] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(stdout,__VA_ARGS__); \
fflush(stdout); \
}\
if (DEBUG_FILE == 1 ) \
{ \
FILE *fp = fopen(logfilename1,"a"); \
time(&timep); \
tmp=localtime(&timep); \
fprintf(fp,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(fp,"[WARN] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(fp,__VA_ARGS__); \
if (ftell(fp)>MAXLOGSIZE) {\
fclose(fp);\
rename(logfilename1,logfilename2);\
}\
else \
fclose(fp); \
}\
}\
}
#define D_LOG_ERROR(...) \
{\
if(g_LogLevel <= LOG_LEVEL_ERROR)\
{\
{ \
time(&timep); \
tmp=localtime(&timep); \
fprintf(stdout,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(stdout,"[ERROR] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(stdout,__VA_ARGS__); \
fflush(stdout); \
}\
if (DEBUG_FILE == 1 ) \
{ \
FILE *fp = fopen(logfilename1,"a"); \
time(&timep); \
tmp=localtime(&timep); \
fprintf(fp,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(fp,"[ERROR] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(fp,__VA_ARGS__); \
if (ftell(fp)>MAXLOGSIZE) {\
fclose(fp);\
rename(logfilename1,logfilename2);\
}\
else \
fclose(fp); \
}\
}\
}
#define D_LOG_FATAL(...) \
{\
if(g_LogLevel <= LOG_LEVEL_FATAL)\
{\
{ \
time(&timep); \
tmp=localtime(&timep); \
fprintf(stdout,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(stdout,"[NOTICE] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(stdout,__VA_ARGS__); \
fflush(stdout); \
}\
if (DEBUG_FILE == 1 ) \
{ \
FILE *fp = fopen(logfilename1,"a"); \
time(&timep); \
tmp=localtime(&timep); \
fprintf(fp,"[%4d-%02d-%02d %02d:%02d:%02d] ", \
(1900+tmp->tm_year), \
(1+tmp->tm_mon), \
tmp->tm_mday, \
tmp->tm_hour, \
tmp->tm_min, \
tmp->tm_sec); \
fprintf(fp,"[NOTICE] %s:%s:%d:\t", __FILE__, __FUNCTION__, __LINE__); \
fprintf(fp,__VA_ARGS__); \
if (ftell(fp)>MAXLOGSIZE) {\
fclose(fp);\
rename(logfilename1,logfilename2);\
}\
else \
fclose(fp); \
}\
}\
}
void d_common_log_set_level(d_log_level_t LogLevel)
{
g_LogLevel = LogLevel;
}
int main(int argc,char **argv)
{
d_common_log_set_level(LOG_LEVEL_DEBUG);
int i;
for (i=0;i<10000;i++) {
D_LOG_DEBUG("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);
sleep(1);
}
return 0;
}
文件日誌自動刪除備份
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
C語言版本socket server
C小天
2018-09-02 00:50:50
簡單的通用Makefile模板
C小天
2018-09-02 00:50:50
利用libqrencode將二維碼信息保存到bmp圖片中
C小天
2018-09-02 00:50:50
socket client 回調函數接口
C小天
2018-09-02 00:50:49