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

news/2024/10/4 2:42:26/

第四章 Syslog模式

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

4.1 分类、规则和格式

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

示例代码:

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)。

输出内容:

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; simplemy_cat.INFO >stdout;

将生成两个日志输出:

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"

源代码:

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 = 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]。


http://www.ppmy.cn/news/1534223.html

相关文章

Java | Leetcode Java题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; class Solution {public int numberOfArithmeticSlices(int[] nums) {int ans 0;int n nums.length;Map<Long, Integer>[] f new Map[n];for (int i 0; i < n; i) {f[i] new HashMap<Long, Integer>();}for (int i 0;…

android 系统默认apn数据库

在 Android 13 及其他版本的系统中&#xff0c;默认的 APN 数据库文件通常位于以下路径&#xff1a; /system/etc/apns-conf.xml 说明&#xff1a; apns-conf.xml 是存储默认 APN 设置的文件&#xff0c;通常包含全球不同运营商的 APN 配置。这个文件是系统文件&#xff0c…

两个圆形 一个z里面一个z外面,z里面的大,颜色不同 html

两个圆形 一个z里面一个z外面&#xff0c;z里面的大&#xff0c;颜色不同 html <!DOCTYPE html> <html> <head> <style> .outer-circle {width: 150px;height: 150px;border-radius: 50%;background-color: #ff9999; /* 外圆的颜色 */position: relat…

C++七种异常处理

在C++中,使用异常机制可以提高程序的健壮性和可维护性。异常是在程序运行时发生的一个事件,它会打断正在执行的程序的正常流程。C++异常处理机制可以使程序在出现异常时,进行异常处理,而不是退出程序。 基本的异常处理 #include <iostream> using namespace std;int …

JAVA并发编程系列(13)Future、FutureTask异步小王子

美团本地生活面试&#xff1a;模拟外卖订单处理&#xff0c;客户支付提交订单后&#xff0c;查询订单详情&#xff0c;后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。 时间好快&#xff0c;一转眼不到一个月时间&#xff0c;已经完成分享synchronized、volatile、…

MongoDB 的基本使用

目录 数据库的创建和删除 创建数据库 查看数据库 删除数据库 集合的创建和删除 显示创建 查看 删除集合 隐式创建 文档的插入和查询 单个文档的插入 insertOne insertMany 查询 嵌入式文档 查询数组 查询数组元素 为数组元素指定多个条件 通过对数组元素使…

微信小程序技术框架选型

“近期在对团队的微信小程序进行技术框架选型&#xff0c;故对目前主流的微信小程序技术框架进行了一些分析和比较&#xff0c;包括各框架的维护团队、社区链接、GitHub star数、优缺点对比等方面&#xff0c;为团队提供技术框架选型参考” 一、引言 随着移动互联网的快速发展…

Redis篇(应用案例 - 商户查询缓存)

目录 一、什么是缓存? 二、为什么要使用缓存 三、如何使用缓存 四、添加商户缓存 1. 缓存模型和思路 2. 代码如下 五、缓存更新策略 1. 内存淘汰 2. 超时剔除 3. 主动更新 六、数据库缓存不一致解决方案 1. 数据库缓存不一致解决方案 2. 数据库和缓存不一致采用什…