// log.h
#include <cinttypes>
void LocalLogWrite(const char* loglevel, const char* fmt, ...);
const char* GetTime();
#define R_FILENAME__ (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)
#define F_LOCAL_LOG(loglevel, fmt, args...) \
LocalLogWrite(loglevel, "%s:[TAG][%s()][%s:%d] " fmt, GetTime(), __FUNCTION__, \
R_FILENAME__, __LINE__, ##args)
#define LOGD(fmt, ...) F_LOCAL_LOG("DEBUG", fmt, ##__VA_ARGS__)
#define LOGI(fmt, ...) F_LOCAL_LOG("INFO", fmt, ##__VA_ARGS__)
#define LOGW(fmt, ...) F_LOCAL_LOG("WARN", fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...) F_LOCAL_LOG("ERROR", fmt, ##__VA_ARGS__)
#define LOGF(fmt, ...) F_LOCAL_LOG("FATAL", fmt, ##__VA_ARGS__)
// log.cpp
#include "log.h"
#include <stdarg.h>
#include <string>
#include <sys/timeb.h>
#include <time.h>
std::string ReplaceStr(const std::string& str, const std::string& src, const std::string& dst)
{
if (src.empty()) {
return str;
}
std::string::size_type pos = 0;
std::string strTmp = str;
while ((pos = strTmp.find(src, pos)) != std::string::npos) {
strTmp.replace(pos, src.length(), dst);
pos += dst.length();
}
return strTmp;
}
const char* GetTime()
{
struct tm* ptm;
struct timeb stTimeb;
static char szTime[19];
ftime(&stTimeb);
ptm = localtime(&stTimeb.time);
// sprintf(szTime, "%02d-%02d %02d:%02d:%02d.%03d", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min,
// ptm->tm_sec, stTimeb.millitm);
sprintf(szTime, "%02d:%02d:%02d.%03d", ptm->tm_hour, ptm->tm_min, ptm->tm_sec, stTimeb.millitm);
szTime[18] = 0;
return szTime;
}
void LocalLogWrite(const char* loglevel, const char* fmt, ...)
{
std::string strFormat = fmt;
strFormat = ReplaceStr(strFormat, "{public}", "");
char buff[2048] = "";
va_list ap;
va_start(ap, fmt);
vsprintf(buff, strFormat.c_str(), ap);
va_end(ap);
printf("[%s]%s\r\n", loglevel, buff);
}