easylog -- Linux 下的簡單日志庫


 

之前使用 log4c 或者 log4cpp 的時候, 總需要配置一些文件和鏈接庫之類復雜的配置。 雖然越復雜越說明這個軟件支持的功能多、可選擇性強, 但是對於一個小的項目,或者要研究他人的代碼而加點兒日志的時候, 用這么復雜的配置就沒必要了。

 

所以我就想,要不寫個簡單一些的日志庫, 這樣再用到不需要那么復雜的日志控制工具的時候, 就不用每次都配置環境,也不用寫配置文件什么的了。 所以我就寫了個這個庫,因為過於簡單,代碼也不多, 也就沒必要做成lib庫,直接編譯到代碼里就可以了。

 

下面從一個簡單的小例子來認識一下這個庫。

 

這個庫包含兩個文件,一個是 .c 文件,一個是 .h 文件, 在使用的時候直接和你的項目代碼編譯到一起就可以了。

 

假設項目的代碼結構如下:

ls easylog.c easylog.h main.c

項目的主要代碼在 main.c 文件里面:

cat main.c 
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog("hello 我的");

    return 0;
}

編譯:

gcc -o main main.c easylog.c

運行:

$ ./main 
$ ls easylog.c easylog.h main main.c main.log 
$ cat main.log 
hello 我的

上面的例子是最簡配置,也就是不增加任何的多余信息, 在 easylog() 函數里面寫什么,就輸出什么。 還要就是,在什么都不設置的情況下,會自動創建和執行的文件一樣的前綴的log文件。 獲得這個文件名的方式是通過系統文件 "/proc/self/exe" 獲取的。

 

要是我想換個其它的日志文件名字呢,那就是 那就需要復雜一些的操作需要在代碼里面增加一行代碼, 使用 easylog_file() 來制定日志文件的名字。 例如我們要把日志放到文件test.log中, 那就可以這么寫:

easylog_file ( "test.log" );

修改項目文件,編譯執行,查看日志文件:

$ cat main.c 
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog_file("test.log");
    easylog("hello 我的");

    return 0;
}

$ gcc -o main main.c easylog.c 
$ ./main 
$ ls 
easylog.c  easylog.h  main  main.c  main.log  test.log
$ cat test.log 
hello 我的

可以看到,當前目錄下多了一個 test.log 文件,查看其中的內容,可以看到就是我們輸出的日志。

 

可是我要是想獲取其它的信息呢,比如我想獲取時間信息。 那就得再加一行,easylog_flag_add(EASYLOG_DATE | EASYLOG_TIME) 這句代碼的意思是,在日志中增加兩個屬性, EASYLOG_DATE 就是日期,EASYLOG_TIME 就是時間。

 

下面我們修改一下我們的項目文件 main.c,增加一行時間日期的設置代碼。

$ cat main.c 
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog_file("test.log");
    easylog_flag_add(EASYLOG_DATE | EASYLOG_TIME);
    easylog("hello 我的");

    return 0;
}

編譯,運行,查看日志:

$ gcc -o main main.c easylog.c 
$ ./main 
$ cat test.log 
hello 我的
2017-06-10 04:07:23.847 -- hello 我的

既然是為了日志,那就需要更詳細的信息,比如我的這個日志是在哪個文件哪一行寫下的呢, 為了得到這些信息,我們可以再加上一些設置,比如 EASYLOG_FILE、 EASYLOG_LINE、EASYLOG_FUNC,這三個分別是在日志中記錄下這條日志語句所在的 文件、文件行以及所在的函數名。

修改項目文件,編譯,運行,查看日志:

$ cat main.c 
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog_file("test.log");//設置日志文件名
    easylog_flag_add(EASYLOG_DATE | //設置日志需要的屬性
            EASYLOG_TIME |
            EASYLOG_FILE |
            EASYLOG_LINE |
            EASYLOG_FUNC);
    easylog("hello 我的");

    return 0;
}

$ gcc -o main main.c  easylog.c 
$ ./main 
$ cat test.log 
hello 我的
2017-06-10 04:07:23.847 -- hello 我的
2017-06-10 04:20:38.438 main.c 11 main() -- hello 我的

從日志文件也可以看到,最后一行日志顯示了日志所在的文件,行數和函數名。 和它上面的兩行形成了鮮明的對比。

 如果我們在記錄到一半的時候,不想要某一個屬性了,怎么辦呢? 那就移除某一個屬性,比如現在要移除日期屬性,那就加這么一行: easylog_flag_rm(EASYLOG_DATE);

 修改項目文件,編譯,運行,查看日志:

$ cat main.c 
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog_file("test.log");
    easylog_flag_add(EASYLOG_DATE | 
            EASYLOG_TIME |
            EASYLOG_FILE |
            EASYLOG_LINE |
            EASYLOG_FUNC);
    easylog("hello 我的");
    easylog_flag_rm(EASYLOG_DATE);//移除項目屬性
    easylog("hello 你的");

    return 0;
}

$ gcc -o main main.c  easylog.c 
$ ./main 
$ cat test.log 
hello 我的
2017-06-10 04:37:28.094 -- hello 我的
2017-06-10 04:42:42.996 main.c 11 main() -- hello 我的
04:42:42.997 main.c 13 main() -- hello 你的

從最后的日志中可以看出,日志的最后一行沒有記錄日期信息。

 因為 easylog 的代碼本身很少,一共也就200多行, 所以可以被使用者很容易的修改和使用。

最后,easylog 的代碼放在了github上,地址在這里https://github.com/fengbohello/easylog ,歡迎同學們來使用 ^_^


 

同步發表:https://www.fengbohello.top/archives/easylog


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM