一、使用原因:
在實現高併發的伺服器日誌系統過程中,由於在工作執行緒中直接進行io操作,相比較於高速的cpu,io磁碟操作是很慢的,直接在某些工作執行緒(包括ui執行緒)寫檔案,程式執行速度太慢,尤其是當日誌資料比較多的時候,此時,我們可以使用乙個佇列,需要寫日誌時,將日誌加入佇列中,另外乙個專門的日誌執行緒來寫日誌。
二、**如下:
logger.h:
#ifndef __logger_h__view code#define __logger_h__ #include
#include
#include
#include
#include
#include
//struct file;
#define loginfo(...) logger::getinstance().addtoqueue("info", __file__, __line__, __function__, __va_args__)
#define logwarning(...) logger::getinstance().addtoqueue("warning", __file__, __line__, __function__, __va_args__)
#define logerror(...) logger::getinstance().addtoqueue("error", __file__, __line__, __function__, __va_args__)
class
logger
; std::shared_ptr
spthread_;
std::mutex mutex_;
std::condition_variable cv_;
//有新的日誌到來的標識
bool exit_;
std::list
string>queue_;
};#endif
//!__logger_h__
logger.cpp:
#include "view codestdafx.h
"#include
#include
"logger.h
"#include
#include
#include
#include
logger&logger::getinstance()
void logger::setfilename(const
char*filename)
bool
logger::start()
; sprintf(timestr,
"%04d%02d%02d%02d%02d%02d.imserver.log
", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
filename_ =timestr;
}fp_ = fopen(filename_.c_str(), "
wt+"
);
if (fp_ ==null)
return
false
; spthread_.reset(
new std::thread(std::bind(&logger::threadfunc, this
)));
return
true;}
void
logger::stop()
void logger::addtoqueue(const
char* pszlevel, const
char* pszfile, int lineno, const
char* pszfuncsig, char*pszfmt, ...)
; va_list varglist;
va_start(varglist, pszfmt);
vsnprintf(msg,
256, pszfmt, varglist);
va_end(varglist);
time_t now =time(null);
struct tm* tmstr = localtime(&now);
char content[512] = ;
/*sprintf(content, "[%04d-%02d-%02d %02d:%02d:%02d][%s][0x%04x][%d]\n",
tmstr->tm_year + 1900,
tmstr->tm_mon + 1,
tmstr->tm_mday,
tmstr->tm_hour,
tmstr->tm_min,
tmstr->tm_sec,
pszlevel,
std::this_thread::get_id(),
lineno
);*/sprintf_s(content, arraysize(content),
"[%04d-%02d-%02d %02d:%02d:%02d][%s][0x%04x][%s:%d %s]%s\r\n",
tmstr->tm_year + 1900
, tmstr->tm_mon + 1
, tmstr->tm_mday,
tmstr->tm_hour,
tmstr->tm_min,
tmstr->tm_sec,
pszlevel,
getcurrentthreadid(),
pszfile,
lineno,
pszfuncsig,
msg);
cv_.notify_one();
}void
logger::threadfunc()
//寫日誌
const std::string& str =queue_.front();
fwrite((
void*)str.c_str(), str.length(), 1
, fp_);
fflush(fp_);
queue_.pop_front();}}
Springboot ELK實現日誌系統簡單搭建
前面簡單介紹了elk三劍客中的其中兩個elasticsearch和kibana的簡單使用,如果對這兩個不了解,可以看下下面的 centos7安裝elasticsearch和kibana 搜尋引擎基礎 分詞和倒排索引簡述 elasticsearch基礎入門 現在來看看這最後乙個logstash 還是這...
Postgresql日誌系統的實現(五)
1.3.1 3 xlog 其他資訊 資源資料結構 在xlog internal.h中定義了乙個結構體,resource manager可以呼叫某種資源 rmgrdata代表的資源 的某個方法 redo,undo等 這裡的資源可以簡單的理解成pg中存在這些 在pg執行時,系統中就生成了這些可利用的資源...
Postgresql日誌系統的實現(七)
1.3.2 2主要函式分析 xloginsert 的執行步驟 功能 插入一條xlog記錄,記錄有特殊的rmid標識和附帶資訊位元組,記錄的主體包括資料塊和資料鏈。返回xlog指標 指向記錄尾的 可以用做已經存入日誌的資料頁的lsn,根據lsn,xlog在修改實際資料之前先寫日誌 也就是wal 執行步...