本帖最后由 古月不傲 于 2020-12-31 15:33 编辑
[C++] 纯文本查看 复制代码 #ifndef __WIND_LOG_H__
#define __WIND_LOG_H__
#include <iostream>
#include <cstdarg>
#include <cstring>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
// 日志相关
namespace wind_log
{
#define wind_cpymem(dst, src, n) (((char *) memcpy(dst, src, n)) + (n))
#define LOG_MAX_ERR_SIZE 1024
class CLog
{
public:
CLog() = default;
CLog(const CLog &) = delete;
CLog &operator =(const CLog &) = delete;
public:
~CLog()
{
}
static CLog &get_instance()
{
static CLog obj;
return obj;
}
inline void open_fd()
{
this->m_fdLog = open("log.txt", O_CREAT | O_WRONLY | O_APPEND, 0644);
}
inline void close_fd()
{
close(this->m_fdLog);
this->m_fdLog = -1;
}
void write_log(const char *fmt, ...)
{
if (fmt == nullptr)
return;
char errBuf[LOG_MAX_ERR_SIZE]{};
char strTime[128]{};
char argsBuf[1024]{};
char * pTemp;
struct timeval tv; // 时间
struct tm stTime; // 时间格式
time_t seconds;
va_list args;
// 获取经过的时间
gettimeofday(&tv, nullptr);
seconds = tv.tv_sec;
// 把经过的时间转化为本地时间
localtime_r(&seconds, &stTime);
stTime.tm_mon++;
stTime.tm_year += 1900;
// 格式化时间
sprintf(strTime,
"[%4d/%02d/%02d %02d:%02d:%02d] ",
stTime.tm_year, stTime.tm_mon,
stTime.tm_mday, stTime.tm_hour,
stTime.tm_min, stTime.tm_sec);
va_start(args, fmt);
pTemp = wind_cpymem(errBuf, strTime, strlen(strTime));
// va_list格式化函数
vsprintf(argsBuf, fmt, args);
pTemp = wind_cpymem(pTemp, argsBuf, strlen(argsBuf));
va_end(args);
// 如果没有写 \n的情况
if (*--pTemp != '\n')
// 这里不可以pTemp++ 要先++
wind_cpymem(++pTemp, "\n", 1);
// 由于上面判断了,所以要跳过 \n
pTemp++;
write(this->m_fdLog, errBuf, pTemp - errBuf);
}
private:
int m_fdLog = -1;
};
}
#endif
|