自学内容网 自学内容网

C语言日志类库 zlog 使用指南(第一章 什么是 zlog)

第一章 什么是 zlog

1. zlog 是什么?

zlog 是一个可靠、高性能、线程安全、灵活、模型清晰的纯 C 语言日志库。

在 C 语言世界中,没有像 Java 的 logback 或 C++ 的 log4cxx 这样的优秀日志库。虽然 printf 可以使用,但它很难重定向或重新格式化,而 syslog 速度较慢,主要设计用于系统用途。

因此,我编写了 zlog。

zlog 比 log4c 更快、更安全、更强大,因此可以广泛使用。

zlog 的特性包括:

  • syslog 模型,比 log4j 模型更好
  • 日志格式自定义
  • 多种输出方式,包括静态文件路径、动态文件路径、stdout、stderr、syslog、用户定义的输出
  • 配置在运行时可以手动或自动刷新(并且是安全的)
  • 高性能,每秒 250,000 条日志记录,比 rsyslogd 的 syslog(3) 快约 1000 倍
  • 用户定义日志级别
  • 在多进程或多线程情况下安全地轮转日志文件
  • 精确到微秒
  • dzlog,一个默认类别日志 API,便于使用
  • MDC,一种 log4j 风格的键值映射表
  • 自我调试,可以在运行时输出 zlog 的自调试和错误日志*
  • 不依赖任何其他第三方库,只基于 POSIX 系统(包括 pthread)和 C99 兼容的 vsnprintf

链接:

1.1 兼容性说明

  1. zlog 基于 POSIX 兼容系统。作者仅在 GNU/Linux 和 AIX 环境中编译、测试和运行 zlog。不过,zlog 应该也能在 FreeBSD、NetBSD、OpenBSD、OpenSolaris 和 Mac OS X 等系统上运行良好。欢迎在任何系统上测试 zlog。
  2. zlog 使用 C99 兼容的 vsnprintf 特性。如果目标缓冲区的大小不够,vsnprintf 将返回应该写入最终字符串的字符数(不包括尾随的 ‘\0’)。如果系统上的 vsnprintf 不支持这一特性,当单个日志超过缓冲区大小时,zlog 将无法确定正确的缓冲区大小。好在 glibc 2.1、AIX 的 libc 和 freebsd 的 libc 均工作正常,而 glibc 2.0 不支持这一特性。在这种情况下,用户需要使用 C99 兼容的 vsnprintf 自行修正 zlog。可以尝试 ctrioC99-snprintf。需修正的文件是 buf.c,祝成功!
  3. 一些人提供了适用于其他平台的 zlog 版本,感谢这些贡献!

1.2 zlog 1.2 发行说明

1. zlog 1.2 提供以下新特性:

  • 支持管道输出,现在 zlog 可以通过类似 cronolog 的程序发送日志输出
  • 完整的日志轮转支持
  • 其他代码兼容性细节和错误修复

2. zlog 1.2 与 zlog 1.0 二进制兼容。主要区别如下:

  • 所有 zlog 宏(如 ZLOG_INFO )变更为小写版本(例如 zlog_info)。这次大的变更是为了简化输入。如果你在使用之前的 zlog 版本,请使用脚本替换所有宏并重新编译你的程序。例如:
sed -i -e 's/\b\w*ZLOG\w*\b/\L&\E/g' aa.c
  • 放弃了 auto tools 编译。由于 auto tools 不友好,现使用简单的 makefile,这需要 gcc 和 gnu make。如果这个 makefile 在你的环境中无法工作,你需要自己编写一个适用的 makefile。对于极客来说,这应该很容易。

补充一:请问上文中提到的 cronolog 是什么?

cronolog 是一个用于日志文件管理的工具,主要用于将日志文件按时间或大小进行切分(轮转)。它能够根据给定的时间模式将日志文件分割成多个部分,并将日志数据重定向到新的文件中。这样一来,日志文件不会一直增长,便于管理和查看。

cronolog 的主要功能:

  1. 按时间轮转日志:可以根据时间(如每天、每周、每个月)将日志文件切分成多个部分。
  2. 按大小轮转日志:可以设置日志文件达到一定大小后进行切分。
  3. 自动归档旧日志:旧的日志文件可以自动归档并根据指定模式命名。

使用场景:

  • Web服务器日志管理:可以每天生成一个新日志文件,便于日志分析和备份。
  • 应用程序日志管理:防止日志文件因为过大而难以处理。

一个简单的使用示例:

假设你有一个应用程序会不断地输出日志,你可以使用 cronolog 将这些日志按天归档。

your_application | cronolog /var/log/your_application/%Y%m%d.log

这会将日志按年月日生成不同的文件,例如 `20230101.log`,`20230102.log` 等。

安装 cronolog:

在大多数 Linux 发行版中,可以直接通过包管理器进行安装。例如,在 Debian/Ubuntu 系统中:

sudo apt-get install cronolog

在 Red Hat/CentOS 系统中:

sudo yum install cronolog

通过使用 cronolog,你可以更加灵活地管理 zlog 生成的日志文件,实现自动化的日志归档和清理,确保日志文件始终处于可控状态。

补充二:请详细讲解命令 ‘’‘sed -i -e ‘s/\b\w*ZLOG\w*\b/\L&\E/g’ aa.c’‘’

这条命令使用了 sed(stream editor)工具来批量替换文件中的文本内容。具体来说,这条命令将 aa.c 文件中的所有大写的 ZLOG 宏替换为小写形式。让我们逐步拆解和解释这条命令:

命令结构

sed -i -e 's/\b\w*ZLOG\w*\b/\L&\E/g' aa.c
  • sed: 这是 Unix/Linux 中的流编辑器,用于解析和转换文本。
  • -i: 表示直接在文件内进行编辑(in-place),而不是输出到标准输出。如果不使用这个选项,sed 只会将结果输出到终端,而不会更改文件内容。
  • -e: 这个选项允许在命令行中指定 sed 脚本。

sed 脚本解释

's/\b\w*ZLOG\w*\b/\L&\E/g'
  • s: 这是 sed 的子命令,表示替换(substitute)。
  • \b: 单词边界,确保匹配整个单词而不是单词的一部分。
  • \w*ZLOG\w*`: 这里的 \w* 表示匹配字母、数字或下划线字符的零个或多个,即 ZLOG 前后可能会有其他字符,例如 ZLOG__ZLOGZLOG123
  • \b: 再次指定单词边界。
  • /: 分隔符,sed 使用 / 来分隔要匹配的模式和要替换的字符串。
  • \L: 这个是 sed 的扩展语法,用于将接下来的字符转换为小写。
  • &: 这个符号在替换部分表示整个匹配到的文本。
  • \E: 关闭小写转换。
  • g: 全局替换标志,表示在每行中替换所有匹配项,而不仅是第一个。

整合解释

  1. s/\b\w*ZLOG\w*\b: 这部分表示找到以单词边界开始和结束的包含 ZLOG 的单词。
  2. /\L&\E/: 这部分表示将找到的匹配内容(用 & 表示)转换为小写。
  3. g: 这部分表示在整行中查找所有符合模式的内容并进行替换,而不仅仅是第一个匹配。

应用到文件

aa.c: 这是命令操作的目标文件。sed 将在 aa.c 文件中查找所有符合模式的内容并进行替换,最后保存修改。

完整工作流程

所以,命令 sed -i -e 's/\b\w*ZLOG\w*\b/\L&\E/g' aa.c 的完整工作流程如下:

1. 文件 aa.c 被读取。

2. 查找所有以 ZLOG 开头或结尾并且在单词边界内的内容。

3. 将这些匹配内容转换为小写。

4. 将修改后的内容直接覆盖原文件 aa.c

通过这条命令,可以轻松将文件中的所有大写 ZLOG 宏改为小写形式,便于统一代码风格。


原文地址:https://blog.csdn.net/fjw12998/article/details/142626578

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!