zlog 純C日誌函數庫

  • zlog的下載與安裝
    附:動態庫鏈接時、執行時搜索路徑順序
  • zlog使用
  • zlog實例

下載:

http://hardysimpson.github.io/zlog/ 下載最新的zlog源碼包 zlog-1.2.12.tar.gz。

編譯與安裝:

$tar -zxvf zlog-1.2.12.tar.gz
#解壓
$cd zlog-1.2.12/
#進入目錄
$make
#編譯。在zlog-1.2.12/src/ 目錄下生成libzlog.a 靜態庫和libzlog.so動態庫。
$make install
#默認安裝路徑是/usr/local/ ; 或者make PREFIX=‘自己指定安裝路徑’ install。
#之後就可以將zlog-1.2.12/刪掉。
$vi /etc/ld.so.conf
/usr/local/lib
$ldconfig
#保證libzlog.so在系統的動態鏈接庫加載器可以找到的目錄下

默認情況下,編譯器只會使用/lib和/usr/lib這兩個目錄下的庫文件,通常通過源碼包進行安裝時,如果不指定–prefix,會將庫安裝在/usr/local/lib目錄下;當運行程序需要鏈接動態庫時,提示找不到相關的.so庫,會報錯。也就是說,/usr/local/lib目錄不在系統默認的庫搜索目錄中,需要將目錄加進去。
  1、首先打開/etc/ld.so.conf文件
  2、加入動態庫文件所在的目錄:執行vi /etc/ld.so.conf,在"include ld.so.conf.d/*.conf"下方增加"/usr/local/lib"。
  3、保存後,需要運行一下ldconfig,使所有的庫文件都被緩存到文件/etc/ld.so.cache中,如果沒做,可能會找不到剛安裝的庫。

動態庫鏈接時、執行時搜索路徑順序:

  • 編譯目標代碼時指定的動態庫搜索路徑;
  • 環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;
  • 配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
  • 默認的動態搜索路徑/lib;
  • 默認的動態庫搜索路徑/usr/lib

zlog使用:

  • log建議分級打印,嚴重問題error,一般問題warn,信息info,調試debug
  • a.c文件中加頭文件 #include “zlog.h”
  • 編譯:gcc a.c -lzlog

zlog實例:

  1. zlog配置文件:
    大部分的zlog的行爲都取決於配置文件,比如把日誌打到哪裏去,用什麼格式,怎麼轉檔,都由配置文件來決定。
    vim zlog.conf

    [formats]
    ms = "%d.%ms %m%n"
    us = "%d.%us %m%n"
    
    nu1 = "%m%n"
    nu2 = "%d(%m-%d %T) %-10V [%p:%F:%L] %m%n"
    nu3 = "%d(%m-%d %T) %-5c [%p:%F:%L] %m%n"
    
    [rules]
    my_cat.DEBUG    "./log/system/%d(%F).STAT"; ms  
    my_cat.DEBUG    >stdout; ms  
    my_cat2.INFO     >stdout; us
    my_cat3.WARN     >stdout; nu1
    my_cat4.ERROR    >stdout; nu2
    ERRLOG.*        >stdout; ms  
    

    #format: 格式。用來描述輸出日誌的格式,比如是否有帶有時間戳,是否包含文件位置信息等。
    #rule: 規則。決定一條代碼中的日誌是否輸出,輸出到哪裏,以什麼格式輸出。

    #%n: 換行符
    #%m: 用戶從zlog函數輸入的日誌信息
    #%c: 分類名
    #%V: 日誌級別
    #%p: 進程id
    #%F: 源代碼文件名
    #%L: 源代碼行數
    #%ms: 毫秒,3位數字字符串
    #%us: 微秒,6位數字字符串
    #%d(): 日誌的時間。 如果不跟小括號,默認是%d(%F %T) | %F: 年-月-日 (%Y-%m-%d) | %T: 小時:分鐘:秒 (%H:%M:%S)
    #%-5c: 左對齊,最小寬度5

  2. 主程序:

    #include "zlog.h"
    
    int main(int argc, char** argv)
    {
    zlog_category_t *c,*d,*e,*f;    //1.實際編碼時最好寫在全局結構體中
    
    if( zlog_init("zlog.conf") )       //2.
    {   
        printf("init failed\n");
        return -1;
    }   
    
    c = zlog_get_category("my_cat");  //3.
    if (!c)
    {   
        printf("get cat fail\n");
        zlog_fini();
        return -2;
    }   
    d = zlog_get_category("my_cat2");
    e = zlog_get_category("my_cat3");
    f = zlog_get_category("my_cat4");
    
    zlog_debug(c, "hello, zlog");         //4.
    zlog_debug(c, "test 等級");
    zlog_info(d, "test zlog_info");
    zlog_warn(e, "test zlog_warn");
    zlog_error(f, "test zlog_error");
    zlog_fini();
    return 0;  
    }
    
  3. Makefile文件:

    CC = gcc
    OBJS = test-zlog.o
    LIBS = zlog
    TARGET = result
    RM = rm -f
    
    $(TARGET):$(OBJS)
       $(CC) -o $(TARGET) $(OBJS) $(addprefix -l, $(LIBS))
    clean:
       -$(RM) $(TARGET) $(OBJS)
    

運行結果:

2020-04-13 06:40:36.312 hello, zlog
2020-04-13 06:40:36.312 test 等級
2020-04-13 06:40:36.312540 test zlog_info
test zlog_warn
04-13 06:40:36 ERROR      [7797:test-zlog.c:31] test zlog_error


我們剛纔用的方法是:
將鏈接庫的目錄添加到/etc/ld.so.conf文件中,然後使用ldconfig進行更新,進行動態鏈接庫的運行時動態綁定。

缺點:

  • 代碼遷移到其他服務器後,需要重新編譯安裝zlog動態庫並添加到/etc/ld.so.conf文件中。
  • 同時,要是涉及多個程序跑在一臺服務器上,還會有庫衝突的問題

還有一種方法(其實也是我們實際常用的方法):

  • 參考https://blog.csdn.net/qq_40443457/article/details/105473453

  • 實例:
    編譯與安裝:

    $tar -zxvf zlog-1.2.12.tar.gz
    #解壓
    $cd zlog-1.2.12/
    #進入目錄
    $make
    #編譯。在zlog-1.2.12/src/ 目錄下生成libzlog.a 靜態庫和libzlog.so動態庫。
    $make install
    #安裝。然後將/usr/local/下的所有與zlog相關的目錄lib/ include/複製到我們程序的目錄下,並且在Makefile中加上 -Wl,-rpath=./lib -L./lib -I./include

    其他不變,新增Makfile文件內容:-Wl,-rpath=./lib -L./lib -I./include

    CC = gcc
    OBJS = test-zlog.o
    CFLAGS = -Wl,-rpath=./lib -L./lib
    CFLAGS += -I./include
    LIBS = zlog
    TARGET = result
    RM = rm -f
    
    $(TARGET):$(OBJS)
        $(CC) -o $(TARGET) $(OBJS) $(CFLAGS) $(addprefix -l, $(LIBS))
    clean:
        -$(RM) $(TARGET) $(OBJS)
    
    #result: test-zlog.c
    #gcc -o result test-zlog.c -lzlog -Wl,-rpath=./lib -L./lib -I./include
    #clean:
    #rm -f test.o test
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章