封裝自己的日誌函式

2021-06-27 07:05:17 字數 2878 閱讀 6426

用c語言

的時候,您是否還在使用printf函式

來輸出日誌

呢?您是否考慮過將printf函式列印的內容存到檔案中去呢?您是否想擁有乙個可選擇的既支援輸出到螢幕又支援儲存到檔案中的日誌函式呢?很高興的告訴您,如果您願意的話,歡迎使用本人編寫的乙個一套日誌函式,該套函式由五部分組成,分別是巨集變數

buf_size、結構體log_st、log_init函式、log_debug函式和log_checksize函式。其中巨集變數buf_size用來限制每次輸出的日誌的最大長度;結構體用來儲存使用者需求,包括檔案路徑、檔案描述符號、單個檔案最大大小、輸出方式標誌、檔案命名標誌等;log_init函式用來完成使用者需求錄入、檔案建立等功能,在mian函式的開始呼叫一次即可;log_debug函式的功能跟printf很類似,是在printf基礎上進行的擴充,實現將日誌輸出到螢幕或者寫入到檔案,在需要列印日誌的地方呼叫該函式;log_checksize函式用來檢測日誌檔案大小是否超過最大大小限制,它需要您定時或者定點呼叫它,如果一直不呼叫,則日誌檔案將不受指定的最大大小限制。

一、定義巨集變數buf_size

view plain

copy to clipboard

print?

#define buf_size 1024

二、定義log_st結構體

typedef struct _log_st log_st;  

struct _log_st

;

三、定義log_init函式

引數說明:path——您要儲存的檔案路徑;size——單個檔案的最大大小,如果超過該大小則新建新的檔案用來儲存;level——日誌輸出方式,建議在上層限制其值的範圍為0到3,0表示日誌既不輸出到螢幕也不建立檔案和儲存到檔案,1表示日誌儲存到檔案但不輸出到螢幕,2表示日誌既輸出到螢幕也儲存到檔案,3表示日誌只輸出到檔案而不建立檔案和存入檔案;num——日誌檔案命名方式,非0表示以(int)time(null)作為檔名來儲存檔案,檔案數量隨著日誌量的遞增而遞增;0表示以「.new」和「.bak」為檔名來儲存檔案,檔案數量不超過兩個,隨著日誌量的遞增,舊的日誌檔案將被新的覆蓋,更直觀的說就是說.new」和「.bak」檔案只儲存最近的日誌。

log_st *log_init(char *path, int size, int level, int num)  

; if (null == path || 0 == level) return null;

log_st *log = (log_st *)malloc(sizeof(log_st));

memset(log, 0, sizeof(log_st));

if (level != 3)

} strncpy(log->path, path, 128);

log->size = (size > 0 ? size:0);

log->level = (level > 0 ? level:0);

return log;

}

四、定義log_debug函式

void log_debug(log_st *log, const char *msg, ...)  

; int nmessagelen = 0;

int sz;

if(null == log || 0 == log->level) return;

now = time(null);

pos = ctime(&now);

sz = strlen(pos);

pos[sz-1]=']';

snprintf(message, buf_size, "[%s ", pos);

for (pos = message; *pos; pos++);

sz = pos - message;

va_start(ap, msg);

nmessagelen = vsnprintf(pos, buf_size - sz, msg, ap);

va_end(ap);

if (nmessagelen <= 0) return;

if (3 == log->level)

if (2 == log->level)

printf("%s\n", message);

write(log->fd, message, strlen(message));

write(log->fd, &_n, 1);

fsync(log->fd);

}

五、定義log_checksize函式

void log_checksize(log_st *log)  

; char bak_path[128] = ;

if(null == log || 3 == log->level || '\0' == log->path[0]) return;

memset(&stat_buf, 0, sizeof(struct stat));

fstat(log->fd, &stat_buf);

if(stat_buf.st_size > log->size)

//create a new file

} }

go開發屬於自己的日誌庫 日誌庫易用性封裝

檔案日誌和console日誌也完成了,我們試試在其他其他使用一下。在我們之前的server中,main.go輸入一下 package main import hm log var log hm log.log func initlog logpath,logname string func run ...

go開發屬於自己的日誌庫 日誌庫易用性封裝

檔案日誌和console日誌也完成了,我們試試在其他其他使用一下。在我們之前的server中,main.go輸入一下 package main import hm log var log hm log.log func initlog logpath,logname string func run ...

php 自己封裝的一些函式

手機歸屬地函式 function get mobile area phone else else return content 將陣列轉成物件 function array2object array else return obj 將物件轉化成陣列 function object2array obj...