前面提到的日志功能,只是简单的将日志打印出来,拥有了重定向功能后,这样的日志将会更强大。
今天暂时将相关重定向的代码贴上来。再次申请,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();
void redirectToDaemon
( const ACE_TCHAR * prog_name = ACE_TEXT( "" ));
void redirectToSyslog
( const ACE_TCHAR * prog_name = ACE_TEXT( "" ));
void redirectToOStream(ACE_OSTREAM_TYPE * output);
void redirectToFile( const char * filename);
void redirectToStderr( 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_ = new std::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);
}
return previous;
}
/*
LogManager类的主要局限是,它假定输出每次只去往一个地方。对于我们一些小的例子而言足够,但对于足够复杂的工程则远远不够,如何克服这个局限其实也不难,下次将做进一步的改进。
*/
//
#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();
void redirectToDaemon
( const ACE_TCHAR * prog_name = ACE_TEXT( "" ));
void redirectToSyslog
( const ACE_TCHAR * prog_name = ACE_TEXT( "" ));
void redirectToOStream(ACE_OSTREAM_TYPE * output);
void redirectToFile( const char * filename);
void redirectToStderr( 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_ = new std::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);
}
return previous;
}
/*
LogManager类的主要局限是,它假定输出每次只去往一个地方。对于我们一些小的例子而言足够,但对于足够复杂的工程则远远不够,如何克服这个局限其实也不难,下次将做进一步的改进。
*/