您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關怎么在C/C++中格式化日志庫,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
頭文件如下:
#ifndef _LOG_FORMAT_H_ #define _LOG_FORMAT_H_ // 日志等級 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, ...); /******************************************************/ /* 日志函數調用方法 _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" /* *最終生成的日志字符串最大長度,要特別注意 *超過此長度程序會崩潰,用戶可以自定義長度 */ #define LOG_MAX 1024 /* *時間長度,不需要修改 */ #define FORMAT_TIME_SIZE 24 /* *日志等級字符串,與頭文件中定義的枚舉必須一致 */ static std::string g_LogLevel[] = { "TRACE","INFO","WARN","ERROR","FATAL" }; /* *內存申請函數,用戶可以自定義 */ static char *NewBuf(const uint32_t unBufSize) { return new char[unBufSize]; } /* *內存釋放函數,必須與NewBuf對應 */ static void DeleteBuf(char ** pszBuf) { if (NULL != *pszBuf) { delete[] *pszBuf; *pszBuf = NULL; } *pszBuf = NULL; } /* *獲取當前時間字符串函數 *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; } // 組裝日志,[時間][等級][文件名(行數)][自定義字符串] 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 // 日志默認輸出到控制臺,用戶可以自行修改 printf("%s\n", pszLog); DeleteBuf(&pszDescribeInfo); DeleteBuf(&pszLog); DeleteBuf(&pszTime); }
上述就是小編為大家分享的怎么在C/C++中格式化日志庫了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。