Linux log工具:交叉编译log4c及使用示例
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及使用示例相关推荐
- Linux log工具:编译安装log4cplus及使用示例
文章目录 1.(交叉)编译安装log4cplus 2.log4cplus各种使用情景 2.1 参考docs/examples.md示例 2.2 比较标准的使用方法(附SimpleLayout/Patt ...
- Linux远程批量工具mooon_ssh和mooon_upload使用示例
Linux远程批量工具mooon_ssh和mooon_upload使用示例.pdf 目录 目录 1 1. 前言 1 2. 批量执行命令工具:mooon_ssh 2 3. 批量上传文件工具:mooon_ ...
- 树莓派linux交叉编译libwebsocket及使用示例
文章目录 前言 一.libwebsockets是什么? 二.使用到的资源 三.编译 1. cmake 2. libwebsockets 四. 使用示例 做客户端 测试 前言 本文主要介绍libwebs ...
- linux交叉编译openssl,交叉编译openssl for linux arm-v5te-linux-gnueabi工具链
我遇到了同样的问题并写了一本关于如何交叉编译openssl for arm的手册 . 我希望本手册能给你一些想法: 这个过程非常简单 . 在本手册中,我们将给出一个在Ubuntu Linux系统中交叉 ...
- linux 开发工具集合
转自:http://blog.csdn.net/vidanet/article/details/6732744 软件集成开发环境(代码编辑.浏览.编译.调试) Emacs htt ...
- linux开发工具列表
软件集成开发环境(代码编辑.浏览.编译.调试) Emacs http://www.gnu.org/software/emacs/ Source-Navigator 5.2b2 ...
- Linux开发工具整理
对Linux 下的开发工具以及安装方法做下摘录. 以下文字都摘录于网络上的一篇文章,作者不详. 软件集成开发环境(代码编辑.浏览.编译.调试) Emacs http://www.g ...
- conan入门(五):conan 交叉编译引用第三方库示例
conan 交叉编译引用第三方库示例 Conan 是 C 和 C++ 语言的依赖项和包管理器.它是免费和开源的,适用于所有平台(Windows.Linux.OSX.FreeBSD.Solaris 等) ...
- Linux开发工具的使用
1. Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用 1. Linux开发工具的使用 V ...
最新文章
- TCP和UDP DNS DHCP OSPF的五种包:
- Http压测工具wrk使用指南【转】
- leetcode18
- sybase数据库导出mysql_sybase导出数据库的表结构命令
- 数据表列名与数据库关键字冲突,在Hibernate下的解决办法
- IS服务器下做301永久重定向设置方法
- mac phpstorm调试php,MAC下phpstorm20190302+Xdebug2.7断点调试PHP | 朱斌技术博客
- WCF系列之.net(3.0/3.5)Rest使用示例
- C++中int *p[4]和 int (*q)[4]的区别
- python脚本 pyqt 打包成windows可执行exe文件 pyinstaller
- 安全测试3_Web后端知识学习
- Thinapp的昨天,今天和明天
- (二)Nginx安装与配置
- Silverlight 2.0 RTW 正式版发布(附下载地址)
- ISO12233:2014 eSFR分辨率测试卡使用方法
- Ubuntu搭建FTP服务器
- 如何使用命令提示符查找和打开文件
- soul显示服务器异常,soul账号状态异常是什么意思?soul账号异常操作多久解封
- Facebook想要成为下一个微信,难! 1
- 【css】 使用CSS去除 去掉超链接的下划线方法
热门文章
- 华为云发布CodeArts Req需求管理工具,让需求管理化繁为简
- java世界神奇“+”的学习
- 好用免费【易WiFi】易建联上网,不掉线
- MikroTik NAT日志记录
- php滑动解锁验证码,给WordPress加评论滑动解锁QapTcha验证
- 商业智能最佳解决方案--微软数据仓库 翻译
- 考研英语 长难句训练day77
- (PC+WAP)蓝色玻璃纤维制品网站pbootcms模板 营销型环保设备网站源码下载
- 买台服务器当家用电脑是种什么体验?那酸爽用过才会懂
- MySQL-索引的分类(聚簇索引、二级索引、联合索引)