前面提到的日志功能,只是简单的将日志打印出来,拥有了重定向功能后,这样的日志将会更强大。 今天暂时将相关重定向的代码贴上来。再次申请,vs2005下编译通过。 下次再进行改进,并更上所有测试程序。 // LogManager.h: // #include " ace/log_msg.h " #include " ace/Object_Manager.h " #include " aceSingleton.h " #include < fstream > using std::ofstream; #pragma once #define ACE_NDEBUG0 #define ACE_NTRACE0 class LogManager ... {public:LogManager();~LogManager();voidredirectToDaemon(constACE_TCHAR*prog_name=ACE_TEXT(""));voidredirectToSyslog(constACE_TCHAR*prog_name=ACE_TEXT(""));voidredirectToOStream(ACE_OSTREAM_TYPE*output);voidredirectToFile(constchar*filename);voidredirectToStderr(void);ACE_Log_Msg_Callback*redirectToCallback(ACE_Log_Msg_Callback*callback);private:std::ofstream*log_stream_;ACE_OSTREAM_TYPE*output_stream_;} ;typedefACE_Singleton < LogManager,ACE_Null_Mutex > LogManagerSingleton; #define Log_MANAGERLogManagerSingleton::instance(); LogManager::LogManager():log_stream_( 0 ),output_stream_( 0 ) ... {} LogManager:: ~ LogManager() ... {if(log_stream_)log_stream_->close();deletelog_stream_;} void LogManager::redirectToSyslog( const ACE_TCHAR * prog_name) ... {ACE_LOG_MSG->open(prog_name,ACE_Log_Msg::SYSLOG,prog_name);} void LogManager::redirectToDaemon( const ACE_TCHAR * prog_name) ... {ACE_LOG_MSG->open(prog_name,ACE_Log_Msg::LOGGER,ACE_DEFAULT_LOGGER_KEY);} void LogManager::redirectToOStream(ACE_OSTREAM_TYPE * output) ... {output_stream_=output;ACE_LOG_MSG->msg_ostream(this->output_stream_);ACE_LOG_MSG->clr_flags(ACE_Log_Msg::STDERR|ACE_Log_Msg::LOGGER);ACE_LOG_MSG->set_flags(ACE_Log_Msg::OSTREAM);} void LogManager::redirectToFile( const char * filename) ... {log_stream_=newstd::ofstream();log_stream_->open(filename,ios::out|ios::app);this->redirectToOStream(log_stream_);} void LogManager::redirectToStderr( void ) ... {ACE_LOG_MSG->clr_flags(ACE_Log_Msg::OSTREAM|ACE_Log_Msg::LOGGER);ACE_LOG_MSG->set_flags(ACE_Log_Msg::STDERR);} ACE_Log_Msg_Callback * LogManager::redirectToCallback(ACE_Log_Msg_Callback * callback) ... {ACE_Log_Msg_Callback*previous=ACE_LOG_MSG->msg_callback(callback);if(callback==0)...{ACE_LOG_MSG->clr_flags(ACE_Log_Msg::MSG_CALLBACK);}else...{ACE_LOG_MSG->set_flags(ACE_Log_Msg::MSG_CALLBACK);}returnprevious;} /**/ /*LogManager类的主要局限是,它假定输出每次只去往一个地方。对于我们一些小的例子而言足够,但对于足够复杂的工程则远远不够,如何克服这个局限其实也不难,下次将做进一步的改进。*/