diff --git a/modules/base/pymod/export_logger.cc b/modules/base/pymod/export_logger.cc
index f23e0871434a4e3dafd7baa55132f43d34fdc17d..91eccbdec2922ab4b5c1167ef48c3ef6d1d8e301 100644
--- a/modules/base/pymod/export_logger.cc
+++ b/modules/base/pymod/export_logger.cc
@@ -156,6 +156,12 @@ void export_Logger()
     .def("LogMessage", &FileLogSink::LogMessage)
   ;
 
+  class_<StringLogSink, StringLogSinkPtr, bases<LogSink>,
+         boost::noncopyable >("StringLogSink", init<>())
+    .def("LogMessage", &StringLogSink::LogMessage)
+    .def("GetLog", &StringLogSink::GetLog)
+  ;
+
   def("PushVerbosityLevel",push_verb);
   def("PopVerbosityLevel",pop_verb);
   def("GetVerbosityLevel",get_verb);
diff --git a/modules/base/src/log_sink.hh b/modules/base/src/log_sink.hh
index 6cf939201e2cb901e8e8957103580919e172b5e5..f06d4ae1c6221c0691a5715cc60bc355b4344431 100644
--- a/modules/base/src/log_sink.hh
+++ b/modules/base/src/log_sink.hh
@@ -20,6 +20,7 @@
 #define OST_LOG_SINK_HH
 
 #include <ostream>
+#include <sstream>
 #include <iostream>
 #include <fstream>
 #include <stack>
@@ -51,6 +52,23 @@ private:
   std::ostream& stream_;
 };
 
+class DLLEXPORT StringLogSink : public LogSink {
+public:
+  StringLogSink():LogSink(),stream_(){}
+  virtual void LogMessage(const String& message, int severity){
+    stream_ << message;
+  }
+  String GetLog() const
+  {
+    return stream_.str();
+  }
+
+private:
+  std::ostringstream stream_;
+};
+
+typedef boost::shared_ptr<StringLogSink> StringLogSinkPtr;
+
 class DLLEXPORT FileLogSink : public LogSink {
 public:
   FileLogSink(const String& file_name):stream_(file_name.c_str(), std::ios::out){}