- 浏览: 793997 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
一、安装
我看网上好多人介绍log4c安装的时候都说有两个步骤:先下载expat安装包并安装expat,然后下载log4c安装包并安装log4c。这么看
来,log4c是依赖expat的。但是有时候我们不想使用的日志系统还要依赖别的库,毕竟现在的开源日志系统很多,这样一来log4c就没有那么大的优
势了。所以我仔细看了log4c的README文档,发现log4c模块默认情况下是使用expat库来作为XML文件的解析器(因为log4c的配置文
件默认是一个叫log4crc的XML文件),我们可以在运行配置文件的时候加上--without-expat选项就可以不使用expat库而使用
log4c自定义的解析器,该解析器是使用lex/yacc的代码进行解析的。
安装步骤跟很多其他的库一样,都是三个步骤:
./configure
make
make install
我们可以在configure的时候加一些选项,如果要设置log4c的安装路径为/usr/local/log4c,我们就可以加--prefix=
/usr/local/log4c,如果不想依赖expat解析器,我们可以加--without-expat。如果我们要指定软件运行的系统平台,交叉
环境下,我们可以用--host选项来设置,如果运行在arm平台下就加--host=arm-linux,如果是运行在mips平台下就加
--host=mips-linux。
如果安装完的时候出现了以下错误,不要着急:
../../src/log4c/.libs/liblog4c.so: undefined reference to `rpl_malloc'
../../src/log4c/.libs/liblog4c.so: undefined reference to `rpl_realloc'
解决方法如下:
修改log4c_build/log4c-1.2.1/src/config.h.in文件:
将201行的#undef malloc注释掉。
将204行的#undef realloc注释掉。
然后执行以下命令:
./configure(同样有必要的情况下加上相应的选项)
make clean
make
make install
二、介绍一下log4c的配置文件log4crc
log4c中有三个重要的概念, category, appender, layout。
category(类型)用于区分不同的logger, 其实它就是个logger。在一个程序中我们可以通过category来指定很多的logger,用于不同的目的。
appdender用于描述输出流,通过为category来指定一个appdender,可以决定将log信息来输出到什么地方去,比如stdout,
stderr, 文件,
或者是socket等等。说说常见的两种,stdout是输出到控制台,文件当然就是输出到文件咯,在log4c中默认的是使用轮询文件保存日志,假如我
们设定的文件名为wlanLog(配置文件中是appender节点的prefix属性),文件的maxsize设置为102400(Bytes),文件
的maxnum为10(文件的最多个数),那么日志会保存在wlanLog.0文件中,当该文件的大小达到102400Bytes是就会自动保存到
wlanLog.1文件中,依次类推,当文件的个数达到maxnum且文件已满,接下来会自动保存到wlanLog.0文件中,这样循环保存的方式就是轮
询。
layout用于指定日志信息的格式,通过为appender来指定一个layout,可以决定log信息以何种格式来输出,比如是否有带有时间戳,
是否包含文件位置信息等,以及他们在一条log信息中的输出格式的等,一般有basic和dated两种。大家感兴趣可以分别去试一下看看日志有什么区
别。
最后,说一下log4crc文件放在项目工程生成的目标文件的那个目录下。
三、使用
// 初始化 log4c_init(); // 获取一个已有的category,这个category(此处为WLAN_Console)必须先配置到配置文件中。 log4c_category_t * mycat = log4c_category_get( " WLAN_Console " ); // 用该category进行日志输出,日志的类型为DEBUG,输出信息为 "Hello World!", log4c_category_log(mycat, LOG4C_PRIORITY_DEBUG, " Hello World! " ); // 去初始化 log4c_fini();
log4c_category_log的原型为:
log4c_category_log的原型为: static LOG4C_INLINE void log4c_category_log( const log4c_category_t * a_category, int a_priority, const char * a_format, ...)
其中后面的日志输出的格式化字符串a_format跟printf的输出格式化字符串一样,后面的参量表也和printf一样。非常方便!
log4c的日志优先级有11个,在src/log4c/目录下的priority.h中。我们常用的也就error、warn、info、debug和trace。
/* * * Predefined Levels of priorities. These correspond to the priority levels * used by syslog(3). * */ 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;
有时候为了方便,我们可以将log4c_category_log用宏定义封装起来,这个网上有例子,我给个链接
吧:http://www.cnblogs.com/jyli/archive/2010/02/11/1660606.html。我们也可以用一个函数
封装起来,这个网上我没找到,我就把我作的封装分享一下吧,因为这个牵扯到变参函数的参数传递,所以可能好多刚接触到变参函数的童鞋不是很清楚。
/* ********************************************************************* 函数名称 : logOut 创建日期 : 2011-12-27 作者 : 丶小小小威 函数描述 : 将日志输出到控制台 输入参数 : const LOG_LEVEL level : 日志输出的级别 const char *format : 日志输出的格式化字符串 输出参数 : 无 返回值 : 无 ********************************************************************* */ void CLogger::logOut( const LOG_LEVEL level, const char * format, ...) { char temp[MAX_LEN] = { 0 }; int ret = 0 ; va_list ap; va_start(ap, format); ret = vsnprintf(temp, MAX_LEN, format, ap); assert(( - 1 < ret) && (MAX_LEN > ret)); switch (m_logMode) { case TO_CONSOLE_AND_FILE: // 既输出到控制台又输出到文件 { if (m_consoleCategory && m_fileCategory) { log4c_category_log(m_consoleCategory, level, " %s " , temp); log4c_category_log(m_fileCategory, level, " %s " , temp); } break ; } case TO_CONSOLE: // 输出到控制台 { log4c_category_log(m_consoleCategory, level, " %s " , temp); break ; } case TO_FILE: // 输出到文件 { log4c_category_log(m_fileCategory, level, " %s " , temp); break ; } default : break ; } va_end(ap); } 说明:我这里的LOG_LEVEL是我自己定义的一个枚举类型,成员为常用的几种日志类型(或者说优先级),m_logMode是我Log模块封装类的一个成员变量,表示日志输出的方式,上面的三种。我想这个我就不用多说了吧,你懂的, = = ! 下面调用的时候也很简单: char c = ' \x41 ' ; char s[ 20 ]; const char * p = " How do you do " ; int a = 1234 ; int ha = 12 ; int * i; i = & ha; float f = 3.141592653589 ; double x = 0.12345678987654321 ; strcpy(s, " Hello, Comrade " ); logger -> logOut(ERROR, " a=%d " , a); /* 结果输出十进制整数a=1234 */ printf( " ===============================> a=%d\n\n " , a); logger -> logOut(ERROR, " a=%6d " , a); /* 结果输出6位十进制整数a= 1234 */ printf( " ===============================> a=%6d\n\n " , a); logger -> logOut(ERROR, " a=%06d " , a); /* 结果输出6位十进制整数a=001234 */ printf( " ===============================> a=%06d\n\n " , a); logger -> logOut(ERROR, " a=%2d " , a); /* a超过2位,按实际值输出a=1234 */ printf( " ===============================> a=%2d\n\n " , a); logger -> logOut(ERROR, " *i=%4d " , * i); /* 输出4位十进制整数×i= 12 */ printf( " ===============================> *i=%4d\n\n " , * i); logger -> logOut(ERROR, " *i=%-4d " , * i); /* 输出左对齐4位十进制整数×i=12 */ printf( " ===============================> *i=%-4d\n\n " , * i); logger -> logOut(ERROR, " i=%p " , i); /* 输出地址i=0xbf96538c */ printf( " ===============================> i=%p\n\n " , i); logger -> logOut(ERROR, " f=%f " , f); /* 输出浮点数f=3.141593 */ printf( " ===============================> f=%f\n\n " , f); logger -> logOut(ERROR, " f=6.4f " , f); /* 输出6位其中小数点后4位的浮点数 f=3.1416 */ printf( " ===============================> f=6.4f\n " , f); logger -> logOut(ERROR, " x=%lf " , x); /* 输出长浮点数x=0.123457 */ printf( " ===============================> x=%lf\n\n " , x); logger -> logOut(ERROR, " x=%18.16lf " , x); /* 输出18位其中小数点后16位的长浮点数 x=0.1234567898765432 */ printf( " ===============================> x=%18.16lf\n\n " , x); logger -> logOut(ERROR, " c=%c " , c); /* 输出字符c=A */ printf( " ===============================> c=%c\n\n " , c); logger -> logOut(ERROR, " c=%x " , c); /* 输出字符ASCII码值c=41 */ printf( " ===============================> c=%x\n\n " , c); logger -> logOut(ERROR, " s[]=%s " , s); /* 输出数组字符串s[]=Hello, Comrade */ printf( " ===============================> s[]=%s\n\n " , s); logger -> logOut(ERROR, " s[]=%6.9s " , s); /* 输出最多9个字符的字符串s[]=Hello, Co */ printf( " ===============================> s[]=%6.9s\n\n " , s); logger -> logOut(ERROR, " s=%p " , s); /* 输出数组字符串首字符地址s=FFBE */ printf( " ===============================> s=%p\n\n " , s); logger -> logOut(ERROR, " *p=%s " , p); /* 输出指针字符串p=How do you do */ printf( " ===============================> *p=%s\n\n " , p); logger -> logOut(ERROR, " p=%p " , p); /* 输出指针的值p=0x8049a70 */ printf( " ===============================> p=%p\n\n " , p);
说明:logger是我写的日志封装类的一个对象,大家可以把上面的部分代码加到自己的程序中,看看输出结果和printf到底是不是一样?我测试过,完
全一样,这样一看,使用log4c日志模块更让人一目了然,尤其是在一个比较大的项目中,有一个好的日志模块将是非常重要的!差点忘了还有个编译运行。
四、编译运行
编译的时候要链接上库和头文件。编译的格式如下:
mips-linux-g++ -I /usr/local/include/ -I /usr/local/include/libxml2/
logger.cpp main.cpp -o capture -L /usr/local/lib/ -lstdc++ -llog4c
-lxml2
说明:我用的是mips,所以编译时使用mips-linux-g++,我的log4c安装默认的路径下:/usr/local。这里用到的
libxml2是因为我涉及修改log4c的配置文件log4crc,是一个XML文件,我选择libxml2。在mips上运行的时候要先告诉mips
库所在的位置,使用export LD_LIBRARY_PATH=“库所在的位置”,建议大家写个Makefile。
五、log4crc文件
<? xml version="1.0" encoding="utf-8" ?> <! DOCTYPE log4c SYSTEM "" > < log4c version ="1.2.1" > < config > < bufsize > 0 </ bufsize > < debug level ="2" /> < nocleanup > 0 </ nocleanup > < reread > 1 </ reread > </ config > < category name ="root" priority ="notice" /> < category name ="six13log.log" priority ="error" appender ="stdout" /> <!-- 输出到控制台 --> < category name ="WLAN_Console" priority ="trace" appender ="stdout" /> <!-- 保存日志到文件 --> < category name ="WLAN_File" priority ="trace" appender ="myrollingfileappender" /> <!-- logdir为日志输出路径 prefix为文件名 layout为输出格式 --> < appender name ="myrollingfileappender" type ="rollingfile" logdir ="." prefix ="wlan_log" layout ="dated" rollingpolicy ="myrollingpolicy" /> <!-- sizewin表示达到最大值后新建日志文件 值由maxsize设定,单位Bytes maxnum为最大文件数目 --> < rollingpolicy name ="myrollingpolicy" type ="sizewin" maxsize ="102400" maxnum ="10" /> < appender name ="stdout" type ="stream" layout ="basic" /> < appender name ="stderr" type ="stream" layout ="dated" /> < appender name ="syslog" type ="syslog" layout ="basic" /> < appender name ="s13file" type ="s13_file" layout ="basic" /> < appender name ="plain_stderr" type ="s13_stderr" layout ="none" /> < appender name ="cat_stderr" type ="s13_stderr" layout ="catlayout" /> < appender name ="xml_stderr" type ="s13_stderr" layout ="xmllayout" /> < appender name ="user_stderr" type ="s13_stderr" layout ="userlayout" /> < layout name ="basic" type ="basic" /> < layout name ="dated" type ="dated" /> < layout name ="catlayout" type ="s13_cat" /> < layout name ="xmllayout" type ="s13_xml" /> < layout name ="none" type ="s13_none" /> < layout name ="userlayout" type ="s13_userloc" /> < category name ="six13log.log.app.application2" priority ="debug" appender ="cat_stderr" /> < category name ="six13log.log.app.application3" priority ="debug" appender ="user_stderr" /> < category name ="six13log.log.app" priority ="debug" appender ="myrollingfileappender" /> < category name ="log4c.examples.helloworld" priority ="debug" appender ="stdout" /> </ log4c >
发表评论
-
c++ cin输入int的用法
2014-06-10 11:17 1353int icin = 0; for(int i =0; ... -
Linux下case报错syntax error near unexpected token `in
2014-05-20 16:16 1105来分享一个在Linux下执 ... -
查看linux某目录下所有普通文件,不含目录
2014-05-14 15:15 0#include <fstream>#i ... -
scp sz
2014-03-31 18:15 0使用的是secureCRT 那么先拷贝到这台服务器上,再下 ... -
Linux可执行文件执行时找不到共享库
2014-03-31 18:09 2261编译程序时使用了如下参数指定了链接库的位置,但是执 ... -
C++ assert机制
2014-03-06 10:21 925C++ assert机制 ASSERT ... -
为什么C++语言中既有指针也有引用
2013-11-19 11:16 0写在前面的话,本文是 ... -
C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
2013-11-19 10:20 806栈,就是那些由编译器 ... -
堆内存和栈内存
2013-11-19 10:13 0堆内存就是你用new 修饰符创建的内容会在堆内存中开辟一段空 ... -
C++使用CLI连接DB2
2013-11-15 09:31 3374<!--推荐博文--> ... -
使用 C++ 处理 JSON 数据交换格式
2013-09-10 11:10 909一、摘要 JSON 的全称为:JavaScript Obj ... -
C++的Json解析库:jsoncpp和boost (转)
2013-09-10 10:40 6624JSON(JavaScript Object Notatio ... -
C++ JsonCpp 使用(转)
2013-09-10 10:21 1778前言 JSON是一个轻量级 ... -
C++中map容器的说明和使用技巧(转)
2013-08-22 15:01 1031C++中map容器提供一个键值对容器,map与multim ... -
C++中各种类型的成员变量的初始化方法(转)
2013-08-01 15:26 1018c++各种不同类型成员根据是否static 、时候con ... -
Xerces浅析
2013-07-30 14:15 3139本篇文章主要讲述项目 ... -
Xerces C++ 学习笔记 (转)
2013-07-24 17:04 13191. 初始化平台: XMLPlatformUtils: ... -
Boost智能指针——shared_ptr (转)
2013-07-16 17:27 1783boost::scoped_ptr虽然简单易用,但它不能共享 ... -
GDB调试精粹及使用实例 (转)
2013-07-16 16:21 1071一:列文件清单1. List( ... -
Xerces-C++学习之——查询修改XML文档 (转)
2013-07-16 16:02 3343/** ========================== ...
相关推荐
**如何使用log4c日志库:测试例子程序** 在软件开发中,日志记录是一项至关重要的任务,它有助于调试、性能分析以及问题排查。log4c是一个针对C语言的开源日志库,模仿了Java的log4j设计,提供了一个灵活且功能强大...
log4c 是一个基于 C 语言的日志记录框架,它借鉴了 Java 中的 log4j 设计理念,旨在为 C 语言开发者提供一个功能强大、灵活且易于使用的日志系统。这个压缩包包含了 log4c 的一个完整实例,适合初学者学习和参考。 ...
Log4C使用expat作为XML解析器来处理配置文件。因此,在构建Log4C之前,需要先安装expat库。这通常可以通过包管理器完成,例如在Linux上使用`apt-get install libexpat-dev`命令进行安装。 ##### 3.2 在企业环境中...
《log4c-1.2.1:C语言编写的高效日志库》 在软件开发过程中,日志记录是一项至关重要的任务,它能够帮助开发者追踪程序运行状态,...熟练掌握和使用log4c,不仅可以提升开发效率,还能为项目的稳定运行提供有力保障。
log4c的源代码。log4c是用C语言编写的日志工具,借鉴了log4j的思想,可以自由配置日志的输出格式、输出文件等,是一个很方便的程序调试、运行追踪工具。还有一个C语言的日志工具是ZLog,与这个有些像。
- **Mac OS 系统**:在 Mac OS 上构建 Log4C 可以使用 Xcode 或者其他工具链。 ##### 3.2.3 不同平台上的打包 - **Unix/Linux**:可以使用 tar 或 gzip 创建归档文件。 - **Windows**:可以使用 ZIP 或 RAR 等格式...
3. **使用说明文档**:为了帮助用户更好地理解和使用新功能,log4c-2.0.1提供了详细的使用说明文档。这份文档会解释如何利用Cache模块以及内嵌配置文件功能,确保开发者能够充分利用这些改进,优化他们的日志管理...
Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用
Log4c is a library of C for flexible logging to files, syslog and other destinations. It is modeled after the Log for Java library (http://jakarta.apache.org/log4j/), .
标题"Log4c压缩包"指的是一个包含Log4c库的压缩文件,Log4c是Linux环境下广泛使用的日志记录框架。它借鉴了Java世界的Log4j设计模式,为C语言提供了强大的日志处理功能。描述中提到Log4c在开发时作为写日志的工具...
《深入解析log4c——基于源码的剖析》 在软件开发中,日志记录扮演着至关重要的角色,它能够帮助开发者追踪程序运行状态、定位问题所在,甚至为系统性能优化提供依据。log4c是C语言实现的一个日志记录框架,类似于...
【简易版log4C#】是一个专门为C#开发者设计的日志记录工具,它的核心目标是提供一个简单易用、功能实用的日志管理方案。在这个简易版本中,它着重于按月生成日志文件,便于开发者追踪和分析程序运行时的问题。这种...
在原来的log4c-1.2.1的基础上重新架构优化,实现日志的配置式管理,内含使用说明文档......
本项目关注的是如何使用C++中的DataFrame库对接MySQL数据库,并结合log4c++进行日志记录,提升开发效率和代码可维护性。下面将详细阐述相关知识点。 首先,`DataFrame`是一个类似于Python中的pandas DataFrame的...
4. **文档**:关于如何移植和使用 log4c on VxWorks 的说明文档,可能包括安装指南、API 文档等。 5. **Makefile**:构建脚本,用于在 VxWorks 环境下编译和链接 log4c。 6. **测试**:可能包含用于验证移植正确性的...
多线程和多进程写同一个日志的情况下,安全转档(转档就是把太大的日志重命名) 可以精确到微秒 如果一个程序默认只用一个分类输出,zlog提供了简单的调用包装dzlog MDC,一个log4j风格的键-值对的表,可以扩展用户...
在提供的压缩包文件中,"MFC使用log4cpp"和"MFC╩╣╙├log4cpp"可能包含更具体的示例代码或者项目的实现,读者可以通过查看这些文件进一步了解如何在实际项目中整合和使用log4cpp。 总之,log4cpp为C++开发者提供...
在实际应用中,你可能需要以下步骤来使用这个Log4Cplus 开发包: 1. 添加库文件路径到项目的链接器设置。 2. 包含Log4Cplus 头文件,如`#include <log4cplus/logger.h>`。 3. 初始化Log4Cplus 系统,通常在应用程序...
《日志系统log4cxx的安装与使用详解》 日志系统在软件开发中起着至关重要的作用,它能够帮助开发者追踪程序运行状态,定位错误,优化性能。Apache的log4cxx是C++环境中广泛使用的一个高效日志系统,具备跨平台特性...