Midge  v3.9.2
Data Processing Framework
message_logger.hh
Go to the documentation of this file.
1 #ifndef _midge_message_hh_
2 #define _midge_message_hh_
3 
4 #include "types.hh"
5 
6 #include "logger.hh"
7 
8 #include <iomanip>
9 #include <map>
10 #include <mutex>
11 #include <ostream>
12 #include <set>
13 #include <sstream>
14 #include <string>
15 #include <utility>
16 #include <thread>
17 #include <vector>
18 
19 namespace midge
20 {
21 
23  {
24  };
25 
26  inline std::ostream& operator<<( std::ostream& a_str, const message_line& ) {return a_str;}
27 
29  {
30  };
31 
32  inline std::ostream& operator<<( std::ostream& a_str, const message_end& ) {return a_str;}
33 
34  typedef std::ios_base::fmtflags message_format;
35  typedef std::streamsize message_precision;
36  typedef int message_severity;
37  static const message_severity s_error = 0;
38  static const message_severity s_warning = 1;
39  static const message_severity s_normal = 2;
40  static const message_severity s_debug = 3;
41  static const message_line ret = message_line();
42  static const message_end eom = message_end();
43 
44  class message
45  {
46  public:
47  message( const std::string& aKey, const std::string& aDescription, const std::string& aPrefix, const std::string& aSuffix );
48  virtual ~message();
49 
50  private:
51  message();
52  message( const message& );
53 
54  //**************
55  //identification
56  //**************
57 
58  public:
59  void set_key( const std::string& aKey );
60  const std::string& get_key() const;
61 
62  protected:
63  std::string f_key;
64 
65  //*********
66  //interface
67  //*********
68 
69  public:
70  message& operator()( const message_severity& );
71 
72  template< class XPrintable >
73  message& operator<<( const XPrintable& p_fragment );
74  message& operator<<( const message_line& );
75  message& operator<<( const message_end& );
76 
77  private:
78  void set_severity( const message_severity& aSeverity );
79  void flush();
80  void shutdown();
81 
82  protected:
83  std::string f_system_description;
84  std::string f_system_prefix;
85  std::string f_system_suffix;
86 
87  std::string f_error_color_prefix;
88  std::string f_error_color_suffix;
89  std::string f_error_description;
90 
93  std::string f_warning_description;
94 
95  std::string f_normal_color_prefix;
96  std::string f_normal_color_suffix;
97  std::string f_normal_description;
98 
99  std::string f_debug_color_prefix;
100  std::string f_debug_color_suffix;
101  std::string f_debug_description;
102 
106 
107  private:
108  message_severity f_severity;
109 
110  std::string message::*f_color_prefix;
111  std::string message::*f_description;
112  std::string message::*f_color_suffix;
113 
114  std::stringstream f_message_line;
115  std::vector< std::string > f_message_lines;
116 
117  //********
118  //settings
119  //********
120 
121  public:
122  void set_format( const message_format& aFormat );
123  void set_precision( const message_precision& aPrecision );
124  void set_terminal_severity( const message_severity& aVerbosity );
125  void set_terminal_stream( std::ostream* aTerminalStream );
126  void set_log_severity( const message_severity& aVerbosity );
127  void set_log_stream( std::ostream* aLogStream );
128 
129  private:
130  message_severity f_terminal_severity;
131  std::ostream* f_terminal_stream;
132  message_severity f_log_severity;
133  std::ostream* f_log_stream;
134 
135  static void acquire();
136  static void release();
137  static std::mutex f_outer;
138  static std::mutex f_inner;
139  static std::set< std::thread::id > f_threads;
140  };
141 
142  inline message& message::operator()( const message_severity& aSeverity )
143  {
144  acquire();
145 
146  set_severity( aSeverity );
147 
148  return *this;
149  }
150 
151  template< class XPrintable >
152  message& message::operator<<( const XPrintable& aFragment )
153  {
154  acquire();
155 
156  f_message_line << aFragment;
157 
158  return *this;
159  }
161  {
162  acquire();
163 
164  f_message_lines.push_back( f_message_line.str() );
165  f_message_line.clear();
166  f_message_line.str( "" );
167 
168  return *this;
169  }
171  {
172  acquire();
173 
174  f_message_lines.push_back( f_message_line.str() );
175  f_message_line.clear();
176  f_message_line.str( "" );
177  flush();
178 
179  release();
180 
181  return *this;
182  }
183 
184 }
185 
186 #include "singleton.hh"
187 
188 namespace midge
189 {
190 
191  class messages :
192  public scarab::singleton< messages >
193  {
194 
195  public:
196  friend class scarab::singleton< messages >;
197  friend class scarab::destroyer< messages >;
198 
199  private:
200  messages();
201  ~messages();
202 
203  public:
204  void add( message* aMessage );
205  message* get( const std::string& aKey );
206  void remove( message* aMessage );
207 
208  void set_format( const message_format& aFormat );
209  const message_format& get_format();
210 
211  void set_precision( const message_precision& aPrecision );
212  const message_precision& GetPrecision();
213 
214  void set_terminal_severity( const message_severity& aVerbosity );
215  const message_severity& get_terminal_severity();
216 
217  void set_terminal_stream( std::ostream* aTerminalStream );
218  std::ostream* get_terminal_stream();
219 
220  void set_log_severity( const message_severity& aVerbosity );
221  const message_severity& get_log_severity();
222 
223  void set_log_stream( std::ostream* aLogStream );
224  std::ostream* get_log_stream();
225 
226  private:
227  typedef std::map< std::string, message* > map_t;
228  typedef map_t::value_type entry_t;
229  typedef map_t::iterator it_t;
230  typedef map_t::const_iterator cit_t;
231 
232  map_t f_map;
233 
237  std::ostream* f_terminal_stream;
239  std::ostream* f_log_stream;
240  };
241 
242 }
243 
244 #include "initializer.hh"
245 
246 #define message_declare( x_name )\
247 namespace midge\
248 {\
249  LOGGER( mmlog_##x_name, "x_name" );\
250  /* \
251  class message_ ## x_name :\
252  public message\
253  {\
254  public:\
255  message_ ## x_name();\
256  virtual ~message_ ## x_name();\
257  };\
258 \
259  extern message_ ## x_name& x_name;\
260  static initializer< message_ ## x_name > x_name ## _initializer;\
261  */ \
262 }
263 
264 #define message_define( x_name, x_key, x_label )\
265 namespace midge\
266 {\
267  /* \
268  message_ ## x_name::message_ ## x_name() :\
269  message( #x_key, #x_label, "", "" )\
270  {\
271  }\
272  message_ ## x_name::~message_ ## x_name()\
273  {\
274  }\
275 \
276  message_ ## x_name& x_name = *((message_ ## x_name*) (initializer< message_ ## x_name >::f_data));\
277  */ \
278 }
279 
280 #define message_define_full( x_name, x_key, x_label, x_prefix, x_suffix )\
281 namespace midge\
282 {\
283  /* \
284  message_ ## x_name::message_ ## x_name() :\
285  message( #x_key, #x_label, #x_prefix, #x_suffix )\
286  {\
287  }\
288  message_ ## x_name::~message_ ## x_name()\
289  {\
290  }\
291 \
292  message_ ## x_name& x_name = *((message_ ## x_name*) (initializer< message_ ## x_name >::f_data));\
293  */ \
294 }
295 
296 //#ifdef MIDGE_ENABLE_DEBUG_MESSAGES
297 #ifndef NDEBUG
298 //#define msg_debug( x_name, x_content ) x_name( s_debug ) << x_content
299 #define msg_debug( x_name, x_content ) LDEBUG( mmlog_##x_name, x_content );
300 #else
301 #define msg_debug( x_name, x_content )
302 #endif
303 //#define msg_normal( x_name, x_content ) x_name( s_normal ) << x_content
304 #define msg_normal( x_name, x_content ) LINFO( mmlog_##x_name, x_content );
305 //#define msg_warning( x_name, x_content ) x_name( s_warning ) << x_content
306 #define msg_warning( x_name, x_content ) LWARN( mmlog_##x_name, x_content );
307 //#define msg_error( x_name, x_content ) x_name( s_error ) << x_content
308 #define msg_error( x_name, x_content ) LERROR( mmlog_##x_name, x_content );
309 
310 message_declare( msg );
311 
312 #endif
std::string f_key
message_severity f_log_severity
static const message_end eom
Definition: _buffer.hh:11
std::string message::* f_color_suffix
std::string f_system_suffix
std::string f_system_description
std::ostream * f_terminal_stream
std::ostream & operator<<(std::ostream &a_str, const message_line &)
std::string f_default_color_prefix
std::vector< std::string > f_message_lines
std::string f_error_description
static const message_line ret
static std::mutex f_inner
static const message_severity s_debug
std::string f_normal_color_suffix
map_t::iterator it_t
message_severity f_terminal_severity
std::streamsize message_precision
std::string f_warning_color_suffix
static const message_severity s_error
std::string f_warning_color_prefix
map_t::value_type entry_t
std::string f_debug_color_prefix
std::stringstream f_message_line
message_severity f_log_severity
message & operator()(const message_severity &)
std::ostream * f_log_stream
std::string message::* f_description
std::ios_base::fmtflags message_format
message_format f_format
map_t::const_iterator cit_t
static const message_severity s_normal
static const message_severity s_warning
std::string f_system_prefix
#define message_declare(x_name)
std::string f_normal_color_prefix
std::string f_normal_description
static std::set< std::thread::id > f_threads
std::string message::* f_color_prefix
message & operator<<(const XPrintable &p_fragment)
std::map< std::string, message *> map_t
message_severity f_severity
std::string f_error_color_prefix
message_severity f_terminal_severity
std::string f_default_description
int message_severity
std::string f_error_color_suffix
std::ostream * f_terminal_stream
std::ostream * f_log_stream
std::string f_debug_description
std::string f_default_color_suffix
message_precision f_precision
std::string f_warning_description
static std::mutex f_outer
std::string f_debug_color_suffix