首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教小弟我下面这个日志设计类有什么有关问题

2012-02-10 
请问我下面这个日志设计类有什么问题?我想要在我的c++代码中加入日志功能,现在先用log4cplus这个日志库,这

请问我下面这个日志设计类有什么问题?
我想要在我的c++代码中加入日志功能,现在先用log4cplus这个日志库,这个库本身支持线程安全。
由于我的工程包含很多个小的project,如果每个project包含这个log4cplus,那么我以后想用别的日志库来代替log4plus就会很麻烦,所以想封装这个日志类,大体上是先设计一个基类:

C/C++ code
class LogFile{public:   virtual void GetInstance(wchat_t* FileName) = 0;   virtual void WriteMessage(wchat_t* Msg) = 0;}

继承类(我把定义和实现写一起了):
C/C++ code
class LogFileUseLog4Cplus{public:   void GetInstance(wchat_t* FileName)   {    // 定义一个文件Appender        SharedAppenderPtr pFileAppender(new FileAppender(FileName));        // 定义Logger        Logger m_Log4Cplus = Logger::getInstance(_T("LoggerName"));        // 将需要关联Logger的Appender添加到Logger上        m_Log4Cplus.addAppender(pFileAppender);       }   void WriteMessage(wchat_t* Msg)   {      LOG4CPLUS_WARN(m_Log4Cplus, "This is a <Warn> log message...");         }private:  Logger m_Log4Cplus;}   

这样用户只能看到LogFile,当我改用log4cxx时只要再加一个继承类LogFileUseLog4Cxx就行了,用户不需要修改。
请问这样对吗?

[解决办法]
基本是对的。
可是从代码里 看不出来你继承了。

一般是有一个实际的log对象的指针

你可以set它 由此就可以改变实际用的log了
[解决办法]
策略模式啊
class logger
{
public:
virtual void interface1() = 0;
virtual void interface2() = 0;
}

class log4cplus : public logger
{
public:
virtual void interface1(){//你的实现};
virtual void interface2(){//你的实现};
}

class otherLogger : public logger
{
public:
virtual void interface1(){//你的实现};
virtual void interface2(){//你的实现};
}

你的类里面有个logger的指针就可以了
class myClass
{
public: 
logger* myLogger;
}
用的时候赋值,想用什么logger就用什么logger,不用修改编码的~

[解决办法]
进一步,觉得还可以改进,就是一般来说整个系统里面一个log文件对应一个特定的logger,你可以用singleton来包装下,包装成SingletonLogger,简单的写个接口:
Class SingletonLogger
{
public:
SingletonLogger* getInstance();
void setLoggerClass(logger* aLogger);
void log(std::string message)const{loggerInstance->writelog(message)};
void removeInstance();
private:
logger* loggerInstance;
static SingletonLogger* m_Instance;
}
....这样基本上就可以了~
[解决办法]
探讨
谢谢回复,log4cplus已经是个singleton模式,为什么我还要自己定义一个singleton模式的类来封装log4cplus?

热点排行