Linux下Log4cpp封装全过程
这几天开始封装日子,打算采用Log4cpp提供的日志功能来写日子。为了方便产品内的调用,提议做了一部分封装,将log4cpp的静态库 log4cpp.a 静态链接到我开发的logLibrary.so内并提供了C调用接口。1.提供LogWrapper.h提供对外的long方法
·
这几天开始封装日子,打算采用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__*/
更多推荐
已为社区贡献1条内容
所有评论(0)