开源日志库 [log4c] 使用

简介: 开源日志库 [log4c] 使用

开源日志库[log4c]使用

log4c简介

要求平台

软件需求

log4c 下载、编译、安装

下载

编译、安装

log4c 通用使用方式

代码中使用

配置文件

代码库中进行链接使用

将库和头文件放置到代码工程中

修改对应的 CMAKE 配置文件

代码添加

参考链接及文献

log4c简介

Log4c是一个C库,用于灵活地记录文件、系统日志和其他目的地。它是根据Java库的日志建模的(http://jakarta.apache.org/log4j/),尽可能接近其API。这里是对Log4j的简短介绍,它描述了API和设计原理。


马克·孟德尔以不同的理念启动了一个平行的log4c项目。该设计是面向宏的,因此更轻、更快,非常适合内核开发。


Log4c也可从SourceForge获得 ( http://www.sourceforge.net/projects/log4c/ ). 这是正在进行的工作。


要求平台

log4c已成功编译并在以下平台上运行:


HP-UX release 11.00
Tru 64 release 4.0F and 5.1
Red Hat Linux Intel release 7.x, 8, 9
Red Hat Enterprise Linux 3, 4
Solaris Intel release 8, 9, 10
FreeBSD 6.1-RELEASE
AIX 5.3 (with xlc compiler)
Mac OS X
Windows X
...and other Linux distributions


log4c应在以下平台上编译和运行:


The BSD family
MS Windows


软件需求

生成 log4c 需要以下软件


GCC 3.0.1+, to generate log4c, but hopefully not to use it.
doxygen 1.2.13+, a documentation system for C/C++ needed to generate the documentation.
graphviz, the AT&T Graph Visualization Tools also needed to generate the documentation.


目前,log4c使用特定的GCC扩展,比如attribute,所以您需要GCC来编译它。这可能有一天会改变。


log4c 下载、编译、安装

下载

官方下载链接


编译、安装

$ gzip -dc log4c-1.2.4.tar.gz | tar tvf -
$ cd log4c-1.2.4/
$ ./configure --enable-static --prefix=/home/ww/ww/gitlabproject/opcodetester/third/log4c-install/ CC="gcc -m32"
$ make
$ make install


log4c 通用使用方式

代码中使用

#include "log4c.h"
int main()
{
  //初始化
  log4c_init();
  //获取一个已有的category
  log4c_category_t* mycat = log4c_category_get("mycat"); 
  //用该category进行日志输出,优先级为DEBUG,输出信息为 "Hello World!"
  log4c_category_log(mycat, LOG4C_PRIORITY_DEBUG, "Hello World!");  
  return 0;
}


如果你直接使用这种方式去打印,你会发现虽然程序编译和运行都没有报错,但是最终的打印信息并没有打印出来。这是因为通用方式中还依赖配置文件的参数来进行初始化。


配置文件

Log4c和所有Log4j系的log工具一样,都是可以通过文件配置log特性的。其配置文件采用xml形式,通常叫做log4crc。通过修改log4crc,可以达到配置log4c的目的。

以上代码片段其对应的log4crc可以是


<?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE log4c SYSTEM ""> 
  <log4c version="1.2.1">
  <config>
    <bufsize>0</bufsize> 
    <debug level="2"/>
    <nocleanup>0</nocleanup>
    <reread>1</reread>
  </config>
  ....
  <category name="mycat" priority="debug" appender="stdout" />
  <appender name="stdout" type="stream" layout="basic"/>
  <layout name="basic" type="basic"/>
</log4c>


从log4crc中也可以看到Category, Appender, Layout三者之间的关系,一个Category需要为其指定一个appender, 一个appender亦要为其指定一个layout。

Log4c中已经提供了几种默认类型的appender和layout。


appender一般是不需要自己来扩展了,我觉得够用了,一般也就是file, stdout, stderr这几个,而这几种类型Log4c都提供了。


layout我倒是认为有必要扩展一下,Log4c提供的几种默认layout类型信息不够丰富,有时候恐怕无法满足需要。譬如,默认的Layout类型中没有提供能够记录Log事件发生

位置(如文件,行,函数)的格式。所以,如果需要的话就自己定义个格式好了,还是很简单的,我会根据自己的需要和喜好来定义自己的格式。


另外,看这样一条日志记录语句

log4c_category_log(mycat, LOG4C_PRIORITY_DEBUG, “Hello World!”);

是不是有点长了呢,每次都敲这么长一串实在是很麻烦,比起log4cpp或者log4cxx相对就简短一些。

首先因为log4c是纯c的东西,就不能以面向对象的方式来调用,在他的log函数中必须指定一个category为参数。

然后才是log level参数, log4c中为log level定义的枚举类型也够长的,像 LOG4C_PRIORITY_DEBUG,LOG4C_PRIORITY_ERROR等,输起来很麻烦。

最后才是你要输出的message.


代码库中进行链接使用

将库和头文件放置到代码工程中

在编译和链接时需要用到 log4c 的头文件和共享库文件,所以只需要将这部分的文件内容包含到代码工程中,这里在工程中专门创建了目录 third/log4c/ 来存放对应的文件,如下图所示:

eaa384bc8f874eb69ba7b11e909f2333.png

修改对应的 CMAKE 配置文件

如果代码工程使用 cmake 进行构建,则需要在 CMakeLists.txt 文件中添加库的连接和使用,具体如下:


# log4c
set(3RDLIB_PATH ${PROJECT_SOURCE_DIR}/third/log4c)
list(APPEND 3RD_LIBS_INCLUDE ${3RDLIB_PATH}/include)
list(APPEND 3RD_LIBS_INCLUDE ${3RDLIB_PATH}/include/log4c)
link_directories(${3RDLIB_PATH}/lib)
link_libraries(log4c)
...
#添加头文件引用路径
target_include_directories(opcodetester PUBLIC
                           ${PROJECT_BINARY_DIR}
                           ${EXTRA_INCLUDE}
                           ${3RD_LIBS_INCLUDE}
            )


代码添加

这里必须说明,如果采用之前的配置文件的方式,可能在构建工程时还需要对这部分配置文件进行处理,所以可以使用代码在程序中自定义日志所需要的数据结构对象而不需要使用配置文件。


//创建日志输出对象
mylog = log4c_category_get("OpcodeLog");
//创建输出目标数据对象,这里 stdout 指的是终端窗口,可以自定义其他字符串则会在当前路径下创建日志文件
out = log4c_appender_get("stdout");
//指定日志输出目标到对象中
log4c_category_set_appender(mylog, out);
//使用方式
log4c_category_log(mylog, LOG4C_PRIORITY_DEBUG, "helloworld");


参考链接及文献

log4c官方链接


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1天前
|
C++
JNI Log 日志输出
JNI Log 日志输出
18 1
|
1天前
|
存储 运维 大数据
聊聊日志硬扫描,阿里 Log Scan 的设计与实践
泛日志(Log/Trace/Metric)是大数据的重要组成,伴随着每一年业务峰值的新脉冲,日志数据量在快速增长。同时,业务数字化运营、软件可观测性等浪潮又在对日志的存储、计算提出更高的要求。
|
1天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
|
1天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
89 1
|
1天前
|
弹性计算 运维 Shell
|
1天前
|
SQL 调度 Swift
【深入浅出】阿里自研开源搜索引擎Havenask日志查询
本次分享内容为Havenask的日志查询,文章包含了具体查询步骤和举例、实操演示,希望可以帮助大家更好的使用Havenask。
424 0
|
1天前
|
Java
log4j异常日志过滤规则配置
log4j异常日志过滤规则配置
92 0
|
1天前
|
SQL 存储 监控
SLS 查询新范式:使用 SPL 对日志进行交互式探索
像 Unix 命令一样支持多级管道级联,像加工预览一样实时处理查询结果,更便捷的交互,更丰富的算子,更灵活的探索半结构化日志,快来试试使用 SPL 语言查询日志数据吧~
46343 4
|
1天前
|
Apache
web服务器(Apache)访问日志(access_log)详细解释
web服务器(Apache)访问日志(access_log)详细解释
|
1天前
|
Java Spring
日志精准记录:Spring与Log4j完美整合的实战指南
日志精准记录:Spring与Log4j完美整合的实战指南
246 0
日志精准记录:Spring与Log4j完美整合的实战指南

热门文章

最新文章