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
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章