00001 #ifndef EDG_WORKLOAD_COMMON_LOGGER_LOGSTREAM_TS_H
00002 #define EDG_WORKLOAD_COMMON_LOGGER_LOGSTREAM_TS_H
00003
00004 #ifdef HAVE_CONFIG_H
00005 #include <config.h>
00006 #endif
00007
00008 #ifdef HAVE_STRINGSTREAM
00009 #include <sstream>
00010 #else
00011 #include <strstream>
00012 #endif
00013
00014 #include "logstream.h"
00015 #include "container_ts.h"
00016
00017 #include <boost/thread/mutex.hpp>
00018 #include <boost/thread/tss.hpp>
00019
00020 namespace edg { namespace workload { namespace common { namespace logger { namespace threadsafe {
00021 class logstream;
00022 }}}}};
00023
00024 #define __log_t edg::workload::common::logger::threadsafe::logstream
00025 namespace std {
00026 typedef __log_t &(*lts_manip_t)(__log_t &);
00027 }
00028 #undef __log_t
00029
00030 COMMON_NAMESPACE_BEGIN {
00031
00032 namespace logger { namespace threadsafe {
00033
00034 class logstream {
00035 private:
00036 #ifdef HAVE_STRINGSTREAM
00037 typedef std::ostringstream OutStream;
00038 #else
00039 class OutStream : public std::ostrstream {
00040 public:
00041 OutStream( void );
00042 ~OutStream( void );
00043
00044 std::string str( void );
00045 };
00046 #endif
00047
00048 public:
00049 logstream( void );
00050 logstream( const char *name, level_t lev = medium, const char *format = data_c::bd_s_timeFormat );
00051 logstream( const std::string &name, level_t lev = medium, const char *format = data_c::bd_s_timeFormat );
00052 logstream( std::ostream &ostr, level_t lev = medium, const char *format = data_c::bd_s_timeFormat );
00053 ~logstream( void );
00054
00055
00056 logstream &show_severity( bool show );
00057 logstream &next_level( level_t lev );
00058 logstream ¤t_level( level_t lev );
00059 logstream &function( const char *func );
00060 logstream &time_format( const char *format );
00061 logstream &clear_function( void );
00062
00063 void open( const char *name, level_t lev = medium, const char *format = data_c::bd_s_timeFormat );
00064 void open( std::ostream &ostr, level_t lev = medium, const char *format = data_c::bd_s_timeFormat );
00065 void close( void );
00066 void unsafe_attach( logger::logstream &ls );
00067 void activate_log_rotation( std::streamsize maxsize, const std::string &basename, unsigned int maxfiles );
00068 void deactivate_log_rotation( void );
00069 void log_rotate( void );
00070 logstream &endl( void );
00071 logstream &ends( void );
00072 logstream &flush( void );
00073
00074 template <class Type>
00075 logstream &operator<<( const Type &t );
00076
00077 inline void open( const std::string &name, level_t lev = medium, const char *format = data_c::bd_s_timeFormat )
00078 { this->open( name.c_str(), lev, format ); }
00079 inline void reset( std::ostream &ostr, level_t lev = medium, const char *format = data_c::bd_s_timeFormat )
00080 { this->open( ostr, lev, format ); }
00081 inline bool multi( void ) { return this->tl_multi; }
00082 inline Logbuf *logbuf( void ) { return (Logbuf *)(this->tl_stream.rdbuf()); }
00083 inline logstream &operator<<( std::lts_manip_t func ) { return (*func)( *this ); }
00084
00085 protected:
00086 logstream( const logstream &ls );
00087 logstream &operator=( const logstream &ls );
00088
00089 inline void checkBuffer( void )
00090 { if( this->tl_buffer.get() == NULL ) this->tl_buffer.reset( new OutStream() ); }
00091
00092 bool tl_multi;
00093 DataContainerImpl *tl_container;
00094 logger::logstream tl_stream;
00095 boost::mutex tl_mutex;
00096 boost::thread_specific_ptr<OutStream> tl_buffer;
00097 };
00098
00099 template <class Type>
00100 logstream &logstream::operator<<( const Type &t )
00101 {
00102 this->checkBuffer();
00103
00104 *this->tl_buffer << t;
00105
00106 return *this;
00107 }
00108
00109 }};
00110
00111 } COMMON_NAMESPACE_END;
00112
00113 #define __log_t edg::workload::common::logger::threadsafe::logstream
00114 namespace std {
00115 typedef __log_t &(*lts_manip_t)(__log_t &);
00116
00117 inline __log_t &endl( __log_t &ll ) { return ll.endl(); }
00118 inline __log_t &ends( __log_t &ll ) { return ll.ends(); }
00119 inline __log_t &flush( __log_t &ll ) { return ll.flush(); }
00120 }
00121 #undef __log_t
00122
00123 #endif
00124
00125
00126
00127