1、前言

具体使用直接参考https://github.com/HardySimpson/zlog的“README.md”文件或者“doc/GettingStart-CN.txt”(README.md的中文版),还有以下两篇文章:

  • http://hardysimpson.github.io/zlog/UsersGuide-CN.html
  • https://blog.csdn.net/fangye945a/article/details/85955906

接下来只是稍微整理下个人的一些zlog学习/使用笔记,加深理解。

2、编译安装(同样适用于交叉编译)

下载地址:

  • https://github.com/HardySimpson/zlog
  • https://github.com/bmanojlovic/zlog(auto tools版本)
  • https://github.com/lisongmin/zlog(cmake版本)

以zlog作者HardySimpson版本为例:

tar xzvf zlog-1.2.15.tar.gz
cd zlog-1.2.15/
make    # 可以使用CC=xxx-gcc选项进行交叉编译
sudo make install

或使用

make PREFIX=/usr/local/
sudo make PREFIX=/usr/local/ install

3、配置文件

配置文件名和存放位置都无所谓,因为可以使用zlog_init函数来指定。配置文件的内容主要包含三个重要概念:category、format和rule。

  • category(类别):程序里获取不同字符串变量来输出不同分类的日志;
  • format(格式):描述输出的格式,是否带有时间戳,文件位置等;
  • rule(规则):将类别、级别、输出文件、格式组合起来的规则。

示例(在“doc/zlog.conf”的基础上添加注释):

# 全局变量
[global]# 等于true时(默认),zlog_init函数会严格检查所有格式和规则,false时则忽略;
strict init = true# 当写日志的次数达到10M次会调用zlog_reload()函数进行重载,默认为0也即关闭
reload conf period = 10M# zlog在堆上为每个线程申请缓存,zlog_init函数申请,如果单条日志长度大于缓存会自动扩充直到最大值max;
# 如果max = 0,每次扩充为原先的两倍,直到这个进程用完所有的内存为止;另外,数值不区分大小写。
buffer min = 1024
buffer max = 2MB# 指定一个锁文件,用来保证多进程情况下日志安全转档,zlog_init函数需要用户具备它的rw权限;
# 如果使用默认值self,则不创建任何锁文件,用配置文件作为锁文件,也即本文件;
# rotate lock file = /tmp/zlog.lock
rotate lock file = self# 默认的日志格式,选项含义如下:
# %c    分类名
# %d()  日志的时间,内部的%F代表%Y-%m-%d,%T时间,%l为12小时制,%m毫秒,%u微秒
# %D()  日志的时间,%m/%d/%y格式
# %E()  获取环境变量的值
# %F    源代码文件名,来源__FILE__,部分编译器会生成绝对路径
# %f    源代码文件名,仅文件名,不带路径
# %L    源代码行号
# %m    用户日志
# %n    换行符
# %p    进程ID,来源于getpid()
# %t    16进制的线程ID:0x%x,来源于pthread_self()
# %T    长整型的线程ID:0xlu
# %U    调用函数名,来源于__func__(C99)或者__FUNCTION__(gcc)
# %V    大写日志级别
# %v    小写日志级别
# %-6   对齐符号,占6个字符宽度,符号“-”代表左对齐
# %ms   毫秒,3位数字字符串,取自gettimeofday
# %us   微秒,6位数字字符串,取自gettimeofday
default format = "%d(%F %T.%l) %-6V (%c:%F:%L) - %m%n"
# default format = "%d(%F %T).%us %-6V (%c:%F:%L) - %m%n"# 指定了创建的日志文件默认的访问权限
file perms = 600# 每条规则写了1K次之后调用fsync让系统把数据写到硬盘
fsync period = 1K# 自定义一个打印级别,范围在[1,253],值越大越重要,格式如下(syslog level不写默认为LOG_DEBUG):
#   (level string) = (level int), (syslog level, optional)
# 系统自带的如下:
#   DEBUG = 20,    LOG_DEBUG
#   INFO = 40,     LOG_INFO
#   NOTICE = 60,   LOG_NOTICE
#   WARN = 80,     LOG_WARNING
#   ERROR = 100,   LOG_ERR
#   FATAL = 120,   LOG_ALERT
#   UNKNOWN = 254, LOG_ERR
[levels]
TRACE = 10
CRIT = 130, LOG_CRIT# 描述输出日志的格式,比如是否带有时间戳,是否包含文件位置信息等,选项见上方“default format”
[formats]
simple = "%m%n"
normal = "%d(%F %T.%l) %m%n"# 把类别、级别、输出文件、格式进行组合,也即决定日志是否输出,输出到哪里,以怎样的格式输出
[rules]# 匹配类别为“default”,所有日志级别都以“simple”格式输出到标准输出
default.*       >stdout; simple# 文件转档:(将日志文件按照大小、日期来切分)
#   选项“-”后接文件路径,代表打开同步IO选项,即以O_SYNC打开,等硬盘写完才返回;
#   "%12.2E(HOME)/log/%c.log"代表正在生成的日志的文件名;
#   1MB代表文件达到该尺寸之后开始转档;
#   12代表保留多少个存档文件(0代表不删除任何一个);
#   "%E(HOME)/log/%c.%D(%F) #2r #3s.log"代表转档的文件名格式,必须包含#r或者#s(一个即可,中间数字代表数值的长度):
#       #r是Rolling的缩写,后缀小的文件较新;
#       #s是Sequence的缩写,后缀大的文件较新;
#   simple代表输出的日志格式
*.*         -"%12.2E(HOME)/log/%c.log", \1MB * 12 ~ "%E(HOME)/log/%c.%D(%F) #2r #3s.log"; \simple
# 上面示例不能正常使用,正常使用的示例:
# *.*     -"%E(PWD)/log/%c.log", 1MB * 12 ~ "%E(PWD)/log/%c.%D(%F).#2s.log"; normal# 匹配类别为“my”及“my_xx”...级别>=INFO的输出到标准错误中
my_.INFO        >stderr;# 匹配类别为“my_cat”,级别!=ERROR输出到文件aa.log中
my_cat.!ERROR       "aa.log"# 匹配类别为“my_dog”,级别==DEBUG的以格式“simple”输出到syslog,LOG_LOCAL[0-7]必填
my_dog.=DEBUG       >syslog, LOG_LOCAL0; simple# 以管道输出给后面的/usr/bin/cronolog(这里只是以cronolog按天分割日志为例)
# zlog_init函数调用popen("/usr/bin/cronolog /www/logs/example_%Y%m%d.log", "w");
my_dog.=DEBUG       | /usr/bin/cronolog /www/logs/example_%Y%m%d.log ; normal# 匹配类别为“my_mice”,符号“$”代表自定义输出:
#   $record_func代表自定义的名称,需程序调用zlog_set_record()将record_func与自定义的函数“绑定”;
#   "record_path%c"就是普通的stdout/stderr、文件等。
my_mice.*       $record_func , "record_path%c"; normal

编写完成之后可以通过编译生成的“zlog-chk-conf”命令检验语法的正确性,语法正确会输出:

--[your configure filename] syntax right

4、程序示例

4.1 示例1(zlog输出):
#include <stdio.h>
#include <unistd.h>
#include "zlog.h"int main(int argc, char** argv)
{int rc;int i = 0;zlog_category_t *c;rc = zlog_init("./zlog.conf");if (rc) {printf("init failed\n");return -1;}c = zlog_get_category("my_cat");if (!c) {printf("get cat fail\n");zlog_fini();return -2;}while(i < 10){zlog_debug(c, "hello, zlog");zlog_info(c, "hello, zlog");zlog_notice(c, "hello, zlog");zlog_warn(c, "%s", "hello, zlog");zlog_error(c, "%s", "hello, zlog");zlog_fatal(c, "%s", "hello, zlog");sleep(1);++i;}zlog_fini();return 0;
}
4.1 示例2(dzlog输出):
#include <stdio.h>
#include <unistd.h>
#include "zlog.h"int main(int argc, char** argv)
{int rc;int i = 0;rc = dzlog_init("./zlog.conf", "my_cat");if (rc) {printf("init failed\n");return -1;}while(i < 10){dzlog_debug("hello, zlog");dzlog_info("hello, zlog");dzlog_notice("hello, zlog");dzlog_warn("%s", "hello, zlog");dzlog_error("%s", "hello, zlog");dzlog_fatal("%s", "hello, zlog");sleep(1);++i;}zlog_fini();return 0;
}

更多程序接口参考“src/zlog.h”即可。

编译:

gcc mytest.c -o mytest -lzlog

Linux log工具:zlog编译安装及使用示例(同样适用交叉编译环境)相关推荐

  1. Linux log工具:编译安装log4cplus及使用示例

    文章目录 1.(交叉)编译安装log4cplus 2.log4cplus各种使用情景 2.1 参考docs/examples.md示例 2.2 比较标准的使用方法(附SimpleLayout/Patt ...

  2. Linux(CentOS6.5)下编译安装Nginx1.10.1

    原文出自:http://www.cnblogs.com/comexchan/p/5815753.html Linux(CentOS6.5)下编译安装Nginx1.10.1 首先在特权账号(root)下 ...

  3. Linux 性能测试工具 sysbench 的安装与简单使用

    Linux 性能测试工具 sysbench 的安装与简单使用 一 背景 sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试. sysbench 支 ...

  4. 【Python 笔记】Linux 下源码编译安装 python

    本文记录在 Linux 上源码编译安装 python 的过程. 文章目录 1. 源码编译安装说明 2. 安装 python2.7 3. 安装 python3.6 1. 源码编译安装说明 安装过程比我想 ...

  5. Linux 性能测试工具 sysbench 的安装与简单使用 1

    文章目录 Linux 性能测试工具 sysbench 的安装与简单使用 一 背景 二 实验环境 2.1 操作系统 2.2 其他配置 三 安装 四 简单使用过程 4.1 查看软件版本 4.2 查看系统帮 ...

  6. linux 内核 82540网卡,Linux网卡as4.2 编译安装及配置准备

    Linux网卡as4.2 编译安装及配置准备 [日期:2008-03-28] 来源:Linux公社 作者:Linux整理 [字体:大 中 小] 确定make gcc kernel-devel包必须安装 ...

  7. Python 3.10版本及其依赖项 Linux下源码编译 安装到指定路径/目录

    Python 3.10版本及其依赖项 Linux下源码编译 安装到指定路径/目录 安装需求 准备工作 Python及其依赖项 libffi glibc GDBM mpdecimal bz2 xz re ...

  8. linux ntpd服务器,Linux运维知识之Linux升级NTPD服务器-编译安装ntp-4.2.8p9与配置NTPD服务器...

    本文主要向大家介绍了Linux运维知识之Linux升级NTPD服务器-编译安装ntp-4.2.8p9与配置NTPD服务器,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 1. 系 ...

  9. linux下的线程编译,Linux下的多线程下载工具Axel编译安装

    Linux系统下,下载文件一般使用wget直接下载,但是wget是不支持多线程,导致下载速度提不上来,尤其是下载大文件的时候特别明显 axel不仅支持多线程下载,并且还支持断点续传.记录一下CentO ...

  10. linux系统软件包分类,Linux软件包管理和编译安装

    软件包介绍 开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软件.用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一 ...

最新文章

  1. Tensorflow快餐教程(8) - 深度学习简史
  2. Centos5.5下lvs+keepalived集群
  3. CNN结构:场景分割与Relation Network
  4. 现在股市里人人都在赚钱!!到底谁在亏钱?我讲一个故事来告诉大家谁亏钱了...
  5. 数据科学 IPython 笔记本 9.2 NumPy 简介
  6. linux一些基本知识
  7. 一文看完“阿里云自动化运维沙龙 · 上海专场”整场干货
  8. Python 符号运算
  9. SN号获取及显示不全的问题
  10. Sentinel2 哨兵2数据下载方法(USGS)-史上最全讲解
  11. 一种基于linux系统的精准流量统计方法
  12. 《投资中最简单的事》”第二部分--投资办法“读书笔记
  13. uniApp 实现微信小程序和app视频播放flv格式视频监控
  14. 三坐标检测之测量基准面的选择
  15. Egret 开发H5小游戏
  16. JavaScript:实现给定一个句子,返回出现次数最多的单词算法(附完整源码)
  17. mysql 1593_Linux中MySQL主从复制中出现1593错误码的低级错误
  18. 《图像处理实例》 之 疏密程度统计
  19. merger oracle,merger oracle 函数
  20. 软件质量改进(一)------过程改进方法

热门文章

  1. ThinkPHP商城系统与外部系统用户互通,集成UCenter
  2. 如何导出微信聊天记录
  3. python花瓣_Python 花瓣网动态爬虫
  4. 花瓣网服务器维护一个月,花瓣网维护网站推荐-只需要这一个网站就够了
  5. qq空间音乐外链,音乐永久地址,连接dj,连接音乐,背景音乐,舞曲背景0sm.com
  6. 数车计算机编程教学caxa,CAXA数控车(数控车床编程工具)V2018.1.0 正式版
  7. 01-2制作U盘启动盘--装机助理工具
  8. 免安装版VSCode配置(便携模式)
  9. 倍福TwinCAT软件介绍以及使用TwinCAT的理由
  10. CorelDRAW2022标准专业订阅版下载及功能介绍