Easylog一種簡單的適合C 大工程的日誌方式

2021-09-27 18:05:36 字數 3104 閱讀 3395

該**需要在編譯時支援c++11和多執行緒,共200多行**也可以根據自己需要進行修改比較容易.

先講一下**設計思想.

1.首先採用單例的模式建立乙個日誌工廠類logfactory. 這樣可以保證在不同的類中引用該日誌系統時保持唯一,不會被建立出多個例項導致不能實現日誌的執行緒互斥.

2.既然建立了工廠類,目的當然是批量生成日誌類.之所以要批量生成日誌類,也是為了實現多檔案日誌功能.根據設定的logid不同生成不同的日誌檔案,這樣,通過指定不同的logid,可以將日誌寫入不同的檔案中.當前還要設定要寫入日誌的資料夾位置.如過與已經建立的logid相同,也可以不指定日誌資料夾路徑.

3.重點說日誌類,考慮乙個比較大成熟的專案,為了除錯頻繁的頻繁的增加刪除log,並不是乙個很好的方式,因為一旦修改源**重新編譯可能要除錯復現的bug就不再復現了(這個這實際情況中還是比較棘手的),所有我們考慮的是預先埋入log,對log分等級,這樣根據實際需要是輸出一部分log,還是全部輸出進行最細化的除錯.這裡對log分了error, warn, info, debug, trace五個等級.通過setrecordlevel()設定等級,高於設定等級的log才會被輸出.而傳入的引數完全可以通過配置檔案設定,這樣能保證可執行檔案不動的情況下,輸出不同的日誌.

4.考慮我自己專案的實際情況是在嵌入式環境中,有時候並不能及時的檢視log.所有對日誌檔案的處理是根據日期進行建立的.在開始傳入的日誌資料夾下根據日期建立日誌檔案.以日期命名的方式的話,可以保證檔案不至於過大,也不會被覆蓋,以後檢視起來可以通過時間查詢比較方便.我想這也是乙個比較好的方式.

上面講了那個多,也只是為加深對日誌系統的理解.下面就直接講如何使用.使用起來還是比較簡單的.

在當前資料夾下建立舉例

首先建立日誌,設定日誌等級:

shared_ptr logger = logfactory::

instance()

->

geteasylog

("sample1"

,"./");

logger-

>

setrecordlevel

(info)

;

這樣日誌就建立完成了.如果想寫入同乙個日誌檔案直接把上面的**複製到其他位置就可以,只要指定的第乙個引數logid相同就會被寫入同乙個日誌檔案.如果想寫入另乙個檔案,指定不同的另乙個logid就可以了.如果想直接輸出在螢幕上,那在第一次指定logid的位置,後面的第二個引數日誌資料夾就不要指定了,空的化就會直接輸出在螢幕上.

設定等級的引數建議通過配置檔案進行設定,這樣對於較大的工程除錯起來非常方便.初始化就這麼簡單兩行就完成了.

接下來是如何寫日誌,由於一些原因,雖然**是c++寫的,但是寫日誌的方式還是保留了c的風格:

logger-

>

writelog

(error,

"this is a test error log: %s"

, str.

c_str()

);

只需要這一行**就搞定了.

上面說的有些簡單,我自己寫了乙個測試**進行了幾種方式的測試:

int

main()

將測試**編譯後執行效果:

有輸出到螢幕的log,有輸出到sample1下的log, 有輸出到sample2下的log.

$:~/desktop/sample/easylog$ .

/test

[2019-10-05 11:44:48]

[error] this is a test error log: b3

[2019-10-05 11:44:48]

[info] this is a test info log: b3

$:~/desktop/sample/easylog$ ls

easylog.

cpp easylog.h main.

cpp sample1 sample2 test

$:~/desktop/sample/easylog$ cd sample1

$:~/desktop/sample/easylog/sample1$ ls

20191005.log

$:~/desktop/sample/easylog/sample1$ cat 20191005.log

[2019-10-05 11:44:48]

[error] this is a test error log: a1

[2019-10-05 11:44:48]

[info] this is a test info log: a1

[2019-10-05 11:44:48]

[error] this is a test error log: a2

[2019-10-05 11:44:48]

[info] this is a test info log: a2

[2019-10-05 11:44:48]

[error] this is a test error log: a3

[2019-10-05 11:44:48]

[info] this is a test info log: a3

[2019-10-05 11:44:48]

[error] this is a test error log: b1

[2019-10-05 11:44:48]

[info] this is a test info log: b1

$:~/desktop/sample/easylog/sample1$ cd .

./sample2/

$:~/desktop/sample/easylog/sample2$ ls

20191005.log

$:~/desktop/sample/easylog/sample2$ cat 20191005.log

[2019-10-05 11:44:48]

[error] this is a test error log: b2

[2019-10-05 11:44:48]

[info] this is a test info log: b2

約瑟夫環的一種簡單解法

首先還是描述一下約瑟夫環問題吧 n個人圍成乙個圈,從第乙個人開始數數 從1開始數 每數到3 當然這個數字可以隨便定 數到3的那個人就退出,接著,他的下乙個人又從1開始數.迴圈不斷,剩下的k個人就是勝利者 當人,這個人數也可以隨便定 接下來的 是利用乙個陣列模擬環,對該陣列進行相應的操作,如果數到3,...

體積霧的一種簡單實現

場景裡面一開始加的是預設的opengl霧效,效果不太好,看起來立體感不強,然後打算加個體積霧效果,搜了一些體積霧的實現方式,發現略複雜,就想了種比較簡單的實現方式 1 在場景的垂直高度上,一般是z軸,建立若干個水平的平面,大小要比場景大,疊在一起之後看起來效果類似乙個立方體 我是從z的 5到20,建...

python呼叫c語言函式的一種簡單實現方法

這個方法是利用了python的乙個模組ctypes實現的。首先是c語言的test.c原始碼函式 include int test char a 100 然後,使用gcc命令將其打包成乙個共享庫,就可以提供給python直接使用了,命令如下 gcc test.c fpic shared o libte...