您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎么在C/C++中格式化日志庫(kù),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
頭文件如下:
#ifndef _LOG_FORMAT_H_ #define _LOG_FORMAT_H_ // 日志等級(jí) enum LogLevel { _LOG_TRACE, _LOG_INFO, _LOG_WARN, _LOG_ERROR, _LOG_FATAL }; void LogFormat(const char *pszFileName, const int nLine, LogLevel Level, const char *Format, ...); /******************************************************/ /* 日志函數(shù)調(diào)用方法 _LOG(_LOG_FATAL, "%s", "sss"); */ /******************************************************/ #ifndef _LOG #define _LOG(Level, Format, ...) LogFormat(__FILE__, __LINE__, Level, Format, ##__VA_ARGS__) #endif #endif // _LOG_FORMAT_H_
源文件如下:
#include <string> #include <stdio.h> #include <stdarg.h> #include <stdint.h> #if defined __GNUC__ || defined LINUX #include <sys/time.h> #define MY_VA_LIST _G_va_list #else #include <windows.h> #define MY_VA_LIST va_list #endif #include "LogFormat.h" /* *最終生成的日志字符串最大長(zhǎng)度,要特別注意 *超過(guò)此長(zhǎng)度程序會(huì)崩潰,用戶可以自定義長(zhǎng)度 */ #define LOG_MAX 1024 /* *時(shí)間長(zhǎng)度,不需要修改 */ #define FORMAT_TIME_SIZE 24 /* *日志等級(jí)字符串,與頭文件中定義的枚舉必須一致 */ static std::string g_LogLevel[] = { "TRACE","INFO","WARN","ERROR","FATAL" }; /* *內(nèi)存申請(qǐng)函數(shù),用戶可以自定義 */ static char *NewBuf(const uint32_t unBufSize) { return new char[unBufSize]; } /* *內(nèi)存釋放函數(shù),必須與NewBuf對(duì)應(yīng) */ static void DeleteBuf(char ** pszBuf) { if (NULL != *pszBuf) { delete[] *pszBuf; *pszBuf = NULL; } *pszBuf = NULL; } /* *獲取當(dāng)前時(shí)間字符串函數(shù) *2018-08-08 08:08:08.888 */ static char* GetTime() { char *pszFormatTime = NewBuf(FORMAT_TIME_SIZE); #if defined __GNUC__ || defined LINUX struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); struct tm *current_time = localtime(&tv.tv_sec); sprintf(pszFormatTime, "%04d-%02d-%02d %02d:%02d:%02d.%03d", current_time->tm_year + 1900, current_time->tm_mon + 1, current_time->tm_mday, current_time->tm_hour, current_time->tm_min, current_time->tm_sec, tv.tv_usec / 1000); #else SYSTEMTIME sys_time; GetLocalTime(&sys_time); #if _MSC_VER sprintf_s(pszFormatTime, FORMAT_TIME_SIZE, "%04d-%02d-%02d %02d:%02d:%02d.%03d", sys_time.wYear, sys_time.wMonth, sys_time.wDay, sys_time.wHour, sys_time.wMinute, sys_time.wSecond, sys_time.wMilliseconds); #else sprintf(pszFormatTime, "%04d-%02d-%02d %02d:%02d:%02d.%03d", sys_time.wYear, sys_time.wMonth, sys_time.wDay, sys_time.wHour, sys_time.wMinute, sys_time.wSecond, sys_time.wMilliseconds); #endif #endif return pszFormatTime; } void LogFormat(const char *pszFileName, const int nLine, LogLevel Level, const char *Format, ...) { int ret = 0; char *pszDescribeInfo = NewBuf(LOG_MAX); MY_VA_LIST ap; va_start(ap, Format); #if defined __GNUC__ || defined LINUX ret = vsnprintf(pszDescribeInfo, LOG_MAX, Format, ap); #else #if _MSC_VER ret = _vsnprintf_s(pszDescribeInfo, LOG_MAX, _TRUNCATE, Format, ap); #else ret = _vsnprintf(pszDescribeInfo, LOG_MAX, Format, ap); #endif #endif va_end(ap); if ((LOG_MAX <= ret) || (0 > ret)) { DeleteBuf(&pszDescribeInfo); return; } // 組裝日志,[時(shí)間][等級(jí)][文件名(行數(shù))][自定義字符串] char *pszLog = NewBuf(LOG_MAX); char *pszTime = GetTime(); #if defined __GNUC__ || defined LINUX ret = sprintf(pszLog, "[%s][%s][%s(%d)][%s]", pszTime, g_LogLevel[Level].c_str(), pszFileName, nLine, pszDescribeInfo); #else #if _MSC_VER ret = sprintf_s(pszLog, LOG_MAX, "[%s][%s][%s(%d)][%s]", pszTime, g_LogLevel[Level].c_str(), pszFileName, nLine, pszDescribeInfo); #else ret = sprintf(pszLog, "[%s][%s][%s(%d)][%s]", pszTime, g_LogLevel[Level].c_str(), pszFileName, nLine, pszDescribeInfo); #endif #endif // 日志默認(rèn)輸出到控制臺(tái),用戶可以自行修改 printf("%s\n", pszLog); DeleteBuf(&pszDescribeInfo); DeleteBuf(&pszLog); DeleteBuf(&pszTime); }
上述就是小編為大家分享的怎么在C/C++中格式化日志庫(kù)了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。