Apache log4cxx在C++多进程多线程下的使用

合集下载

Linux下log4cxx的安装使用

Linux下log4cxx的安装使用

Linux下log4cxx的安装使用2011-06-12 13:51:45分类: C/C++一、下载Log4cxx是开放源代码项目Apache Logging Service的子项目之一,用于为C++程序提供日志功能,以便开发者对目标程序进行调试和审计。

要使用log4cxx,首先要从官网下载,官网是/log4cxx/index.html,目前的最新版本是0.10.0,下载地址:/dyn/closer.cgi/logging/log4cxx/0.10.0/apache-lo g4cxx-0.10.0.tar.gz。

安装方式可以使用ant,也可以使用gcc编译安装,本文以gcc编译安装为主。

安装log4cxx需要apr支持,apr官网地址是:/,需要下载apr和apr_util两个组件。

二、安装步骤如下:1.cd ~/libstar xjvf apr-1.4.4.tar.bz2cd apr-1.4.4./configure --prefix=${HOME}/libs && make && make install2.cd ..tar xjvf apr-util-1.3.11.tar.bz2cd apr-util-1.3.11./configure --prefix=${HOME}/libs --with-apr=${HOME}/libs && make && make install3.cd ..tar xzvf apache-log4cxx-0.10.0.tar.gzcd apache-log4cxx-0.10.0./configure --with-charset=utf-8 --with-apr=${HOME}/libs--with-apr-util=${HOME}/libs && make && make install默认安装后会在/usr/local/include目录下包含log4cxx目录,该目录下就是log4cxx的相关头文件。

Log4cplus使用指南

Log4cplus使用指南

Log4cplus使用指南广目录1 LOG4CPLUS简介 (5)2 安装方法 (5)3 主要类说明 (6)4 基本使用 (6)4.1基本步骤 (6)4.2使用示例 (7)4.2.1 例1-标准使用 (7)4.2.2 例2-简洁使用 (8)4.2.3 例3-输出日志到控制台 (9)4.2.4 例4-输出日志到文件 (10)4.2.5 例5-使用loglog输出日志 (11)4.3日志输出宏 (13)5 输出格式控制 (14)5.1S IMPLE L AYOUT (14)5.2P A TTERN L AYOUT (15)5.2.1转换标识符 (15)5.3TTCCL AYOUT (17)6 输出重定向 (18)6.1重定向到控制台 (18)6.2重定向到文件 (19)6.2.1 FileAppender (19)6.2.2 RollingFileAppender (19)6.2.3 DailyRollingFileAppender (20)6.3重定向到远程服务器 (22)6.3.1 客户端程序需要做的工作 (22)6.3.2 服务器端程序需要做的工作 (22)6.3.3 例6-重定向到远程服务器 (23)6.4嵌入诊断上下文NDC (28)7 输出过滤 (30)7.1利用日志级别进行输出过滤 (30)7.1.1 日志级别管理 (30)7.1.2 利用日志级别进行输出过滤 (31)7.1.3 例7-日志的优先级 (31)7.1.4 例8-运行时利用日志级别进行输出过滤 (34)7.2利用脚本配置进行输出过滤 (37)7.3L OG L OG的输出过滤 (37)8 脚本配置 (37)8.1基本配置 (37)8.1.1根Logger的配置 (37)8.1.2非根Logger的配置 (37)8.2高级配置 (38)8.2.1 Appender配置 (38)8.2.2 Filter配置 (38)8.2.3 Layout配置 (39)8.3.3 例9-脚本配置 (39)8.3脚本配置的动态加载 (42)8.3.1 例10-使用线程监控脚本的更新 (42)9 定制LOG4CPLUS (44)9.1定制日志级别 (44)9.2定制L OG L OG (47)1 Log4cplus简介log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统,受Apache Software License保护,作者是Tad E. Smith。

c 多线程实现的四种方式

c 多线程实现的四种方式

c 多线程实现的四种方式C语言是一种非常流行的编程语言,它可以用来实现多线程编程。

多线程编程可以让你的程序更高效、更快速地运行,因为它可以同时执行多个任务。

在这篇文章中,我们将介绍 C 多线程实现的四种方式。

1. 使用 pthread 库pthread 是一个 POSIX 标准定义的多线程库,它提供了一套API 接口,可以用来实现多线程编程。

使用 pthread,你可以创建多个线程并且控制它们的行为。

这种方式是 C 语言实现多线程的最常用方式之一。

2. 使用 OpenMP 库OpenMP 是一个开源的多线程库,它可以用来在 C 语言中实现多线程编程。

OpenMP 提供了一套 API 接口,可以让你更方便地编写并行程序。

使用 OpenMP,你可以使用 #pragma 指令来控制并行执行的代码块。

3. 使用 POSIX 线程POSIX 线程是一种 POSIX 标准定义的多线程接口,它可以用来实现多线程编程。

与 pthread 类似,POSIX 线程提供了一套 API 接口,可以让你更方便地编写多线程程序。

4. 使用 Windows 线程如果你在 Windows 操作系统上编写 C 语言程序,你可以使用Windows 线程来实现多线程编程。

Windows 线程提供了一套 API 接口,可以让你在 Windows 平台上创建多个线程并且控制它们的行为。

总结以上是 C 多线程实现的四种方式。

在选择使用哪种方式时,你应该考虑自己的需求和使用的操作系统。

不同的方式会有不同的 API 接口、性能和可移植性。

如果你需要了解更多关于 C 多线程编程的知识,可以参考相关的书籍和教程。

C语言并发编程多线程和多进程的应用

C语言并发编程多线程和多进程的应用

C语言并发编程多线程和多进程的应用C语言是一门广泛应用于系统级开发的编程语言,它具备高性能和低级别的特点,常用于操作系统、设备驱动和嵌入式系统的开发。

在实际应用中,多线程和多进程是C语言并发编程的两个重要概念和技术,它们可以提高程序的性能和响应能力。

本文将介绍C语言中多线程和多进程的应用,并探讨它们在不同场景中的优劣和适用性。

一、多线程的应用1. 线程概念及优势多线程是指在一个进程内创建多个并行执行的线程,每个线程可以独立执行不同的任务。

相比单线程程序,多线程程序具有以下优势:- 提高程序的性能:多线程能够将任务拆分为多个子任务,并在多个线程上同时执行,从而减少程序的执行时间。

- 增加程序的响应能力:通过将阻塞操作放在单独的线程中执行,可以避免主线程的阻塞,提高程序的响应速度。

- 使程序结构更清晰:多线程可以提升程序的模块化和可维护性,将不同的功能模块独立封装在不同的线程中,易于理解和扩展。

2. 多线程的创建和同步在C语言中,可以使用标准的线程库如pthread来创建和管理线程。

创建线程的步骤包括线程的初始化、启动和等待线程的结束。

多线程之间的同步可以通过互斥锁、条件变量和信号量等机制来实现。

互斥锁用于保护共享资源的访问,条件变量用于线程之间的通信,信号量则可以用于限制并发访问的数量。

3. 多线程的应用场景多线程适用于以下场景:- 超过单个核心能力的计算任务:通过将任务分解为多个子任务,可以在多个核心上并行执行,提高计算任务的执行效率。

- 服务器应用:通过多线程可以提高服务器的并发处理能力,同时处理多个客户端请求。

- 图形界面程序:通过将耗时操作放在后台线程执行,可以提高界面的流畅性和响应速度。

二、多进程的应用1. 进程概念及优势进程是指一个程序的执行实例,它拥有独立的地址空间和资源。

多进程是指在操作系统中同时运行多个独立的进程,每个进程可以执行不同的任务。

多进程编程的优势包括:- 提高系统的稳定性:通过将不同的任务独立在多个进程中执行,可以避免一个进程的崩溃导致整个系统的崩溃。

linux下的CC++多进程多线程编程实例详解

linux下的CC++多进程多线程编程实例详解

linux下的CC++多进程多线程编程实例详解linux下的C\C++多进程多线程编程实例详解1、多进程编程#include <stdlib.h>#include <sys/types.h>#include <unistd.h>int main(){pid_t child_pid;/* 创建⼀个⼦进程 */child_pid = fork();if(child_pid == 0){printf("child pid\n");exit(0);}else{printf("father pid\n");sleep(60);}return 0;}2、多线程编程#include <stdio.h>#include <pthread.h>struct char_print_params{char character;int count;};void *char_print(void *parameters){struct char_print_params *p = (struct char_print_params *)parameters;int i;for(i = 0; i < p->count; i++){fputc(p->character,stderr);}return NULL;}int main(){pthread_t thread1_id;pthread_t thread2_id;struct char_print_params thread1_args;struct char_print_params thread2_args;thread1_args.character = 'x';thread1_args.count = 3000;pthread_create(&thread1_id, NULL, &char_print, &thread1_args);thread2_args.character = 'o';thread2_args.count = 2000;pthread_create(&thread2_id, NULL, &char_print, &thread2_args);pthread_join(thread1_id, NULL);pthread_join(thread2_id, NULL);return 0;}3、线程同步与互斥1)、互斥pthread_mutex_t mutex;pthread_mutex_init(&mutex, NULL);/*也可以⽤下⾯的⽅式初始化*/pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex);/* 互斥 */thread_flag = value;pthread_mutex_unlock(&mutex);2)、条件变量int thread_flag = 0;pthread_mutex_t mutex;pthread_cond_t thread_flag_cv;\void init_flag(){pthread_mutex_init(&mutex, NULL);pthread_cond_init(&thread_flag_cv, NULL);thread_flag = 0;}void *thread_function(void *thread_flag){while(1){pthread_mutex_lock(&mutex);while(thread_flag != 0 ){pthread_cond_wait(&thread_flag_cv, &mutex);}pthread_mutex_unlock(&mutex);do_work();}return NULL;}void set_thread_flag(int flag_value){pthread_mutex_lock(&mutex);thread_flag = flag_value;pthread_cond_signal(&thread_flag_cv);pthread_mutex_unlock(&mutex);}感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。

浅谈C++日志系统log4cxx的使用小结详解

浅谈C++日志系统log4cxx的使用小结详解

浅谈C++⽇志系统log4cxx的使⽤⼩结详解本⽂主要从log4cxx级别、layout、格式化、命名规则、Filter⼏个⽅⾯介绍。

Logger由⼀个String类的名字识别,logger的名字是⼤⼩写敏感的,且名字之间具有继承的关系,⼦名有⽗名作为前缀,⽤点号.分隔。

如:x.y是x.y.z的⽗亲。

根logger (root logger)是所有logger的祖先,它具有如下属性:1) 它总是存在的;2) 它不可以通过名字获得。

通过调⽤public static Logger Logger.getRootLogger()获得root logger;通过调⽤public static Logger Logger.getLogger(String name)或者public static Logger Logger.getLogger(Class clazz)获得或者创建)⼀个named logger。

后者相当于调⽤Logger.getLogger(clazz.getName())。

在某对象中,⽤该对象所属的类为参数,调⽤Logger.getLogger(Class clazz)以获得logger被认为是⽬前所知的最理智的命名logger的⽅法。

每个logger都被分配了⼀个⽇志级别 (log level),⽤来控制⽇志信息的输出。

未被分配level的 logger将继承它最近的⽗logger 的level。

每条输出到logger的⽇志请求(logging request)也都有⼀个 level,如果该request的level⼤于等于该logger的level,则该request将被处理(称为enabled);否则该 request将被忽略。

故可得知:1、logger的level越低,表⽰该logger越详细2、logging request的 level越⾼,表⽰该logging request越优先输出 3、如果没有设置⽇志记录器(Logger)的级别,那么它将会继承最近的祖先的级别。

Log4C使用总结

Log4C使用总结

Log4C使用总结Log4c使用方法1 Log4c必要文件liblog4c.a 静态库文件log4c.h 日志函数log4c/*.h 其它要包含的文件2 make前先将include文件cp到local目录(log4c使用<>进行的文件包含),makefile文件增加下列命令命令执行make cmd3 应用步骤●包含mylog.h,mylog对log4c进行了简单封装,使用LOG宏直接可以进行日志输出●Mylog只定义了一个Category,需要其它Category可以继续进行扩展●配置文件category name与代码中#define MYLOG_CATEGORY_NAME "log4ctest"对应●配置文件category与appender对应关系,appender与layout关系,如下,文件输出时rollingpolicy时type=”sizewin”表示日志文件按照大小输出,maxsize表示设置一个文件的最大字节,maxnum表示日志文件最大个数文件输出时rollingpolicy增加type=”timewin”类别,表示按照日期输出,timetype表示日期格式(”0”:表示按小时,”1”:表示按日,”2”:表示按照月,”3”:表示按年)。

配置文件category中priority指定最低显示日志的级别,log4c定义级别如下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;相关资料1 源代码及测试程序附件log4c-1.2.3.tar.gz为源代码附件log4ctest.rar为测试程序2 安装步骤#./configure --prefix=/usr/local#make #make install安装成功会在/usr/local/lib下看到liblog4c.*(五个文件)注意:将/usr/local/li b/liblo g4c.* copy到/usr/lib3 配置说明3.1 Log4c基本概念Log4c中有三个重要的概念, Category, Appender, Layout。

Linux下编译安装log4cxx

Linux下编译安装log4cxx

Linux下编译安装log4cxx⼀个项⽬的服务器端在Linux平台下,⽤到了开源⽇志库log4cxx,这个库是apache项⽬的⼀个⼦库。

功能很不错。

下⾯记录下它的编译和安装过程。

第⼀步安装apr-1.3.8,顺序不能错,它必须⾸选安装$tar zxvf apr-1.3.8.tar.gz$cd apr-1.3.8$./configure --prefix=/usr/local$make$su root$make install然后安装apr-util-1.3.9$tar zxvf apr-util-1.3.9.tar.gz$cd apr-util-1.3.9$./configure --prefix=/usr/local --with-apr=/usr/local/apr$make$su root$make installconfigure选项 --with-apr=/usr/local/apr指定apr库的位置最后就可以安装log4cxx了$tar zxvf apache-log4cxx-0.10.0.tar.gz$cd apache-log4cxx-0.10.0$configure --prefix==/usr/local$make$su root$make install因为编译成的是共享库,最后还要设置下搜索⽬录,编辑~/.bashrc,添加下⾯两⾏LD_LIBRARY_PATH=/usr/local/libexport LD_LIBRARY_PATHOK,⾄此log4cxx就安装完毕了。

最后写个程序,测试下。

#include <log4cxx/logger.h>#include <log4cxx/logstring.h>#include <log4cxx/propertyconfigurator.h>int main(int argc, char* argv[]){using namespace log4cxx;// 读取配置⽂件PropertyConfigurator::configure("log4cxx.cfg");// 建⽴两个loggerLoggerPtr logger1 = Logger::getLogger("TraceYourMama");LoggerPtr logger2 = Logger::getLogger("Patch");LOG4CXX_TRACE(logger1, "跟踪");LOG4CXX_WARN(logger1, "警告");LOG4CXX_DEBUG(logger1, "调试");LOG4CXX_ASSERT(logger1, false, "断⾔"); LOG4CXX_FATAL(logger1, "致命");LOG4CXX_TRACE(logger2, "跟踪");LOG4CXX_ERROR(logger2, "错误");return 0;}编译链接$g++ -o main main.cpp -llog4cxxOK,打完⼿⼯。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Apache log4cxx在C++多进程多线程下的使用1、Apache log4cxx介绍Apache log4cxx是Apache Logging Services三个日志记录项目之一,完全开源组件。

是著名的日志记录组件log4j的c++移植版,用于为C++程序提供日志功能,以便开发者对目标程序进行调试和审计。

当前的最新版本为0.10.0。

2、Apache log4cxx 框架组成Apache Log4cxx有三个关键组件,它们是loggers, appenders和layouts。

执行日志操作Logger是log4cxx的核心类。

looger有层次结构,最顶层为RootLogger;logger是分七个级别,分别是debug、info、warn、error、fatal、all、off,最常用的应该是debug()和info();而warn()、error()、fatal()仅在相应事件发生后才使用。

每个logger可以附加多个Appender。

Appender代表了日志输出的目标,如输出到文件、控制台,数据库等等。

对于每一种appender,都可以通过layout进行格式设置,根据自己需求定制不同日志内容。

使用中用到的类有BasicConfigurator、PropertyConfigurator、DOMConfigurator等,用于对log4cxx进行配置。

其中BasicConfigurator提供了一种简单配置,包括使用ConsoleAppder作为root appender和PatternLayout 作为缺省布局,PropertyConfigurator使用properties文件作为配置方式,DOMConfigurator则使用properties文件作为配置方式,具体配置文档信息请查阅相关资料。

3、多进程多线程使用设计Apache Log4cxx 提供的常用供日志调用方法,logger->info(),logger->debug(),logger->warn(),logger->error(),与上述方法类似的还有相应的宏调用LOG4CXX_DEBUG()、LOG4CXX_INFO()、LOG4CXX_WARN()、LOG4CXX_ERROR()。

每个方法与宏的参数要求是全字符串类型,对于不同的日志信息相应调用不同的日志记录方法,即可得到不同级别、不同类型的日志信息。

配置文件的设置Apache Log4cxx提供static void configure(helpers::Properties& properties)函数,参数中传入配置文件的绝对路径或是相对路径、文件名,日志文件名称 Apache Log4cxx 提供static LoggerPtr getLogger(const std::wstring& name);参数中传入日志文件名,用日志文件名称实例化LoggerPtr对象LoggerPtr logger(Logger::getLogger(trace)),即可用通过logger对象调用相应类型日志方法,宏调用也在实例化日志对象后才能对设置信息有作用大家看到了,方法参数要求是一个字符串类型,不便于C++记录日志,也不习惯于C++程序员使用。

配置文件与日志文件名设备,都用到了静态方法,多线程共用一个日志对象,每个线程一个日志文件,上述静态方法是不能满足这个需求的,多个进程里面不用的线程调用此方法,每个线程一个日志文件,就更不能满足需求,所以我们必须自己设计一种结构来封装Apache Log4cxx提供的方法,满足多进程多线程下,一个线程一个日志文件的需求。

设计一种方便的参数传入模式,使C++程序员能方便使用日志组件提供方法。

我的设计模型如下,用动态库封装日志方法,不同进程、不同线程实例化一个动态库对象,便能解决多进程,多线程生成不同文件问题,用类似sprintf()格式化参数,封装日志方法参数,当然也可以用特定格式来规定日志输出,便能解决方便操作问题,实例化封装类对象,为了不再引入Apache Log4cxx头文件信息,我提供两个额外的创建实例,销毁实例方法,这样一个完美的日志服务组件就做成了,下面我们来实现这个设想。

4、多进程多线程使用实现4.1在microsoft Visual C++ 6.0 IDE 上新建一个Win32 Dynamic-Link Library 工程,命名为Trace,选择A simple Dll project,点击Finish一个简单的动态连接库工程就建好了。

4.2 在StdAfx.h文件中包函调用Apache Log4cxx的头文件#include "logger.h"#include "PropertyConfigurator.h"using namespace std;using namespace log4cxx;相应的头文件,动态连接库,静态连接库,部分参考文档,请到Apache Log4cxx 官方网址/下载,官方网址只提供工程文件,相应的动态连接库,静态连接库,需求自己编译得到,具体的编译方法请查阅相关文档。

4.3在工程Trace中新增加一个基础类,命名为CBase用于实现Apache Log4cxx 的配置信息,格式化日志文件的输出信息等作用。

Base .h:#define LOGNAMELNET 100\class CBase{public:CBase(char * PropertyPath,char * TraceName);~CBase();public://格式化日志三角输出框void f_foursquare_sign(char * arg,char *dst);//格式化日志四角输出框void f_triangle_sign(char * arg,char *dst);public://日志对象LoggerPtr m_log;//日志文件名char f_c_logname[LOGNAMELNET];};Base .cpp:CBase::CBase(char * PropertyPath,char * TraceName){log4cxx::PropertyConfigurator::configure(PropertyPath);//configure filethis->m_log = Logger::getLogger(TraceName); //appender//保存日志名称memset(this->f_c_logname,0,sizeof(this->f_c_logname));strcpy(this->f_c_logname,TraceName);}CBase::~CBase(){}void CBase::f_triangle_sign(char * arg,char *dst){char c_str[100*2];memset(c_str,0,sizeof(c_str));strcat(c_str,"<");strcat(c_str,arg);strcat(c_str,">-");strcat(dst,c_str);}void CBase::f_foursquare_sign(char * arg,char *dst){char c_str[100*2];memset(c_str,0,sizeof(c_str));strcat(c_str,"[");strcat(c_str,arg);strcat(c_str,"]-");strcat(dst,c_str);}4.4 增加一个接口类CTraceImpl,向调用者提供接口,这个类只声明接口虚函数,可以直接在项目头文件中实现,额外的创建对象,销毁对象方法也在此声明,实现直接放在项目文件中。

Trace.h:#ifndef __TRACEIMPL__#define __TRACEIMPL__//动态库输出调用约定#define TRACEFUN __declspec(dllexport)class TRACEFUN CTraceImpl{public://重设日志文件名称virtual void ResetTraceName(char * TraceName) = 0;public://输出Debug日志virtual void DebugLog(char * CallName,int LogSign,char * StrMsg,...) = 0;//输出Info日志virtual void InfoLog (char * EventName,int LogSign,char * StrMsg,...) = 0;……};//创建实例TRACEFUN CTraceImpl * CreateTrace(char * PropertyPath = "./log4cxx.properties",char * TraceName = "defilename");//销毁实例TRACEFUN void DestroyTrace(CTraceImpl * pCTrace);#endif // #ifndef __TRACEIMPL__Trace.cpp://创建实例TRACEFUN CTraceImpl * CreateTrace(char * PropertyPath ,char * TraceName ) {//创建新对象return ( new CTrace(PropertyPath,TraceName) );}//销毁实例TRACEFUN void DestroyTrace(CTraceImpl * pCTrace){if (pCTrace){//销毁对象CTraceImpl* fp = (CTraceImpl *)pCTrace;delete fp;}}4.5 新增一个实现类CTrace,从CBase, CTraceImpl继承,实现日志方法的封装,参数的格式化:_Trace.h:class CTrace:public CBase,public CTraceImpl{public://默认配置文件名、日志文件名CTrace(char * PropertyPath ,char * TraceName );~CTrace();public://重设日志文件名称virtual void ResetTraceName(char * TraceName);public://输出Debug日志virtual void DebugLog(char * CallName,int LogSign,char * StrMsg,...);//输出Info日志virtual void InfoLog (char * Name,int LogSign,char * StrMsg,...);……};_Trace.cpp:#define MAXARRAYLEN 1024*2//日志标志#define FUN_BEGIN "BEGIN"#define FUN_END " END "//日志类型#define TYPE_LOG " THREAD "CTrace::CTrace(char * PropertyPath,char * TraceName):CABBase(PropertyPath,TraceName){}CTrace::~CTrace(){void CTrace::InfoLog(char * Name, int LogSign, char *StrMsg, ...) {char c_str[MAXARRAYLEN],c_join_str[MAXARRAYLEN];try{//设置日志文件名称this->m_log = Logger::getLogger(this->f_c_logname);memset(c_join_str,0,sizeof(c_join_str));memset(c_str,0,sizeof(c_str));//日志类型this->f_triangle_sign(TYPE_LOG,c_join_str);//调用方法this->f_foursquare_sign(Name,c_join_str);//日志标志if (LogSign > 0){this->f_triangle_sign(LogSign < 2?FUN_BEGIN:FUN_END,c_join_str);}//格式化参数va_list ap;va_start ( ap, StrMsg );vsprintf(c_str,StrMsg,ap);va_end ( ap );strcat(c_join_str,c_str);//打印日志this->m_log->info(c_join_str);}catch (...){//异常处理strcat(c_join_str,"Format parameter error!!!");this->m_log->info(c_join_str);}}void CTrace::DebugLog(char *CallName, int LogSign, char *StrMsg, ...) {char c_str[MAXARRAYLEN],c_join_str[MAXARRAYLEN];try{//设置日志文件名称this->m_log = Logger::getLogger(this->f_c_logname);memset(c_join_str,0,sizeof(c_join_str));memset(c_str,0,sizeof(c_str));//日志类型this->f_triangle_sign(TYPE_LOG,c_join_str);//调用方法this->f_foursquare_sign(CallName,c_join_str);if (LogSign > 0){this->f_triangle_sign(LogSign < 2?FUN_BEGIN:FUN_END,c_join_str);}//格式化参数va_list ap;va_start ( ap, StrMsg );vsprintf(c_str,StrMsg,ap);va_end ( ap );strcat(c_join_str,c_str);//打印日志this->m_log->debug(c_join_str);}catch (...){//异常处理strcat(c_join_str,"Format parameter error!!!");this->m_log->debug(c_join_str);}}void CTrace::ResetTraceName(char *TraceName){//设置日志名称strcpy(this->f_c_logname,TraceName);}这只实现了Info,debug接口函数,其它方法同理,同一方法也可以以不同的形式实现,对Apache Log4cxx 本实现调用的是成员方法,也可以用宏实现。

相关文档
最新文档