C语言日志类库 zlog 使用指南(第四章 Syslog模式)

第四章 Syslog模式

在zlog中,有三个重要概念:分类(Category)、规则(Rule)和格式(Format)。

4.1 分类、规则和格式

  • 分类(Category) :用于指定不同类型的日志条目。在zlog源代码中,分类是(zlog_category_t *)变量。在程序中,不同的分类使日志条目互相区分。
  • 格式(Format):描述详细的日志模式,如是否包含时间戳、源文件和源代码行。
  • 规则(Rule):由分类、级别、输出文件(或其他渠道)和格式组成。简言之,如果配置文件中的规则中的分类字符串与源代码中的分类变量名称匹配,则规则生效。

示例代码:

c 复制代码
zlog_category_t *c;

c = zlog_get_category("my_cat");

zlog_info(c, "hello, zlog");

假设配置文件中的规则如下:

复制代码
[rules]
my_cat.DEBUG >stdout; simple

zlog库将使用分类名称"my_cat"匹配配置文件中的规则。在规则中指定的级别条件满足(INFO >= DEBUG),所以日志输出到标准输出(stdout)。

输出内容:

bash 复制代码
hello, zlog

4.2 Syslog模型与log4j模型的区别

zlog与syslog有何关系?实际上模型更接近log4j。在log4j中,有logger、appender和layout的概念。区别在于,在log4j中,每个logger在源代码中必须与配置文件中的一个logger对应,并且只有一个明确的级别。log4j模型不够灵活,为此引入了filters,但使问题更复杂。而syslog模型设计优秀。

继续前节的例子,如果zlog配置文件有两个规则:

复制代码
[rules]

my_cat.DEBUG >stdout; simple

my_cat.INFO >stdout;

将生成两个日志输出:

bash 复制代码
hello, zlog
2012-05-29 10:41:36 INFO [11288:test_hello.c:41] hello, zlog

一个分类在源代码中对应着配置文件中的两个规则。

再看一个示例配置文件:

复制代码
[rules]

my_cat.WARN "/var/log/aa.log"

my_cat.DEBUG "/var/log/bb.log"

源代码:

c 复制代码
zlog_info(c, "info, zlog");
zlog_debug(c, "debug, zlog");

aa.log中只有一条日志:

复制代码
2012-05-29 10:41:36 INFO [11288:test_hello.c:41] info, zlog

而在bb.log中有两条日志:

复制代码
2012-05-29 10:41:36 INFO \[11288\:test\_hello.c:41] info, zlog
2012-05-29 10:41:36 DEBUG \[11288\:test\_hello.c:42] debug, zlog

由此可见,zlog中的一个分类可以对应多个规则,并且规则可以有不同的级别、输出和格式的组合,从而提供了一种简单、清晰的方式来过滤和多输出日志。

4.3 扩展syslog模型

分类在zlog中类似于syslog中的facility。不幸的是,syslog中的facility是一个int类型,值必须从系统定义的有限范围内选择。zlog做得更好,使其成为字符串变量。

在syslog中,有一个特殊通配符"*",匹配所有设施。zlog中"*"同样匹配所有分类。这是一种方便的方法,能将系统多组件生成的所有错误重定向到一个日志文件中。配置文件可这么写:

复制代码
[rules]
*.error "/var/log/error.log"

zlog的一个独特特性是子分类匹配。如果源代码为:

c 复制代码
c = zlog_get_category("my_cat");

配置文件中的规则如下:

复制代码
[rules]

my_cat.* "/var/log/my_cat.log"

my_.NOTICE "/var/log/my.log"

规则匹配分类名称为`"my_cat"`的日志。通配符""表示超类别(super category),"my"是"my_cat"和"my_dog"的超类别。另有通配符"!",详见[Category-Matching]。

相关推荐
香吧香7 分钟前
netstat 与 ss 比较
linux
h^hh16 分钟前
六十天Linux从0到项目搭建(第五天)(file、bash 和 shell 的区别、目录权限、默认权限umask、粘滞位、使用系统自带的包管理工具)
linux
java资料站30 分钟前
linux ntpdate 时间矫正
linux·运维·python
等个结果31 分钟前
CentOS 7 部署RuoYi 项目
linux·运维·centos
Sʜᴀᴅᴏᴡ . ₪3362 小时前
Tomcat-Thales靶机攻略
linux·运维·服务器
屎派克2 小时前
linux和windows是采用何种机制保存密码的?
linux·运维·服务器
张小九992 小时前
Linux修改默认shell为zsh
linux·运维·服务器
竹之却2 小时前
【云服务器】在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 Minecraft 服务器,并实现远程联机,详细教程
linux·服务器·ubuntu·腾讯云·我的世界服务器搭建
知忆_IS2 小时前
【问题解决】Linux安装conda修改~/.bashrc配置文件后,root 用户下显示 -bash-4.2#
linux·conda·bash
Claus-3 小时前
进程间通信—system v标准
linux·运维·jvm