- 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