- 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實例:
-
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 -
主程序:
#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; }
-
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