1、概述


就是一个开源的日志系统,嗯。

优点:代码纯c,比log4cpp&log4cplus可移植性高;

缺点:不再维护(最新版本为1.2.4),不是面向对象,存在内存泄漏问题。(但还是了解下使用方法吧)

2、交叉编译log4c


log4c有是否使用expat库来解析xml的2种不同编译方式,不过README文档里推荐使用expat库。当然如果不想依赖这些库也可以在./configure时使用--without-expat选项,这样就不使用expat库来解析,而是使用了yacc/lex。以下分别介绍2种编译方式:

2.1 使用expat库的编译方式

① 先编译expat库:

由于log4c依赖expat库来解析xml文件,所以先编译得到它的库。

下载地址:https://github.com/libexpat/libexpat/releases

编译步骤:

tar xjvf expat-2.2.10.tar.bz2
cd expat-2.2.10/
./configure --prefix=$PWD/tmp --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc
make
make install

② 再编译log4c

下载地址:http://log4c.sourceforge.net/

tar xzvf log4c-1.2.4.tar.gz
cd log4c-1.2.4/
./configure --prefix=$PWD/tmp --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc \CFLAGS=-I$PWD/../expat-2.2.10/tmp/include \LDFLAGS=-L$PWD/../expat-2.2.10/tmp/lib
make
make install
2.2 不使用expat库的编译方式
tar xzvf log4c-1.2.4.tar.gz
cd expat-2.2.10/
./configure --prefix=$PWD/tmp --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --without-expat
make
make install

编译安装完成之后将tmp/目录下的文件拷贝到目标板对应的目录即可。

3、log4c使用


3.1 配置文件log4crc的基本概念

log4crc文件可以放在安装路径的etc目录、也可以是家目录下的.log4crc,也可以与可执行程序放到同一目录下(参考log4c-1.2.4-arm/src/log4c/init.c),它的内容是xml形式。文件内容主要包含三个重要的概念:

  • category(类别): 用于区分不同的logger,通过它可以设定多个logger。category需要指定它的appender:

    • name:日志的名称;
    • priority:日志的优先级,有fatal/alert/crit/error/warn/notice/info/debug/trace/notest/unknow共11个级别;
    • appender:用于指定特定的appender;
  • appender(附加): 用来描述输出目的地,决定log信息流出到什么地方,比如stdout、stderr、文件等。appender需要指定它的layout来设定日志信息的格式:
    • name:输出流的名称;
    • type:输出流的类型;
    • layout:输出日志格式的名称,用于指定特定的layout;
    • rollingpolicy:输出日志文件策略的名称,用于指定特定的rollingpolicy;
  • layout(布局): 设置日志信息的格式,比如是否加上时间戳、文件位置信息等:
    • name:输出日志格式的名称;
    • type:输出日志格式的类型;
      • basic:以“[日志的级别] [日志的category] - [日志的内容]”格式输出;
      • dated:以“[日志的时间] [日志的级别] [日志的category] - [日志的内容]”格式输出,时间格式为yyyymmdd hh:mm:ss.ms;
  • rollingpolicy(滚动策略):
    • name:日志文件输出的策略名称;
    • type:输出日志文件的策略类型;
    • maxsize:输出日志文件的最大值,默认为20KByte;
    • maxnum:保存的历史日志文件总数,默认为5。

log4crc示例:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE log4c SYSTEM ""><log4c><config><bufsize>0</bufsize><debug level="0"/><nocleanup>0</nocleanup></config><!-- root category ========================================= --><category name="root" priority="notice"/><category name="log4c.mytest" priority="debug" appender = "stdout"/><!-- default appenders ===================================== --><appender name="stdout" type="stream" layout="basic"/><appender name="stderr" type="stream" layout="dated"/><appender name="syslog" type="syslog" layout="basic"/><!-- default layouts ======================================= --><layout name="basic" type="basic"/><layout name="dated" type="dated"/>
</log4c>

3.2 C语言使用示例

3.2.1 C语言API接口:

/* 定义 */
typedef struct __log4c_category {char*         cat_name;int           cat_priority;int           cat_additive;const log4c_category_t*   cat_parent;log4c_appender_t*     cat_appender;
}log4c_category_t;/* 初始化 */
LOG4C_API int log4c_init(void);/* 反初始化 */
LOG4C_API int log4c_fini(void);/* 根据参数a_name获取一个已有的category */
LOG4C_API log4c_category_t* log4c_category_get(const char* a_name);/* 日志输出,最后参数为变参 */
void log4c_category_log(const log4c_category_t* a_category,int a_priority,const char* a_format,...);/* 日志输出,参数加入调用者位置信息 */
void log4c_category_log_locinfo(const log4c_category_t* a_category, const log4c_location_info_t* a_locinfo, int a_priority, const char* a_format, ...);/* 日志级别 */
typedef enum {/** fatal */    LOG4C_PRIORITY_FATAL    = 000,/** alert */    LOG4C_PRIORITY_ALERT    = 100,/** crit */     LOG4C_PRIORITY_CRIT    = 200,/** error */    LOG4C_PRIORITY_ERROR    = 300,/** warn */     LOG4C_PRIORITY_WARN       = 400,/** notice */   LOG4C_PRIORITY_NOTICE   = 500,/** info */     LOG4C_PRIORITY_INFO     = 600,/** debug */    LOG4C_PRIORITY_DEBUG    = 700,/** trace */    LOG4C_PRIORITY_TRACE    = 800,/** notset */   LOG4C_PRIORITY_NOTSET   = 900,/** unknown */  LOG4C_PRIORITY_UNKNOWN  = 1000
} log4c_priority_level_t;

3.2.2 C语言使用例程:

(logcrc内容见上面示例)

#include <stdio.h>
#include "log4c.h"int main(int argc, char **argv)
{log4c_category_t *mytest = NULL;/* 初始化 */if(log4c_init()){printf("log4c_init error!\n");goto err;}/* 获取已配置的category */mytest = log4c_category_get("log4c.mytest");/* 输出日志 */log4c_category_log(mytest, LOG4C_PRIORITY_INFO, "hello, world!");/* 反初始化 */if(log4c_fini()){printf("log4c_fini error!\n");goto err;}return 0;err:return -1;
}

编译:

arm-linux-gnueabihf-gcc mytest.c -o mytest -llog4c -I./log4c-1.2.4/tmp/include -L./log4c-1.2.4/tmp/lib

测试:

$ ./mytest
[stdout] 20210324 06:15:51.136 INFO     log4c.mytest- hello, world!

另外,如果想将log直接保存到文件中,则可以将log4crc文件修改为:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE log4c SYSTEM ""><log4c><config><bufsize>0</bufsize><debug level="0"/><nocleanup>0</nocleanup></config><!-- root category ========================================= --><category name="root" priority="notice"/><!-- 输出到文件mylogfilename.x ========================================= --><category name="log4c.mytest" priority="debug" appender = "myrollingappender"/><appender name="myrollingappender" type="rollingfile" logdir="./" prefix="mylogfilename" layout="dated" rollingpolicy="myrollingpolicy" /><rollingpolicy name="myrollingpolicy" type="sizewin" maxsize="1024000" maxnum="10" /><!-- default appenders ===================================== --><appender name="stdout" type="stream" layout="basic"/><appender name="stderr" type="stream" layout="dated"/><appender name="syslog" type="syslog" layout="basic"/><!-- default layouts ======================================= --><layout name="basic" type="basic"/><layout name="dated" type="dated"/>
</log4c>

参考文章:
  log4c 使用手册(整合多个资料) - 爱耍流氓的兔子.CSDN
  log4c编译与简单使用总结 - log4c编译与简单使用总结.OSCHINA
  Log4C使用总结_百度文库

Linux log工具:交叉编译log4c及使用示例相关推荐

  1. Linux log工具:编译安装log4cplus及使用示例

    文章目录 1.(交叉)编译安装log4cplus 2.log4cplus各种使用情景 2.1 参考docs/examples.md示例 2.2 比较标准的使用方法(附SimpleLayout/Patt ...

  2. Linux远程批量工具mooon_ssh和mooon_upload使用示例

    Linux远程批量工具mooon_ssh和mooon_upload使用示例.pdf 目录 目录 1 1. 前言 1 2. 批量执行命令工具:mooon_ssh 2 3. 批量上传文件工具:mooon_ ...

  3. 树莓派linux交叉编译libwebsocket及使用示例

    文章目录 前言 一.libwebsockets是什么? 二.使用到的资源 三.编译 1. cmake 2. libwebsockets 四. 使用示例 做客户端 测试 前言 本文主要介绍libwebs ...

  4. linux交叉编译openssl,交叉编译openssl for linux arm-v5te-linux-gnueabi工具链

    我遇到了同样的问题并写了一本关于如何交叉编译openssl for arm的手册 . 我希望本手册能给你一些想法: 这个过程非常简单 . 在本手册中,我们将给出一个在Ubuntu Linux系统中交叉 ...

  5. linux 开发工具集合

    转自:http://blog.csdn.net/vidanet/article/details/6732744 软件集成开发环境(代码编辑.浏览.编译.调试) Emacs            htt ...

  6. linux开发工具列表

    软件集成开发环境(代码编辑.浏览.编译.调试) Emacs           http://www.gnu.org/software/emacs/ Source-Navigator 5.2b2   ...

  7. Linux开发工具整理

    对Linux 下的开发工具以及安装方法做下摘录. 以下文字都摘录于网络上的一篇文章,作者不详. 软件集成开发环境(代码编辑.浏览.编译.调试) Emacs           http://www.g ...

  8. conan入门(五):conan 交叉编译引用第三方库示例

    conan 交叉编译引用第三方库示例 Conan 是 C 和 C++ 语言的依赖项和包管理器.它是免费和开源的,适用于所有平台(Windows.Linux.OSX.FreeBSD.Solaris 等) ...

  9. Linux开发工具的使用

    1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用 1.   Linux开发工具的使用 V ...

最新文章

  1. TCP和UDP DNS DHCP OSPF的五种包:
  2. Http压测工具wrk使用指南【转】
  3. leetcode18
  4. sybase数据库导出mysql_sybase导出数据库的表结构命令
  5. 数据表列名与数据库关键字冲突,在Hibernate下的解决办法
  6. IS服务器下做301永久重定向设置方法
  7. mac phpstorm调试php,MAC下phpstorm20190302+Xdebug2.7断点调试PHP | 朱斌技术博客
  8. WCF系列之.net(3.0/3.5)Rest使用示例
  9. C++中int *p[4]和 int (*q)[4]的区别
  10. python脚本 pyqt 打包成windows可执行exe文件 pyinstaller
  11. 安全测试3_Web后端知识学习
  12. Thinapp的昨天,今天和明天
  13. (二)Nginx安装与配置
  14. Silverlight 2.0 RTW 正式版发布(附下载地址)
  15. ISO12233:2014 eSFR分辨率测试卡使用方法
  16. Ubuntu搭建FTP服务器
  17. 如何使用命令提示符查找和打开文件
  18. soul显示服务器异常,soul账号状态异常是什么意思?soul账号异常操作多久解封
  19. Facebook想要成为下一个微信,难! 1
  20. 【css】 使用CSS去除 去掉超链接的下划线方法

热门文章

  1. 华为云发布CodeArts Req需求管理工具,让需求管理化繁为简
  2. java世界神奇“+”的学习
  3. 好用免费【易WiFi】易建联上网,不掉线
  4. MikroTik NAT日志记录
  5. php滑动解锁验证码,给WordPress加评论滑动解锁QapTcha验证
  6. 商业智能最佳解决方案--微软数据仓库 翻译
  7. 考研英语 长难句训练day77
  8. (PC+WAP)蓝色玻璃纤维制品网站pbootcms模板 营销型环保设备网站源码下载
  9. 买台服务器当家用电脑是种什么体验?那酸爽用过才会懂
  10. MySQL-索引的分类(聚簇索引、二级索引、联合索引)