当前位置:   article > 正文

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

zlog交叉编译

1、前言

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

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


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

下载地址:

以zlog作者HardySimpson版本为例:

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

或使用

make PREFIX=/usr/local/
sudo make PREFIX=/usr/local/ install
  • 1
  • 2

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107

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

--[your configure filename] syntax right
  • 1

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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

编译:

gcc mytest.c -o mytest -lzlog
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/195000
推荐阅读
相关标签
  

闽ICP备14008679号