Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members

logstream_ts.h

Go to the documentation of this file.
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   // Setters
00056   logstream &show_severity( bool show );
00057   logstream &next_level( level_t lev );
00058   logstream &current_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 ); // Not implemented
00087   logstream &operator=( const logstream &ls ); // Not implemented
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 }}; // closing namespaces
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 /* EDG_WORKLOAD_COMMON_LOGGER_LOGSTREAM_TS_H */
00124 
00125 // Local Variables:
00126 // mode: c++
00127 // End:

Generated on Wed Mar 1 00:37:55 2006 for COMMON API - configuration, jobid, ldif2classadi, logger, process, requestad, socket++i, task, utilities by doxygen 1.3.5