日誌系統實現

2022-05-08 14:30:07 字數 3301 閱讀 8731

一、使用原因:

在實現高併發的伺服器日誌系統過程中,由於在工作執行緒中直接進行io操作,相比較於高速的cpu,io磁碟操作是很慢的,直接在某些工作執行緒(包括ui執行緒)寫檔案,程式執行速度太慢,尤其是當日誌資料比較多的時候,此時,我們可以使用乙個佇列,需要寫日誌時,將日誌加入佇列中,另外乙個專門的日誌執行緒來寫日誌。

二、**如下:

logger.h:

#ifndef __logger_h__  

#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__

view code

logger.cpp:

#include "

stdafx.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();}}

view code

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 執行步...