diff --git a/modules/base/pymod/export_logger.cc b/modules/base/pymod/export_logger.cc index deefb408cc5fe33e755cff1f08be05c30a206984..52eff9114a0e1ce241d85966cc188b11feed61ad 100644 --- a/modules/base/pymod/export_logger.cc +++ b/modules/base/pymod/export_logger.cc @@ -39,6 +39,16 @@ void pop_verb() Logger::Instance().PopVerbosityLevel(); } +void pop_verb_file() +{ + Logger::Instance().PopFile(); +} + +void push_verb_file(const String& filename) +{ + Logger::Instance().PushFile(filename); +} + void log_error(const String& m) {LOGN_ERROR(m);} void log_message(const String& m) {LOGN_MESSAGE(m);} void log_verbose(const String& m) {LOGN_VERBOSE(m);} @@ -51,6 +61,8 @@ void export_Logger() def("PushVerbosityLevel",push_verb); def("PopVerbosityLevel",pop_verb); + def("PushVerbosityFile",push_verb_file); + def("PopVerbosityFile",pop_verb_file); def("LogError",log_error); def("LogMessage",log_message); diff --git a/modules/base/src/log.cc b/modules/base/src/log.cc index 10d0f677adf4848ad9a3955ad829c40e3eab4dd3..1a153426058779a1757b91fe59a070fcd116f58c 100644 --- a/modules/base/src/log.cc +++ b/modules/base/src/log.cc @@ -17,6 +17,7 @@ // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA //------------------------------------------------------------------------------ #include <iostream> +#include <fstream> #include <ost/log.hh> @@ -45,15 +46,24 @@ Logger& Logger::Instance() Logger::Logger(): level_(0), level_stack_(), - null_(new DevNull()) + null_(new DevNull()), + stream_(0), + ostream_stack_() { + ostream_stack_.push(new std::ostream(std::cerr.rdbuf())); + stream_.rdbuf(ostream_stack_.top()->rdbuf()); } Logger::Logger(const Logger&): level_(0), level_stack_(), - null_(0) -{} + null_(0), + stream_(0), + ostream_stack_() +{ + ostream_stack_.push(new std::ostream(std::cerr.rdbuf())); + stream_.rdbuf(ostream_stack_.top()->rdbuf()); +} Logger& Logger::operator=(const Logger&) { @@ -81,11 +91,25 @@ void Logger::PopVerbosityLevel() std::ostream& Logger::operator()(enum LogLevel l) { if(l<=level_) { - return std::cerr; + return stream_; } return null_; } +void Logger::PushFile(const String& fn) +{ + ostream_stack_.push(new std::ofstream(fn.c_str())); + stream_.rdbuf(ostream_stack_.top()->rdbuf()); +} + +void Logger::PopFile() +{ + if(ostream_stack_.size()>1) { + delete ostream_stack_.top(); + ostream_stack_.pop(); + stream_.rdbuf(ostream_stack_.top()->rdbuf()); + } +} } // ns diff --git a/modules/base/src/log.hh b/modules/base/src/log.hh index ac86280a2159f650f5c36ab326afa4bbd83cc21d..a6b3912a78ffc512929f1099ec1bdcbd3aea1aef 100644 --- a/modules/base/src/log.hh +++ b/modules/base/src/log.hh @@ -26,6 +26,8 @@ namespace ost { +typedef std::stack<std::ostream*> OStreamStack; + // singleton class DLLEXPORT_OST_BASE Logger { public: @@ -40,6 +42,8 @@ public: void PushVerbosityLevel(int level); void PopVerbosityLevel(); + void PushFile(const String& filename); + void PopFile(); std::ostream& operator()(enum LogLevel); @@ -51,11 +55,13 @@ protected: Logger(); Logger(const Logger&); Logger& operator=(const Logger&); - + private: int level_; std::stack<int> level_stack_; std::ostream null_; + std::ostream stream_; + OStreamStack ostream_stack_; }; #define PUSH_VERBOSITY(n) ::ost::Logger::Instance().PushVerbosityLevel(n)