开源日志库 [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官方链接


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
6月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
796 54
|
4月前
高性能网络库设计之日志组件
高性能网络库设计之日志组件
173 2
|
9月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
769 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
8月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
818 13
|
9月前
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
427 5
图解MySQL【日志】——Redo Log
|
8月前
|
缓存 Java 编译器
|
10月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
522 7
MySQL事务日志-Undo Log工作原理分析
|
8月前
|
JSON API Go
基于责任链与策略模式的轻量级PHP日志库设计
项目日志乱成一团,bug 时好时坏,服务器问题难以复现?我写了个 PHP 日志系统,第一时间发现问题,避免跑路。实现了责任链模式+策略模式,让日志存储更灵活,支持多种输出方式。
|
8月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
1051 0

热门文章

最新文章

下一篇
oss云网关配置