00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef BTK_IO_LOGGER_STREAM_HPP
00022 #define BTK_IO_LOGGER_STREAM_HPP
00023
00024 #include <ostream>
00025 #include <sstream>
00026 #include <string>
00027
00028 #include <btk/core/io/logger.hpp>
00029
00030 namespace BTK {
00031 namespace IO {
00032 namespace LOGGING {
00033
00034 template <typename CharType, typename TraitsType = std::char_traits<CharType> >
00035 class LoggerStreambuf : public std::basic_stringbuf<CharType,TraitsType>
00036 {
00037 public:
00038 typedef std::basic_stringbuf<CharType,TraitsType> base_buf;
00039
00040 LoggerStreambuf(LoggerInterface const & logger,
00041 LoggerLevel level) :
00042 _logger(logger), _log_level(level) {}
00043
00044 ~LoggerStreambuf()
00045 {
00046 sync();
00047 }
00048
00049 protected:
00050
00051 int sync()
00052 {
00053 _logger.log(base_buf::str(),_log_level);
00054 base_buf::str(std::string());
00055 return 0;
00056 }
00057
00058 private:
00059 LoggerInterface const & _logger;
00060 LoggerLevel _log_level;
00061 };
00062
00063 template <typename CharType, typename TraitsType = std::char_traits<CharType> >
00064 class LoggerStream : public std::basic_ostream<CharType,TraitsType>
00065 {
00066 public:
00067 typedef std::basic_ostream<CharType,TraitsType> base_stream;
00068 typedef LoggerStreambuf<CharType,TraitsType> LoggerStreambuf;
00069
00070 LoggerStream(LoggerLevel level) :
00071 base_stream(new LoggerStreambuf(Logger::instance(),level)) {}
00072
00073 LoggerStream(LoggerInterface const & logger,
00074 LoggerLevel level) :
00075 base_stream(new LoggerStreambuf(logger,level)) {}
00076
00077 ~LoggerStream() { delete base_stream::rdbuf(); }
00078 };
00079
00080 }
00081 }
00082 }
00083
00084 #endif