C 跨平台基於log4cpp二次單例封裝

2021-09-29 05:51:20 字數 4192 閱讀 7920

專案因為切換日誌庫,選型log4cpp,為了使用方便,進行了二次封裝

log4cpp.h

#ifndef __log_4_cpp__

#define __log_4_cpp__

#include#include //strrchr()函式所需標頭檔案

#include #include #else

#include #include #include #include #include #endif

//日誌優先順序

enum priority ;

#define max_log_record_len 1024*4 //每條日誌大小

#define max_logsize 1024*1024*10 //日誌檔案大小,預設10m 1024*1024*10

#define logfile_size 30 //檔案日誌數量

//用單例模式封裝log4cpp

class ccvlog ;

#ifdef win32

#define filename(x) strrchr(x,'\\')?strrchr(x,'\\')+1:x

#else

#define filename(x) strrchr(x,'/')?strrchr(x,'/')+1:x

#endif

static ccvlog &cvlog = ccvlog::getinstance(); //例項化單例

#define log_e(format, ...) cvlog.error(format, ##__va_args__)

#define log_w(format, ...) cvlog.warn(format, ##__va_args__)

#define log_i(format, ...) cvlog.info(format, ##__va_args__)

#define log_d(format, ...) cvlog.debug(format, ##__va_args__)

//#define log_i(format, ...) cvlog.info(filename(__file__), __line__, format, ##__va_args__)

#endif // !__log_4_cpp__

log4cpp.cpp

#include "stdafx.h"

#include "log4cpp.h"

#includeusing namespace std;

#ifdef _win32

#define access _access

#define mkdir(a) _mkdir((a))

int creatdir(char *pdir)

pszdir = strdup(pdir);

ilen = strlen(pszdir);

// 建立中間目錄

for (i = 0; i < ilen; i++)

}pszdir[i] = '/'; //支援linux,將所有\換成/

} }iret = mkdir(pszdir);

free(pszdir);

printf("-----%d---\n", ilen);

return iret;

}#else

#define access access

#define mkdir(a) mkdir((a),0755)

//建立多級目錄

int creatdir(char* spathname)

; //system("mkdir -p path");

sprintf(szcmd, "mkdir -p %s", spathname);

system(szcmd);

return 0;

}#endif

// 靜態成員初始化

char ccvlog::m_szlogbuf[max_log_record_len] = ;

ccvlog* ccvlog::m_plog = null;

//獲取log指標

ccvlog& ccvlog::getinstance()

return *m_plog;

}//銷毀

ccvlog::~ccvlog()

//銷毀

void ccvlog::destory()

}//建構函式

ccvlog::ccvlog() : m_category_ref(log4cpp::category::getroot()), m_strlogfilename(std::string("log4cpp.log"))

void ccvlog::setlogonmonitor(const char* pszcfgfilename)

void ccvlog::setconfigurefile(const char* pszcfgfilename)

//建立日誌資料夾 [10/16/2019 none]

bool ccvlog::creatlogdir(int npos, std::string strfilename)

; memset(szpath, 0, 128);

std::string strpath = strfilename.substr(0, npos + 1);

sprintf(szpath, "%s", strpath.c_str());

#ifdef _win32

if (0 == creatdir(szpath))

#else

creatdir(szpath);

#endif

return true;

}// 設定日誌級別 [10/16/2019 none]

void ccvlog::setpriority(priority priority)

}// 設定日誌輸出檔名 [10/16/2019 none]

bool ccvlog::setlogfilename(const std::string& filename /*= "log4cpp.log"*/)

} else

} }

//自定義日誌的輸出格式 1

/*%c->category, %d->日期, %m->訊息,, %n->換行, %p->優先順序 %x-->ndc

*/ log4cpp::patternlayout *pattern_one = new log4cpp::patternlayout;

pattern_one->setconversionpattern("%d [%p]%c%x %m%n");

//自定義日誌的輸出格式 2

log4cpp::patternlayout *pattern_two = new log4cpp::patternlayout;

pattern_two->setconversionpattern("%d [%p]%c%x %m%n");

//獲取螢幕輸出

//獲取檔案日誌輸出

m_category_ref.setpriority(log4cpp::priority::debug); //設定優先順序 注意:取值越小,優先順序越

return true;

}void ccvlog::error(const char* pchformat, ...)

// 日誌列印 [10/16/2019 none]

void ccvlog::info(const char* pchformat, ...)

void ccvlog::debug(const char* pchformat, ...)

void ccvlog::warn(const char* pchformat, ...)

main.cpp

#include "stdafx.h"

#include "log4cpp.h"

#include using namespace std;

int main()

cvlog.destory();

system("pause");

return 0;

}

window或linux呼叫setlogfilename,分別設定自定義路徑日誌目錄即可!

如果想通重載入日誌配置檔案設定日誌屬性,自行發揮!

這個世界是被精心設計過的!

C 實現跨平台

要建立乙個c 跨平台的應用,亦難也易。難在什麼?所謂應用,自是實際應用,牽涉面很廣。一般來說,至少有如下幾個方面需要我們考慮 0.語言及基礎庫 1.作業系統相關的 2.網路 3.資料庫 4.介面 其它自然還有很多,如xml,加解密等等,這裡先討論前面列出的幾項。眾所周知,不同的作業系統即時是相同的函...

C 跨平台嗎?

理論上c 和.net 程式是跨平台的,c 作為一種程式語言,早在2003年就成為iso的標準之一。但是有很多實際問題。1.微軟官方並沒有提供除windows 包括windows mobile 以外的其他系統,如linux,蘋果,unix,等等的framework。而不像sun公司開發windows,...

C預處理跨平台

include 不同的平台下引入不同的標頭檔案 if win32 識別windows平台 include elif linux 識別linux平台 include endif intmain 要開發乙個c語言程式,讓它暫停 5 秒以後再輸出內容,並且要求跨平台,在 windows 和 linux 下...