请问我下面这个日志设计类有什么问题?我想要在我的c++代码中加入日志功能,现在先用log4cplus这个日志库,这
请问我下面这个日志设计类有什么问题?
我想要在我的c++代码中加入日志功能,现在先用log4cplus这个日志库,这个库本身支持线程安全。
由于我的工程包含很多个小的project,如果每个project包含这个log4cplus,那么我以后想用别的日志库来代替log4plus就会很麻烦,所以想封装这个日志类,大体上是先设计一个基类:
C/C++ codeclass LogFile{public: virtual void GetInstance(wchat_t* FileName) = 0; virtual void WriteMessage(wchat_t* Msg) = 0;}
继承类(我把定义和实现写一起了):
C/C++ codeclass 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;
}
....这样基本上就可以了~
[解决办法]