Skip to content

本地用printf输出log信息

另外的实现:见github链接

C++
// 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);
}