#include <StreamFactory.h>
Public Types | |
typedef Stream *(* | create_stream_callback )(const std::string &, const std::string &) |
typedef Stream *(* | create_stream_callback )(const std::string &, const std::string &) |
typedef std::map< std::string, create_stream_callback > | stream_factory_collection |
typedef std::map< std::string, create_stream_callback > | stream_factory_collection |
Public Member Functions | |
Stream * | create_stream (const std::string &key) const |
create a stream from a key | |
Stream * | create_stream (const std::string &key) const |
create a stream from a key | |
Stream * | debug (severity_t s) |
Debug stream for level. | |
Stream * | debug (severity_t s) |
Debug stream for level. | |
Stream * | error () |
Error stream. | |
Stream * | error () |
Error stream. | |
Stream * | fatal () |
Fatal stream. | |
Stream * | fatal () |
Fatal stream. | |
Stream * | get_stream (severity_t s) |
get stream for severity_t | |
Stream * | get_stream (severity_t s) |
get stream for severity_t | |
bool | register_factory (const std::string &name, create_stream_callback callback) |
register a factory method | |
bool | register_factory (const std::string &name, create_stream_callback callback) |
register a factory method | |
void | set (severity_t severity, const char *key) |
Setup a stream for a given severity_t based on a key. | |
void | set (severity_t severity, Stream *s) |
Sets the stream for a given severity_t. | |
void | set (severity_t severity, const char *key) |
Setup a stream for a given severity_t based on a key. | |
void | set (severity_t severity, Stream *s) |
Sets the stream for a given severity_t. | |
Stream * | warning () |
Warning stream. | |
Stream * | warning () |
Warning stream. | |
void | write_to (std::ostream &stream) const |
write content of factory to stream | |
void | write_to (std::ostream &stream) const |
write content of factory to stream | |
~StreamFactory () | |
~StreamFactory () | |
Static Public Member Functions | |
void | debug (const Context &c, const std::string &message, severity_t s) |
sends a debug message | |
void | debug (Issue *i, severity_t) |
sends an Issue to the debug stream | |
void | debug (const Context &c, const std::string &message, severity_t s) |
sends a debug message | |
void | debug (Issue *i, severity_t) |
sends an Issue to the debug stream | |
void | dispatch (Issue &i, bool throw_error=false) |
void | dispatch (Issue *i, bool throw_error=false) |
Sends an issue to the appropriate stream according to its severity_t. | |
void | dispatch (Issue &i, bool throw_error=false) |
void | dispatch (Issue *i, bool throw_error=false) |
Sends an issue to the appropriate stream according to its severity_t. | |
void | error (Issue *i) |
sends an issue to the error stream | |
void | error (Issue *i) |
sends an issue to the error stream | |
void | fatal (Issue *i) |
sends an issue to the fatal stream | |
void | fatal (Issue *i) |
sends an issue to the fatal stream | |
StreamFactory * | instance () |
return the singleton | |
StreamFactory * | instance () |
return the singleton | |
void | print_registered () |
void | print_registered () |
void | set_stream (severity_t, const std::string &key) |
void | set_stream (severity_t, const std::string &key) |
void | warning (const Context &c, const std::string &message) |
sends a warning message | |
void | warning (Issue *i) |
sends an issue to the warning stream | |
void | warning (const Context &c, const std::string &message) |
sends a warning message | |
void | warning (Issue *i) |
sends an issue to the warning stream | |
Protected Member Functions | |
Stream * | create_stream (severity_t s) |
create a stream for severity_t | |
Stream * | create_stream (severity_t s) |
create a stream for severity_t | |
StreamFactory (const StreamFactory &other) | |
StreamFactory () | |
StreamFactory (const StreamFactory &other) | |
StreamFactory () | |
Static Protected Member Functions | |
Stream * | get_default_stream (severity_t s) |
builds default stream for severity_t | |
Stream * | get_default_stream (severity_t s) |
builds default stream for severity_t | |
const char * | key_for_severity (severity_t s) |
finds key for severity_t | |
const char * | key_for_severity (severity_t s) |
finds key for severity_t | |
Protected Attributes | |
stream_factory_collection | m_factories |
collection of factories to build streams | |
Stream * | m_streams [severity_max] |
array of pointers to streams per severity_t | |
Stream * | m_streams [severity_max] |
array of pointers to streams per severity_t | |
Static Protected Attributes | |
const char * | DEFAULT_STREAMS [] |
keys for default streams | |
const char * | DEFAULT_STREAMS [] |
keys for default streams | |
StreamFactory * | s_instance |
singleton instance | |
StreamFactory * | s_instance = 0 |
singleton instance |
The StreamFactory
class is responsible for creating and handling all the ers stream used by the system. It implements the singleton pattern and the factory pattern. There should normally only be one instance of this class per process at any time, each instance handles a table of the different stream attached to each severity. When issues occurs, they can be dispatched using this instance. In general, the following method should be used to dispatch issues
dispatch
if the severity_t of the issue is set correctly. fatal
, error
, warning
, debug
for setting the severity_t and dispatch. file
protocol, or a keyword that identifies a different type of protocol followed by a colon. Certain protocols accepts more information after the colon, for instance for file streams, the rest of the URL is used to specify the file path, and deduce the file format from the file extension.file:/tmp/out.xml
represents a stream that writes issues into file /tmp/out.xml
in the XML format. cerr:tab
represents a stream that writes in tabulated format on the standard output. DEFAULT_STREAMS
. The content is a key with the format described above.y set
, either by specifying the stream directly, or by providing a key. Supported Keys - ERS package
The ERS package supports by default the following keys:
null:
issues are discarded default:
issues are displayed on standard error stream fifo:
writes into a FIFO stream, to be actually used the issues need to be read by another entity filter:
filter stream, the Issues are filtered and if the filter accept them, passed on to another stream (specified by another key in the stream description). Supported Keys - System package:
The System package supports the following keys:
Supported Keys - ers-ipc package:
The ersipc package supports the following keys:
In order to add new stream implementations, one needs to register a factory function of type create_stream_callback
. This method takes two parameters, a protocol parameter, and an uri parameter, that basically contains everything except the protocol part of the key. If the implementation can offer a stream that corresponds to the key it should return a heap allocated stream, if not it should return a null pointer. This method should be registered using the register_factory
method on the default instance.
Macros
This file also defines a set of macros that send messages to the relevant streams in the factory. Those macros are intendred for logging out debug messages. They can compiled out by the way of the DEBUG_LEVEL
macro. This macro should be defined with an integer level. A debugging macro is disabled if its number is higher than the value of DEBUG_LEVEL
. For instance if DEBUG_LEVEL=2 then ERS_DEBUG_3 is compiled out. ERS_DEBUG_0 is never compiled out. If no debug level is specified, level 3 (maximum) is assumed. If the macro ERS_FAST_DEBUG is defined then ERS_DEBUG_0 macro directly maps to a fprintf statement on stderr.
System::STLStream
System::MessageStream
System::SyslogStream
System::TabStream
System::XercesStream
|
|
|
|
|
|
|
|
|
Constructor - should never be called by user code, use the
00043 { 00044 for(int i= static_cast<int> (severity_none);i< static_cast<int> (severity_max);i++) { 00045 severity_t s = static_cast<severity_t> (i) ; 00046 m_streams[s]=0 ; 00047 } // for*/ 00048 } // StreamFactory
|
|
Copy constructor - disabled, use the
00055 { 00056 (void) other ; // shut up the compiler 00057 ERS_NOT_IMPLEMENTED(); 00058 } // StreamFactory
|
|
Destructor - basic cleanup
00064 { 00065 for(int i= static_cast<int> (severity_none);i< static_cast<int> (severity_max);i++) { 00066 severity_t s = static_cast<severity_t> (i) ; 00067 if(m_streams[s]) { 00068 delete(m_streams[s]); 00069 m_streams[s]=0 ; 00070 } // if stream 00071 } // for*/ 00072 } // ~StreamFactory
|
|
|
|
|
|
|
|
create a stream from a key
|
|
create a stream for severity_t
|
|
create a stream from a key
Builds a stream from a textual key The key should have the format
00143 { 00144 std::string protocol ; 00145 std::string uri ; 00146 00147 std::string::size_type colon = key.find(':') ; 00148 if (colon==std::string::npos) { 00149 protocol = key ; 00150 } else { 00151 protocol = key.substr(0,colon) ; 00152 std::string::size_type uri_start = colon+1 ; 00153 if (uri_start<key.size()) { 00154 uri = key.substr(uri_start) ; 00155 } // if 00156 } // colon present 00157 for(stream_factory_collection::const_iterator pos=m_factories.begin();pos!=m_factories.end();++pos) { 00158 create_stream_callback callback = pos->second; 00159 Stream *s = callback(protocol,uri); 00160 if (s!=0) return s ; 00161 } // for 00162 fprintf(stderr,"Warning, could not find stream for key protocol=\"%s\" uri=\"%s\" (%s)\n",protocol.c_str(),uri.c_str(),key.c_str()); 00163 return new DefaultStream(); 00164 } // create_stream
|
|
create a stream for severity_t
Builds a stream for a given severity. The actual key for the severity_t is found using
00176 { 00177 const char* key = key_for_severity(s); 00178 return create_stream(key); 00179 } // get_stream
|
|
Debug stream for level.
|
|
sends a debug message
|
|
sends an Issue to the debug stream
|
|
Debug stream for level. Finds the debug stream
00347 { 00348 ERS_PRECONDITION(s<ers::information && s>ers::severity_none,"severity_t is not debug : %s (%d)",ers::Core::to_string(s),s); 00349 return get_stream(s) ; 00350 } // debug
|
|
sends a debug message Sends a message to the debug stream
00231 { 00232 LogIssue log_issue(c,s,message); 00233 debug(&log_issue,s); 00234 } // debug
|
|
sends an Issue to the debug stream Sends an issue to the debug stream
00218 { 00219 ERS_PRE_CHECK_PTR(issue_ptr); 00220 ERS_PRECONDITION(s<ers::information,"severity_t is not debug : %s (%d) %d",ers::Core::to_string(s),s,ers::information); 00221 issue_ptr->severity(s) ; 00222 dispatch(issue_ptr,false); 00223 } // debug
|
|
|
|
Sends an issue to the appropriate stream according to its severity_t.
|
|
00264 { 00265 dispatch(&issue_ref,throw_error); 00266 } // dispatch
|
|
Sends an issue to the appropriate stream according to its severity_t.
Dispatches an issue to the appropriate stream. The stream is decided based upon the severity_t specified in the Issue. If
00254 { 00255 ERS_PRE_CHECK_PTR(issue_ptr); 00256 if (throw_error && issue_ptr->is_error()) { throw *issue_ptr ; } 00257 const severity_t s = issue_ptr->severity() ; 00258 Stream *stream_ptr = instance()->get_stream(s) ; 00259 ERS_CHECK_PTR(stream_ptr); 00260 stream_ptr->send(issue_ptr); 00261 } // dispatch
|
|
Error stream.
|
|
sends an issue to the error stream
|
|
Error stream.
00332 { return get_stream(ers::error) ; } // error
|
|
sends an issue to the error stream Sends an Issue to the error stream
00196 { 00197 ERS_PRE_CHECK_PTR(issue_ptr); 00198 issue_ptr->severity(ers::error); 00199 dispatch(issue_ptr,false); 00200 } // error
|
|
Fatal stream.
|
|
sends an issue to the fatal stream
|
|
Fatal stream.
00326 { return get_stream(ers::fatal) ; } // fatal
|
|
sends an issue to the fatal stream Sends an Issue to the fatal error stream
00186 { 00187 ERS_PRE_CHECK_PTR(issue_ptr); 00188 issue_ptr->severity(ers::fatal); 00189 dispatch(issue_ptr,false); 00190 } // fatal
|
|
builds default stream for severity_t
|
|
builds default stream for severity_t Finds the default stream for a given severity. The stream is searched in the default instance
00104 { 00105 return instance()->get_stream(s) ; 00106 } // get_default_stream
|
|
get stream for severity_t
|
|
get stream for severity_t Gets stream for severity_t
00283 { 00284 if (m_streams[s]==0) { 00285 m_streams[s]=create_stream(s) ; 00286 } // if 00287 return m_streams[s] ; 00288 } // get_stream
|
|
return the singleton
|
|
return the singleton This method returns the singleton instance. It should be used for every operation on the factory.
00080 { 00081 if (0==s_instance) { 00082 s_instance = new StreamFactory(); 00083 } // if 00084 return s_instance ; 00085 } // instance
|
|
finds key for severity_t
|
|
finds key for severity_t
Searches for the textual key for a given severity. This key is first searched in the environnement variables, if this fails, the default values are loaded. The environnement variable should have the same name than the severity with the prefix ERS_ in front. The whole name should be in uppercases. For instance for severity_t warning, the environnement variable should be
00119 { 00120 char key_buffer[64] ; 00121 snprintf(key_buffer,sizeof(key_buffer),"ERS_%s",ers::Core::to_string(s)) ; 00122 char *c = &(key_buffer[0]); 00123 while(*c) { 00124 *c = toupper(*c) ; 00125 c++ ; 00126 } // while 00127 const char *env = ::getenv(key_buffer) ; 00128 if (env!=0) return env ; 00129 const char* static_key = DEFAULT_STREAMS[s] ; 00130 if (static_key) return static_key ; 00131 return ers::DefaultStream::KEY ; 00132 } // key_for_severity
|
|
|
|
Dumps all registered types of streams 00089 { 00090 const StreamFactory *factory = instance(); 00091 std::cerr << *factory ; 00092 } // print_registered
|
|
register a factory method
|
|
register a factory method Registers a factory function with the stream factory. The callback is function that takes two parameters
00367 { 00368 // std::cerr << "registering " << name << std::endl ; 00369 m_factories[name] = callback ; 00370 return true ; 00371 } // register_factory
|
|
Setup a stream for a given severity_t based on a key.
|
|
Sets the stream for a given severity_t.
|
|
Setup a stream for a given severity_t based on a key. Builds a stream using a string key and sets it up for a given severity
00316 { 00317 ERS_PRE_CHECK_PTR(key); 00318 Stream *s = create_stream(key); 00319 set(severity,s); 00320 } //
|
|
Sets the stream for a given severity_t. Sets the stream for a given severity_t
00299 { 00300 ERS_PRE_CHECK_PTR(s); 00301 ERS_PRECONDITION(severity_none < severity && severity < severity_max,"illegal severity_t %d",(int) severity); 00302 if (m_streams[severity]) { 00303 delete m_streams[severity] ; 00304 } // if there is a stream defined 00305 m_streams[severity] = s ; 00306 } // stream
|
|
|
|
|
|
Warning stream.
|
|
sends a warning message
|
|
sends an issue to the warning stream
|
|
Warning stream.
00338 { return get_stream(ers::warning); } // warning
|
|
sends a warning message Sends a message to the warning stream
00241 { 00242 LogIssue log_issue(c,ers::warning,message); 00243 warning(&log_issue); 00244 } // warning
|
|
sends an issue to the warning stream Sends an Issue to the warning stream
00206 { 00207 ERS_PRE_CHECK_PTR(issue_ptr); 00208 issue_ptr->severity(ers::warning); 00209 dispatch(issue_ptr,false); 00210 } // warning
|
|
write content of factory to stream
|
|
write content of factory to stream Writes a description of the factory to a stream. This method gives a list of all registered stream types.
00378 { 00379 stream << "Stream factory - registered streams\n" ; 00380 stream << "-----------------------------------\n" ; 00381 int i = 0 ; 00382 for(stream_factory_collection::const_iterator pos=m_factories.begin();pos!=m_factories.end();++pos) { 00383 std::string name = pos->first; 00384 stream << i << ")\t" << name << std::endl; 00385 i++ ; 00386 } // for 00387 stream << "-----------------------------------\n" ; 00388 } // write_to
|
|
keys for default streams
|
|
Initial value: { "null:", "default:", "default:", "default:", "default:", "default:", "default:", "default:", "default:verbose", "default:verbose", "null:" } This variable contains the default keys for building the default streams. The default is to use the default stream, in verbose mode for errors and fatals. |
|
collection of factories to build streams
|
|
array of pointers to streams per severity_t
|
|
array of pointers to streams per severity_t
|
|
singleton instance
|
|
singleton instance Pointer to the singleton instance |