使用兩個快取區存放日誌,每個快取區為乙個hash表,通過執行緒id計算對應的hash值,將日誌存入對應的位置。
乙個log執行緒讀取快取區,並將其寫入log檔案,每次將兩個快取區更換,防止鎖爭用的開銷,將緩衝區的日誌寫入檔案後再次對換緩衝區,迴圈往復。
logger.h
1#ifndef logger_h
2#define logger_h
34 #include5 #include6 #include7 #include8
9 #include10 #include11
12 #include13
14#define zlog_init_size 5
1516
#define logerr zlog::_zlog(zlog::zlogleval::error, __file__, __line__)
17#define loginfo zlog::_zlog(zlog::zlogleval::info, __file__, __line__)
18#define logwarn zlog::_zlog(zlog::zlogleval::warring, __file__, __line__)
19#define logstart(x) zlog::samplelogger::get()->start(x)
20#define logstop() zlog::samplelogger::get()->stop()
2122
namespace
zlog;
29extern
char *zloglevalmsg;
3031
32class
logger33;
5051
//logger單例類
52class
samplelogger;
5859 inline std::string gettime(void
);60
61//
log 操作類 過載<< 運算子 析構寫日誌
62class
_zlog63;
818283}
84#endif
logger.cpp
#include "logger.h
"namespace
zlog;
//todo: 構造
logger::logger(int size = zlog_init_size) : _size(size), now(0
)
//todo: 新增日誌
void logger::add(std::string &info)
catch (int e)
ss << std::endl;
*///
新增到buf
_buf[now]->at(pos) +=info;
}//todo: 計算hash值
intlogger::_hash()
//todo: 獲取時間
inline std::string gettime(void
)
time = localtime(&(tv.tv_sec));
char systime[40
]; strftime(systime,
40, "
%y-%m-%d %h:%m:%s.
", time);
ss << systime << (int64_t)(tv.tv_usec / 1000
);
return
ss.str();
}//todo: logger執行緒
void logger::logging(std::string
logname)
f.flush();
}f.close();
}//todo: 執行logging執行緒
void logger::start(std::string
logname)
//todo: 關閉logging執行緒
void
logger::stop()
//todo: 析構
logger::~logger()
//todo: logger單例類宣告
logger *samplelogger::_logger =nullptr;
std::mutex samplelogger::m;
logger *samplelogger::get
() }
return
_logger;
}//todo: 初始化乙個log
_zlog::_zlog(zlogleval leval, std::string file, int
line)
catch (int
e) _info =ss.str();
}//todo: zlog operator <<
_zlog &_zlog::operator
<< (std::string
info)
_zlog &_zlog::operator
<< (int
info)
_zlog &_zlog::operator
<< (short
info)
_zlog &_zlog::operator
<< (long
info)
_zlog &_zlog::operator
<< (long
long
info)
_zlog &_zlog::operator
<< (char *info)
_zlog &_zlog::operator
<< (float
info)
_zlog &_zlog::operator
<< (double
info)
_zlog &_zlog::operator
<< (unsigned int
info)
_zlog &_zlog::operator
<< (unsigned long
info)
_zlog &_zlog::operator
<< (unsigned long
long
info)
//todo: ~_zlog()
_zlog::~_zlog()
}
乙個Log的工具類
由於專案是屬於專項定製,在私有網路中執行,有一天突然說程式出問題了,現場沒有自己人,無法定位問題,一臉蒙蔽。因為專案可以把崩潰日誌儲存到檔案,於是想把log日誌儲存一下,以便方便定位。public class logutils 判斷log檔案大小,file myfile new file logpa...
乙個簡單的Log類
經常在執行程式時需要在某些地方記錄log,之前想用log4net,但又感覺要附帶乙個dll,想要只帶乙個exe檔案執行,乾脆自己寫個簡單的類了。需要滿足的條件 被多個執行緒呼叫 時間的準確性不重要,知道先後關係就行 不想阻塞執行緒,畢竟幹活才是主要目的,為了不太在意時間的log而阻塞等待有點不划算。...
VC 乙個簡單的Log類
在軟體開發中,為程式建立log日誌是很必要的,它可以記錄程式執行的狀態以及出錯資訊,方便維護和除錯。下面實現了乙個簡單的log類,使用非常簡單,僅供參考。cloghelper.h header file for log information pragma once class cloghelper...