开源日志库 [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日志并进行多维度分析。
相关文章
|
2月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
|
2月前
|
前端开发 C语言 开发者
领导被我的花式console.log吸引了!直接写入公司公共库!
【8月更文挑战第23天】领导被我的花式console.log吸引了!直接写入公司公共库!
37 2
领导被我的花式console.log吸引了!直接写入公司公共库!
|
21天前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
1月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
63 9
|
4天前
|
存储 运维 监控
超级好用的C++实用库之日志类
超级好用的C++实用库之日志类
10 0
|
2月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
67 0
|
2月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
64 0
|
2月前
|
存储 消息中间件 监控
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统ELK、日志收集分析
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统、日志收集分析。日志级别从小到大的关系(优先级从低到高): ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 低级别的会输出高级别的信息,高级别的不会输出低级别的信息
|
2月前
|
存储
【Azure Log A workspace】Azure上很多应用日志收集到Log A workspace后如何来分别各自的占比呢?
【Azure Log A workspace】Azure上很多应用日志收集到Log A workspace后如何来分别各自的占比呢?
|
2月前
|
API
【Azure 应用服务】当在Azure App Service的门户上 Log Stream 日志无输出,需要如何操作让其输出Application Logs呢?
【Azure 应用服务】当在Azure App Service的门户上 Log Stream 日志无输出,需要如何操作让其输出Application Logs呢?
下一篇
无影云桌面