專案因為切換日誌庫,選型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 下...