之前使用 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中, 那就可以這么寫:
修改項目文件,編譯執行,查看日志文件:
$ 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 ,歡迎同學們來使用 ^_^