1. zlog简介

zlog的资料网上很多,这里不在详细说明;zlog是用c写的一个日志工具,非常小,而且高效,可以同时向控制台和文件中输出,日志接口与printf使用基本一样,所以使用起来很简单。

感觉唯一的缺点是配置稍微复杂点,不能动态修改输出级别;

2.使用介绍

2.1 zlog编译

zlog的很好编译,如果你是在x86平台上,就不用修改makefile,进入src目录下直接make就可以了;

如果是在交叉编译,移植到嵌入式设备上用,那么只需要修改src/makefile里的cc为交叉编译器的gcc,

还有一处ar修改为交叉编译器的ar:

然后make,一般都可以直接编译过,编译结束后,在src目录下生成两个库文件:

libzlog.so和libzlog.a

2.2 zlog配置文件

zlog使用时,需要先配置一下输出规则,需要写在一个文件里;下面简单介绍一下配置文件。

配置文件*.conf
配置文件具体内容如下:
[global]
#改变量可以不写,默认是true,如果使用设置为true时,Zlog就会严格检查所用格式和规则,否则,忽略所用格式和规则。
strict init = true
buffer min = 1024
buffer max = 2048
#转档指定锁文件,用于保证多进程下日志安全转档,使用默认的配置文件为锁文件。
#rotate lock file = zlog.lock
#日志访问权限,600 只允许当前用户访问
file perms = 600
[formats]
#使用默认日志输出格式 "%d %V [%p %F %L] %m%n" 输出日志格式为:%-5V按照日志级别按照左对齐
#2012-12-13 10:23:29 INFO [31668:test_hello.c:41] hello, zlog
simple = "%d.%-8.8us %-5V [%-8.8p.%-8.8t %F %L] %m%n"
#simple = "%d.%ms %m%n"
#simple2 = "%d.%us %m%n" [rules]
#优先级从低到高 debug info notice warn fatal debug大于等于debug的优先级都能给通过debug输出。
my_cat.* >stderr;
#当hello.txt文件大小大于10MB时,会将hello.txt->hello.txt.0 0代表不删除任何文件
my_cat.INFO "hello.txt",10kb * 3 ~ "hello.txt.#r";simple
#my_cat.INFO "hello.txt",1MB ~ "hello-%d(%Y%m%d).#2s.txt";simple
#my_cat.INFO "hello.txt",1MB;simple
#my_cat.INFO "hello.txt",1MB;simple

2.3 zlog使用

zlog使用时首先要初始化配置,然后获取到一个句柄(指针),由于这个句柄是全局的,这在c中很正常,但是用c++久了,都不喜欢全局变量了,所以这里我用c++的单实例思想,把zlog初始化这部分封装了一下,这样用起来也简单,只需要把这两个文件包含进去,安照自己的需要,修改一下里面日志的路径和cat即可:

源文件log_manager.cpp:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h> #include "log_manager.h" /*********************************************************/ /*常量****************************************************/
const char* ConfigText =
"[global]\n"
"strict init = true\n"
"buffer min = 1024\n"
"buffer max = 2048\n"
"#日志访问权限,600 只允许当前用户访问\n"
"file perms = 600\n"
"[formats]\n"
"simple = \"%d.%-8.8us %-5V [%-8.8p.%-8.8t %F %L] %m%n\"\n"
"simple1= \"%m%n\"\n"
"[rules]\n"
"db_cat.warn >stderr;simple1\n"
"db_cat.ERROR \"./logs/test.txt\",1M * 3 ~ \"./logs/test.txt.#r\";simple\n"; //优先级从低到高 debug info notice warn error fatal debug大于等于debug的优先级都能给通过debug输出。 /*********************************************************/
static zlog_category_t * logHandler_m = NULL;
static int DetectConfigFile(const char *File); /*****************************************************************************
函 数 名 : LogMgr.LogMgr
功能描述 : 日志模块初始化
输入参数 : 无
输出参数 : 无
返 回 值 : 修改历史 :
1.日 期 : 2012年12月19日 星期三
作 者 : fensjoy
修改内容 : 新生成函数 *****************************************************************************/
zlog_category_t * Init_zlog()
{
DetectConfigFile(LOG_CONFIG); zlog_init(LOG_CONFIG);
logHandler_m = zlog_get_category(LOG_CAT);
if (!logHandler_m)
{
printf("%s in Init_zlog, get cat fail! line = %d\n",PRO_NAME, __LINE__);
zlog_fini();
remove(LOG_CONFIG);
exit(-1);
}
return logHandler_m;
}; /*****************************************************************************
函 数 名 : DetectConfigFile
功能描述 : 检测日志模块的配置文件是否存在,不存在则创建
输入参数 : const char *File
输出参数 : 无
返 回 值 : static 修改历史 :
1.日 期 : 2012年12月20日 星期四
作 者 : fensjoy
修改内容 : 新生成函数 *****************************************************************************/
static int DetectConfigFile(const char *File)
{
FILE *fp = NULL;
int iRet = 0;
DIR *log_p = NULL;
char *cmd_buf = NULL; /*判断日志文件保存目录是否存在,不存在则创建*/
log_p = opendir(LOG_PATH);
if ( log_p == NULL )
{
printf("%s in DetectConfigFile, the log dir is not exist, now creat: %s!\n", PRO_NAME,LOG_PATH); cmd_buf = new char[64]; printf("%s in DetectConfigFile, the log dir is not exist, now creat!\n", PRO_NAME);
snprintf(cmd_buf, 64, "mkdir -p %s &", LOG_PATH);
iRet = system(cmd_buf); delete [] cmd_buf; }
else
{
closedir(log_p);
} if ( access(File, F_OK) != 0 )
{
printf("%s log config file not exist,now creat!\n", PRO_NAME);
fp = fopen(File, "w+");
if(fp == NULL)
{
perror("#[db]: in DetectConfigFile, fopen config file error!");
return -1;
}
iRet = fwrite(ConfigText, 1, strlen(ConfigText), fp);
if ( iRet < 0 )
{
perror("#[para]: in DetectConfigFile, fwrite error!");
fclose(fp);
return -1;
} fclose(fp);
} return 0;
} /*****************************************************************************
函 数 名 : getZlogHandler
功能描述 : 获取zlog日志句柄
输入参数 : 无
输出参数 : 无
返 回 值 : zlog_category_t 修改历史 :
1.日 期 : 2014年1月24日 星期五
作 者 : fensjoy
修改内容 : 新生成函数 *****************************************************************************/
zlog_category_t * getZlogHandler()
{
if ( NULL == logHandler_m )
{
logHandler_m = Init_zlog();
} return logHandler_m;
}

头文件log_manager.h

/******************************************************************************

                  版权所有 (C), 2001-2014, 

 ******************************************************************************
文 件 名 : log_manger.h
版 本 号 : 初稿
作 者 : fensjoy
生成日期 : 2013年6月5日 星期三
最近修改 :
功能描述 : log_manger.cpp 的头文件
函数列表 :
修改历史 :
1.日 期 : 2013年6月5日 星期三
作 者 : fensjoy
修改内容 : 创建文件 ******************************************************************************/
#ifndef __LOG_MANGER_H__
#define ___LOG_MANGER_H__
#include <iostream>
#include "zlog.h" #define PRO_NAME "#[db]: "
#define LOG_CONFIG "./test_log.conf"
#define LOG_PATH "./" #define LOG_CAT "test_cat" //注意这里要与配置文件中保持一致,否则无法输出 //extern zlog_category_t * logHandler_m; zlog_category_t * Init_zlog();
zlog_category_t * getZlogHandler(); #endif /* __LOG_MANGER_H__ */

测试main函数:

#include <iostream>
#include "log_manager.h" using namespace std; int main(int argc, char **argv)
{ zlog_category_t *pLog = Init_zlog(); zlog_notice(pLog, "hello zlog!"); zlog_error(pLog, "this msg both to console and log file!"); zlog_debug(pLog, "this msg is debug level, just to console!"); return 0;
}

是不是很简单~;

make 编译后直接运行:

运行:log文件内容:

用起来确实很简单,我感觉zlog比较适合用于程序的性能分析,即程序长时间运行时,记录程序运行状态,然后分析程序性能,以便于后期优化;另外zlog有个地方需要注意下,就是在日志文件达到设置的大小时,切换日志文件,如果这时程序输出日志过多间隔也比较短(100毫秒)左右时,程序会挂掉,这时zlog的一个bug。一般程序输出日志没那么多时,不会出现

源代码已上传CSDN:

https://download.csdn.net/download/wuquan_1230/10931319

由于上传时下载积分最低选项是1,所以无法设置为0,如果没有积分可以微信公众号给我发消息,

我发你邮箱

微信订阅号:

高效c/c++日志工具zlog使用介绍的更多相关文章

  1. .NET日志工具介绍

    最近项目需要一个日志工具来跟踪程序便于调试和测试,为此研究了一下.NET日志工具,本文介绍了一些主流的日志框架并进行了对比.发表出来与大家分享. 综述 所谓日志(这里指程序日志)就是用于记录程序执行过 ...

  2. 渗透测试之BurpSuite工具的使用介绍(三)

    若希望从更早前了解BurpSuite的介绍,请访问第二篇(渗透测试之BurpSuite工具的使用介绍(二)):https://www.cnblogs.com/zhaoyunxiang/p/160002 ...

  3. 高效使用Java构建工具,Maven篇|云效工程师指北

    大家好,我是胡晓宇,目前在云效主要负责Flow流水线编排.任务调度与执行引擎相关的工作. 作为一个有多年Java开发测试工具链开发经验的CRUD专家,使用过所有主流的Java构建工具,对于如何高效使用 ...

  4. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

  5. Java主流日志工具库

    在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息.在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子.我们先来逐一了解一下主流日志工具. 1.java.util.lo ...

  6. 【工具推荐】ELMAH——可插拔错误日志工具

    今天看到一篇文章(构建ASP.NET网站十大必备工具(2)),里面介绍了一个ELMAH的错误日志工具,于是研究了一下. ELMAH 是 Error Logging Modules and Handle ...

  7. Android-LogCat日志工具(二)

    既然是Java语言,那么对于很多人来说,用System.out.println() 方法来打印日志是最熟悉.最简单不过了.不过在真正的项目开发中,是极度不建议使用 System.out.println ...

  8. Java 标准日志工具 Log4j 的使用(附源代码)

    源代码下载 Log4j 是事实上的 Java 标准日志工具.会不会用 Log4j 在一定程度上可以说是衡量一个开发人员是否是一位合格的 Java 程序员的标准.如果你是一名 Java 程序员,如果你还 ...

  9. Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

随机推荐

  1. 2-ADC

  2. Scala 面向对象(三):package 包 (二)

    1 包对象 基本介绍:包可以包含类.对象和特质trait,但不能包含函数/方法或变量的定义.这是Java虚拟机的局限.为了弥补这一点不足,scala提供了包对象的概念来解决这个问题. package ...

  3. python 面试题一:Python语言特性

    1 Python的函数参数传递 两个例子 a = 1 def fun(a): a = 2 fun(a) print a # a = [] def fun(a): a.append(1) fun(a) ...

  4. java 基础(一) Sublime Text3搭建Java编译环境(Windows系统)

    1. 首先配置好Java环境变量我的jdk版本是1.8.0_191,存放目录是C:\Program Files\Java,因此添加以下环境变量 (1)系统变量→新建 JAVA_HOME 变量,变量值为 ...

  5. LeetCode第4题:寻找两个有序数组的中位数

    double Solution::findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) ...

  6. 六十来行python代码完成一个文件分类器

    ​    你的桌面是否像这样的一样被各种文件给堆满了,但是每一个文件又不清楚是否后面还有作用,也不敢删除,自己一个一个转移又太麻烦了.没关系,今天我带大家用python一起来做一个文件归类器,一键进行 ...

  7. Ethical Hacking - GAINING ACCESS(3)

    Sever side attacks code execution Let‘s analyze the Zenmap scan result first and search for somethin ...

  8. Dresdon简介

    很久没有写文章了.这几年经历了很多事情:离开VMware的不舍,拿到融资的开心,重回VMware的亲切,以及不再争强好胜,只做自己喜欢事情的平和. 可以说,我是幸运的:我这一辈子都在选择,而不是被迫接 ...

  9. solr8.4.1开发测试环境的简单应用

    服务器部署   官网地址 https://lucene.apache.org/solr/  从官网下载http:/ /mirror.bit.edu.cn/apache/lucene/solr/8.4. ...

  10. 关于node-sass安装失败问题

    在进行Vue开发中npm run dev报错,按照提示尝试进行npm以及cnpm安装均失败 解决办法:npm uninstall node-sass卸载模块 指定淘宝镜像源安装 npm i node- ...