这几天开始封装日子,打算采用Log4cpp提供的日志功能来写日子。为了方便产品内的调用,提议做了一部分封装,将log4cpp的静态库 log4cpp.a 静态链接到我开发的logLibrary.so内并提供了C调用接口。

1.提供LogWrapper.h提供对外的long方法


 

#ifndef __FRAMEWORK_LOGWRAPPER_H__
#define __FRAMEWORK_LOGWRAPPER_H__
/******************************************************************************
 *  日志包装类用于调用log4cpp日志对象写入日志
 *
 *
 * 创建日期: 2011-06-28
 * 作者:     代红伟
 * 修改历史:
 * revision  日期  修改者  描述
 *
 *****************************************************************************/
#include "LogLibrary.h"
#include "LogUtils.h"
#ifdef _WIN32_OS
#pragma comment(lib,"log4cppD.lib")
__declspec(dllexport)
#endif
FRAMEWORK_LOGWRAPPER_NS_BEGIN
class LogWrapper
{
public:
  /**************************************************************************
  * 析构函数
  * 
  * 输入参数:   无。  
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
  ~LogWrapper(void); 
  
  
  /**************************************************************************
  * 构造函数
  * 
  * 输入参数:   moduleName 模块名称  
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
  LogWrapper(const char* moduleName);
  /**************************************************************************
  * 该方法用于输出Info级别的日志信息
  * 
  * 输入参数:   stringFormat 日志信息   
  * 输出参数: 无。
  * 返回值:  输出设施枚举
  *************************************************************************/
  void info(const char* stringFormat,...) ;   
  
  /**************************************************************************
  * 该方法用于输出Debug级别的日志信息
  * 
  * 输入参数:   func 函数名称
                    file 文件名称
     line 代码行
     errid 错误号
     msg 日志信息  
  * 输出参数: 无。
  * 返回值:  输出设施枚举
  *************************************************************************/
  void debug(const char* func,const char* file,const long line,int errorId,const char* stringFormat,...);
  
  /**************************************************************************
  * 该方法用于输出Debug级别的日志信息
  * 
  * 输入参数:   func 函数名称
                    file 文件名称
     line 代码行
     stringForamt 日志信息  
  * 输出参数: 无。
  * 返回值:  输出设施枚举
  *************************************************************************/
  void debug2(const char* func,const char* file,const long line,const char* stringFormat,...); 
  
  /**************************************************************************
  * 该方法用于输出Error级别的日志信息
  * 
  * 输入参数:   func 函数名称
                    file 文件名称
     line 代码行
     errorId 错误号
     stringForamt 日志信息   
  * 输出参数: 无。
  * 返回值:  输出设施枚举
  *************************************************************************/  
  void error(const char* func,const char* file,const long line,int errorId,const char* stringFormat,...); 
  
  /**************************************************************************
  * 该方法用于输出Error级别的日志信息
  * 
  * 输入参数:   func 函数名称
                    file 文件名称
     line 代码行
     stringForamt 日志信息   
  * 输出参数: 无。
  * 返回值:  输出设施枚举
  *************************************************************************/
  void error2(const char* func,const char* file,const long line,const char* stringFormat,...);
  
  /**************************************************************************
  * 该方法用于输出Fatal级别的日志信息
  * 
  * 输入参数:   func 函数名称
                    file 文件名称
     line 代码行
     errorId 错误号
     stringForamt 日志信息
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
  void fatal(const char* func,const char* file,const long line,int errorId,const char* stringFormat,...);
  
  /**************************************************************************
  * 该方法用于输出Fatal级别的日志信息
  * 
  * 输入参数:   func 函数名称
     *              file 文件名称
  *    line 代码行     
  *    stringForamt 日志信息   
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
  void fatal2(const char* func,const char* file,const long line,const char* stringFormat,...) ;  
  
  /**************************************************************************
  * 该方法用于获取当前日志的模块名称
  * 
  * 输入参数:   无。
  * 输出参数: 无。
  * 返回值:  模块名称
  *************************************************************************/
  inline std::string ModuleName() const 
  {
   return _moduleName;
  }
  
private:
 LogWrapper(const LogWrapper& other){};
 LogWrapper& operator= (const LogWrapper& other){ return *this; }; 
 std::string _moduleName;
 LogUtils logger; 
};
FRAMEWORK_LOGWRAPPER_NS_END
#endif /*__FRAMEWORK_LOGWRAPPER_H__*/
 
2.提供配置文件读取与log4cpp调用类LogUtils.h
#ifndef __FRAMEWORK_LOGWRAPPER_LOGUTILS_H__
#define __FRAMEWORK_LOGWRAPPER_LOGUTILS_H__
/******************************************************************************
 *  日志类的基础单元,用于读取配置文件执行配置的信息,并调用log4cpp安配置
 *  标准输出日志信息。
 *
 * 创建日期: 2011-06-28
 * 作者:     代红伟
 * 修改历史:
 * revision  日期  修改者  描述
 *
 *****************************************************************************/
#ifndef TYPELOG4CPP
#define TYPELOG4CPP
#endif
#include "LogLibrary.h"
#include "ConfigureException.h"
#include "LogProperties.h"
#if defined(TYPELOG4CPP)
// appenders
#include <log4cpp/Appender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/RollingFileAppender.hh>
#include <log4cpp/AbortAppender.hh>
#include <log4cpp/StringQueueAppender.hh>
#ifdef _WIN32_OS
#include <log4cpp/Win32DebugAppender.hh>
#include <log4cpp/NTEventLogAppender.hh>
#endif
#include <log4cpp/RemoteSyslogAppender.hh>
#ifdef LOG4CPP_HAVE_LIBIDSA
#include <log4cpp/IdsaAppender.hh>
#endif    // LOG4CPP_HAVE_LIBIDSA
#ifdef LOG4CPP_HAVE_SYSLOG
#include <log4cpp/SyslogAppender.hh>
#endif
// layouts
#include <log4cpp/Layout.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/SimpleLayout.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/Category.hh>
#endif
#define _MAXPATH 512
#define _MAXLENS 4096
FRAMEWORK_LOGWRAPPER_NS_BEGIN
class LogUtils
{
public:
/*日志输出的级别定义。*/
typedef enum level{
   FATAL  = 0,
   ALERT  = 100,
   CRIT   = 200,
   ERROR  = 300, 
   WARN   = 400,
   NOTICE = 500,
   INFO   = 600,
   DEBUG  = 700,
   NOTSET = 800
        
}LOGPRIORITY;

/*日志输出的方式定定义。*/
typedef enum output{
 FileAppender  = 1,        
 RollingFileAppender,      
 OstreamAppender,          
 StringQueueAppender,     
 Win32DebugAppender,       
 NTEventLogAppender,       
 SyslogAppender,     
 RemoteSyslogAppender 
}LOGAPPENDER;

/*日志输出的RemoteSysLog的输出设备定义。*/
typedef enum facility{
   LOGKERN = 0,
   LOGUSER = 8,
   LOGMAIL = 16,
   LOGDAEMON = 24,
   LOGAUTH = 32,
   LOGSYSLOG = 40,
   LOGLPR = 48,
   LOGNEWS = 56,
   LOGUUCP = 64,
   LOGCRON = 72,
   LOGAUTHPRIV = 80,
   LOGFTP = 88
}SyslogFacility;
public:
 /**************************************************************************
 * 构造函数。
 * 
 * 输入参数: 无。
 * 输出参数: 无。
 * 返回值:  无。
 *************************************************************************/
 LogUtils();
 /**************************************************************************
  * 析构函数。
  * 
  * 输入参数: 无。
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 virtual ~LogUtils();
 /**************************************************************************
  * 该方法用于根据配置文件信息配置log4cpp的分类以及布局信息。
  * 
  * 输入参数: moduleName 模块名称
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 void InitializeLog4Cpp(const char* moduleName);
 /**************************************************************************
  * 该方法用于释放log4cpp的调用对象。
  * 
  * 输入参数: moduleName 模块名称
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 void ReleaseLog4cpp(); 
 /**************************************************************************
  * 该方法用于生成日志信息前缀,包括函数名,文件名,代码行已经线程ID信息。
  * 
  * 输入参数: func 函数名称
     file 文件名
     line 代码行
     source 要输出的字符数组
  * 输出参数: 格式化后的前缀字符
  * 返回值:  格式化后的前缀字符
  *************************************************************************/
 char* makeLogPrefix(const char* func,const char* file,int line,char* source);
 /**************************************************************************
  * 该方法用于根据级别写日志信息。
  * 
  * 输入参数:   level 日志的输出级别
     message 日志的输出信息     
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 void writeLog(int level,const char* message);
 /**************************************************************************
  * 该方法用于将整形数据转化成字符数据
  * 
  * 输入参数:   integer 整形数据
     dest 转换的字符数据    
  * 输出参数: 转换的字符数据 
  * 返回值:  转换的字符数据
  *************************************************************************/
 char* IntToStr(int integer,char* dest);
private:
 /**************************************************************************
  * 该方法用于获取当前系统时间并格式化输出
  * "yyyy-mm-dd hh:mm:ss.ms"
  * 输入参数:   currentTime  格式化后的字符串    
  * 输出参数: 无。
  * 返回值:  格式化的时间字符串
  *************************************************************************/
 char* getCurrentDateTimeForamtStr(char* currentTime);
 
 /**************************************************************************
  * 该方法用于获取当前系统时间并格式化输出
  * "yyyy-mm-dd"
  * 输入参数:   currentTime  格式化后的字符串    
  * 输出参数: 无。
  * 返回值:  格式化的时间字符串
  *************************************************************************/
 char* getCurrentDayFormatStr(char* currentDay);
 /**************************************************************************
  * 该方法用于获取当前运行的线程ID号
  * 
  * 输入参数:   无   
  * 输出参数: 无。
  * 返回值:  线程ID
  *************************************************************************/
 #ifdef _WIN32_OS
 u_long getCurrentThreadId();
 #else
 pthread_t getCurrentThreadId();
 #endif 
 /**************************************************************************
  * 该方法用于按照配置日期删除日志文件
  * 
  * 输入参数:   dir_name 日志文件所在目录
     keepdays 日志保留天数  
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 int removeOldLogFiles(const char *dir_name,int keepdays);
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志的输出级别
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 virtual int getLogLevelFromFile(const std::string& initFileName)throw(ConfigureException);
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志的输出方式
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  输出方式
  *************************************************************************/
 virtual int getLogAppenderFromFile(const std::string& initFileName)throw(ConfigureException);
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志的输出目录
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  输出目录
  *************************************************************************/
 virtual std::string getLogFilePath(const std::string& initFileName)throw(ConfigureException); 
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志的回卷文件的最大值
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  回卷文件的最大值
  *************************************************************************/
 virtual int getRollingFileMaxSize(const std::string& initFileName)throw(ConfigureException);
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志Syslog名称
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  Syslog名称
  *************************************************************************/
 virtual std::string getLocalSyslogName(const std::string& initFileName)throw(ConfigureException);
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志的RemoteSyslog名称
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  RemoteSyslog名称
  *************************************************************************/
 virtual std::string getRemoteSyslogName(const std::string& initFileName)throw(ConfigureException);
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志的RemoteSyslog输出的主机地址
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  ip地址或主机名称
  *************************************************************************/
 virtual std::string getRemoteSyslogHost(const std::string& initFileName)throw(ConfigureException);
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志的RemoteSyslog输出设施
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  输出设施枚举
  *************************************************************************/
 virtual int getRemoteSyslogFacility(const std::string& initFileName)throw(ConfigureException);
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志的RemoteSyslog输出端口号
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  端口号
  *************************************************************************/
 virtual int getRemoteSyslogPortNumber(const std::string& initFileName)throw(ConfigureException);
 /**************************************************************************
  * 该方法用于读取配置文件,并获取日志的保留天数
  * 
  * 输入参数:   initFileName 日志配置文件   
  * 输出参数: 无。
  * 返回值:  端口号
  *************************************************************************/
 virtual int getLogKeepDays(const std::string& initFileName)throw(ConfigureException);
private:
 void*  _logCategory;
 Properties _properties; 
 pthread_mutex_t logMutex;
};
FRAMEWORK_LOGWRAPPER_NS_END

#endif /* __FRAMEWORK_LOGWRAPPER_LOGUTILS_H__ */
3.字符串操作类StirngUtils.h
#ifndef __FRAMEWORK_LOGWRAPPER_STRINGUTIL_H__
#define __FRAMEWORK_LOGWRAPPER_STRINGUTIL_H__
/******************************************************************************
 *  字符串操作类,用于字符串的格式化,去除空格,字符分割等操作。
 *
 * 创建日期: 2011-06-28
 * 作者:     代红伟
 * 修改历史:
 * revision  日期  修改者  描述
 *
 *****************************************************************************/
 
#include "LogLibrary.h"
#include <string>
#include <vector>
#include <climits>
#include <stdarg.h>
FRAMEWORK_LOGWRAPPER_NS_BEGIN
class StringUtil 
{
public:       
  /**************************************************************************
  * 模拟vprintf(3),通过va_list格式化输出字符串信息
  * 
  * 输入参数: format 格式化字符
            args  va_list参数。
  * 输出参数: 无。
  * 返回值:  格式化后的字符串
  *************************************************************************/
        static std::string vform(const char* format, va_list args);
        /**************************************************************************
  * 去字符空格
  * 
  * 输入参数: s  要去空格的字符串。            
  * 输出参数: 无。
  * 返回值:  去除空格后的字符串
  *************************************************************************/
        static std::string trim(const std::string& s);
     /**************************************************************************
  * 根据分割字符进行字符串分割到vector容器内
  * 
  * 输入参数: v 存放分隔后的字符容器
      s 预分隔的字符
      delimiter 分隔符
  * 输出参数: 无。
  * 返回值:  分隔后的字符段数量
  *************************************************************************/
  
        static unsigned int split(std::vector<std::string>& v, 
      const std::string& s, char delimiter,
      unsigned int maxSegments = INT_MAX);
  /**************************************************************************
  * 根据分割字符进行字符串的分割字符串
  * 
  * 输入参数: output  分隔后的存放容器
                  s 预分隔的字符
      delimiter 分隔符
      maxSegments 最大的分隔段数。            
  * 输出参数: 无。
  * 返回值:  分隔后的字符段数量
  *************************************************************************/
        template<typename T> static unsigned int split(T& output,
                const std::string& s, char delimiter,
                unsigned int maxSegments = INT_MAX) {
            std::string::size_type left = 0;
            unsigned int i;
            for(i = 1; i < maxSegments; i++) {
                std::string::size_type right = s.find(delimiter, left);
                if (right == std::string::npos) {
                    break;
                }
                *output++ = s.substr(left, right - left);
                left = right + 1;
            }
            
            *output++ = s.substr(left);
            return i;
        }
    };
FRAMEWORK_LOGWRAPPER_NS_END
#endif // __FRAMEWORK_LOGWRAPPER_STRINGUTIL_H__
4.C调用接口
#ifndef __FRAMEWORK_LOGWRAPPER_EXPORT_H__
#define __FRAMEWORK_LOGWRAPPER_EXPORT_H__
/******************************************************************************
 *  日志类导出接口用于日志类的创建与释放
 *
 *
 * 创建日期: 2011-06-28
 * 作者:     代红伟
 * 修改历史:
 * revision  日期  修改者  描述
 *
 *****************************************************************************/
#include "LogLibrary.h"
#include "LogWrapper.h"
USE_FRAMEWORK_LOGWRAPPER_NS
#ifdef _WIN32_OS
#define LOGWRAPPER_API __declspec(dllexport)
#else
#define LOGWRAPPER_API 
#endif
#ifdef __cplusplus
extern "C" {
#endif
 /**************************************************************************
  * 该方法会根据模块名称创建日志对象,存入日志对象管理容器并返回对象给
  * 调用者。
  *
  * 输入参数: moduleName 模块名称
  * 输出参数: 无。
  * 返回值:   无。
  *************************************************************************/
 LOGWRAPPER_API LogWrapper* LIBRARY_CALL  CreateLogWrapper(const char* moduleName);
 
 /**************************************************************************
  * 该方法会将当前待释放的日志对象,交由创建他的日志对象维护队列来彻底的释放。
  *
  * 输入参数: lw 要释放的日志包装对象
  * 输出参数: 无。
  * 返回值:   无。
  *************************************************************************/
 LOGWRAPPER_API void LIBRARY_CALL ReleaseLogWrapper(LogWrapper* lw);
#ifdef __cplusplus
}
#endif
#endif /*__FRAMEWORK_LOGWRAPPER_EXPORT_H__*/
5.配置文件异常定义类
#ifndef __FRAMEWORK_LOGWRAPPER_CONFIGUREEXCEPTION_H__
#define __FRAMEWORK_LOGWRAPPER_CONFIGUREEXCEPTION_H__
/******************************************************************************
 *  配置文件读取异常类型定义类,用于抛出读取配置文件的异常信息
 *
 * 异常类定义
 *
 * 创建日期: 2011-06-28
 * 作者:     代红伟
 * 修改历史:
 * revision  日期  修改者  描述
 *
 *****************************************************************************/
#include <string>
#include <stdexcept>
#include "LogLibrary.h"
FRAMEWORK_LOGWRAPPER_NS_BEGIN
    class  ConfigureException : public std::runtime_error {
        public:
        /**
         * Constructor.
         * @param reason String containing the description of the exception.
         */
   /**************************************************************************
   * 构造函数。
   * 
   * 输入参数: reason  异常描述信息
   * 输出参数: 无。
   * 返回值:  无。
   *************************************************************************/
        ConfigureException(const std::string& reason);
    };
FRAMEWORK_LOGWRAPPER_NS_END
#endif // __FRAMEWORK_LOGWRAPPER_CONFIGUREEXCEPTION_H__
5.配置文件读取类
#ifndef __FRAMEWORK_LOGWRAPPER_LOGPROPERTIES_H__
#define __FRAMEWORK_LOGWRAPPER_LOGPROPERTIES_H__
/******************************************************************************
 *  配置文件解析类用于解析properties配置文件
 *
 *
 * 创建日期: 2011-06-28
 * 作者:     代红伟
 * 修改历史:
 * revision  日期  修改者  描述
 *
 *****************************************************************************/ 
#include "LogLibrary.h"
#include <string>
#include <iostream>
#include <map>
FRAMEWORK_LOGWRAPPER_NS_BEGIN
class Properties : public std::map<std::string, std::string> 
{
public:
 /**************************************************************************
 * 构造函数。
 * 
 * 输入参数: 无。
 * 输出参数: 无。
 * 返回值:  无。
 *************************************************************************/
 Properties();
 /**************************************************************************
  * 析构函数。
  * 
  * 输入参数: 无。
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 virtual ~Properties();
 /**************************************************************************
  * 该方法用于配置文件以流的方式读入,并与用解析。
  * 
  * 输入参数: in 输入流
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 virtual void load(std::istream& in);
 /**************************************************************************
  * 该方法用于配置文件以流方式保存。
  * 
  * 输入参数: out 输出流
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 virtual void save(std::ostream& out);
 /**************************************************************************
  * 该方法从配置文件中读取整形数据。
  * 
  * 输入参数: property 要读取的属性字段
        defaultValue 默认的返回值,如果没有读取到数据的默认值。
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 virtual int getInt(const std::string& property, int defaultValue);
 /**************************************************************************
  * 该方法从配置文件中读取布尔型数据。
  * 
  * 输入参数: property 要读取的属性字段
     defaultValue 默认的返回值,如果没有读取到数据的默认值。
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 virtual bool getBool(const std::string& property, bool defaultValue);
 /**************************************************************************
  * 该方法从配置文件中读取字符型数据。
  * 
  * 输入参数: property 要读取的属性字段
     defaultValue 默认的返回值,如果没有读取到数据的默认值。
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 virtual std::string getString(const std::string& property,
          const char* defaultValue);
protected:
 /**************************************************************************
  * 该方法读取子项数据,目前没有这样的配置所以没做实现。
  * 
  * 输入参数: value  子项值
  * 输出参数: 无。
  * 返回值:  无。
  *************************************************************************/
 virtual void _substituteVariables(std::string& value);
};
FRAMEWORK_LOGWRAPPER_NS_END
#endif /*__FRAMEWORK_LOGWRAPPER_LOGPROPERTIES_H__*/

Logo

更多推荐