开源日志库 [log4c] 使用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 开源日志库 [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日志并进行多维度分析。
相关文章
|
9天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
108 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
12天前
|
存储 运维 监控
开源日志Graylog
【10月更文挑战第21天】
52 8
|
12天前
|
存储 数据采集 监控
开源日志Fluentd
【10月更文挑战第21天】
31 7
|
12天前
|
存储 监控 安全
|
12天前
|
存储 数据采集 监控
开源日志分析Elasticsearch
【10月更文挑战第22天】
37 5
|
12天前
|
机器学习/深度学习 运维 监控
开源日志分析Kibana
【10月更文挑战第22天】
23 3
|
12天前
|
存储 JSON 监控
开源日志分析Logstash
【10月更文挑战第22天】
25 1
|
13天前
|
存储 运维 监控
开源日志分析工具
【10月更文挑战第20天】
37 3
|
1月前
|
Web App开发 存储 监控
iLogtail 开源两周年:UC 工程师分享日志查询服务建设实践案例
本文为 iLogtail 开源两周年的实践案例分享,讨论了 iLogtail 作为日志采集工具的优势,包括它在性能上超越 Filebeat 的能力,并通过一系列优化解决了在生产环境中替换 Filebeat 和 Logstash 时遇到的挑战。
|
1月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
30 0