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. java规范总结

    1.所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较. 说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在 Intege ...

  2. JVM 专题十七:垃圾回收(一)简述

    1. 什么是垃圾 1.1 C++与Java 1.2 概述 垃圾收集,不是Java语言的伴生产物.早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生. 关于垃圾收集有三个经典问题 ...

  3. javascript基础(四): 操作表单

    表单是什么?form-----DOM树 文本框----text 下拉框----select 单选框----radio 多选框----checkbox 隐藏域----hidden 密码框----pass ...

  4. python 装饰器(四):装饰器基础(三)叠放装饰器,参数化装饰器

    叠放装饰器 示例 7-19 演示了叠放装饰器的方式:@lru_cache 应用到 @clock 装饰fibonacci 得到的结果上.在示例 7-21 中,模块中最后一个函数应用了两个 @htmliz ...

  5. 神经网络结构:DenseNet

    论文地址:密集连接的卷积神经网络 博客地址(转载请引用):https://www.cnblogs.com/LXP-Never/p/13289045.html 前言 在计算机视觉还是音频领域,卷积神经网 ...

  6. C、C++、Java到Python,编程入门学习什么语言好?

    摘要:回顾编程语言几十年来的兴衰起伏,似乎也折射了整个信息产业的变迁消亡,想要在技术的洪流里激流勇进,找准并学精一两门编程语言更加显得至关重要. 最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C ...

  7. js&jsp规范问题

    1.js初始化问题    一般与数据库交互的需要进行初始化,固定控件一般不需要初始化.有些需要整体浏览器页面校准的可能需要初始化.    //初始化操作按钮        $(function(){  ...

  8. Host是什么?如何设置host文件?

    前言 前几天我在使用一些软件和网站时,出了一些小问题,然后我在网上搜解决问题的方法,搜着搜着就看到频繁出现的Host这个词.以前还没有注意到这个东西,因为总觉得它是系统文件,没必要去乱动:但是经过这次 ...

  9. Linux文件搜索

    一.whereis及which命令 这两个命令用来搜索命令的路径(也遵循/etc/updatedb.conf配置文件的筛选规则) whereis 命令名                        ...

  10. 题解 洛谷 P4899 【[IOI2018] werewolf 狼人】

    先考虑狼形,其只能走编号小于\(R\)的点.若将每条边赋边权为其两端点编号的较大值,然后按最小生成树的顺序构建\(Kruskal\)重构树. 那么从原图的一个点\(x\)在树上倍增,到达满足要求且深度 ...