TPIE

11a2c2d
tpie_log.h
Go to the documentation of this file.
1 // -*- mode: c++; tab-width: 4; indent-tabs-mode: t; eval: (progn (c-set-style "stroustrup") (c-set-offset 'innamespace 0)); -*-
2 // vi:set ts=4 sts=4 sw=4 noet :
3 // Copyright 2008, 2011, The TPIE development team
4 //
5 // This file is part of TPIE.
6 //
7 // TPIE is free software: you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License as published by the
9 // Free Software Foundation, either version 3 of the License, or (at your
10 // option) any later version.
11 //
12 // TPIE is distributed in the hope that it will be useful, but WITHOUT ANY
13 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 // License for more details.
16 //
17 // You should have received a copy of the GNU Lesser General Public License
18 // along with TPIE. If not, see <http://www.gnu.org/licenses/>
19 
20 #ifndef _TPIE_LOG_H
21 #define _TPIE_LOG_H
22 
27 #include <tpie/tpie_export.h>
28 #include <vector>
29 #include <stack>
30 #include <memory>
31 #include <tpie/config.h>
32 #include <tpie/logstream.h>
33 #include <fstream>
34 
35 namespace tpie {
36 
38 class TPIE_EXPORT file_log_target: public log_target {
39 private:
40  std::stack<std::string> groups;
41 public:
42  std::ofstream m_out;
43  std::string m_path;
44  log_level m_threshold;
45 
49  file_log_target(log_level threshold);
50 
55  void log(log_level level, const char * message, size_t);
56 
61  void begin_group(const std::string & name);
62 
66  void end_group();
67 private:
68  std::string build_prefix(size_t length);
69 };
70 
72 class TPIE_EXPORT stderr_log_target: public log_target {
73 private:
74  std::stack<std::string> groups;
75 public:
76  log_level m_threshold;
77 
81  stderr_log_target(log_level threshold);
82 
88  void log(log_level level, const char * message, size_t size);
89 
94  void begin_group(const std::string & name);
95 
99  void end_group();
100 private:
101  std::string build_prefix(size_t length);
102 };
103 
104 
105 
106 
111 const std::string& log_name();
112 
116 void init_default_log();
117 
121 void finish_default_log();
122 
123 namespace log_bits {
124 
125 TPIE_EXPORT extern std::vector<std::shared_ptr<logstream> > log_instances;
126 
127 TPIE_EXPORT void initiate_log_level(log_level level);
128 
129 TPIE_EXPORT void flush_logs();
130 
131 }
132 
133 inline logstream & get_log_by_level(log_level level) {
134  using namespace log_bits;
135  if (log_instances.size() <= level || log_instances[level].get() == 0)
136  initiate_log_level(level);
137  return *log_instances[level];
138 }
139 
143 inline logstream & log_fatal() {return get_log_by_level(LOG_FATAL);}
144 
148 inline logstream & log_error() {return get_log_by_level(LOG_ERROR);}
149 
153 inline logstream & log_info() {return get_log_by_level(LOG_INFORMATIONAL);}
154 
158 inline logstream & log_warning() {return get_log_by_level(LOG_WARNING);}
159 
163 inline logstream & log_app_debug() {return get_log_by_level(LOG_APP_DEBUG);}
164 
168 inline logstream & log_debug() {return get_log_by_level(LOG_DEBUG);}
169 
173 inline logstream & log_mem_debug() {return get_log_by_level(LOG_MEM_DEBUG);}
174 
178 inline logstream & log_pipe_debug() {return get_log_by_level(LOG_PIPE_DEBUG);}
179 
181 private:
182  bool m_orig;
183 public:
184  inline bool get_orig() {return m_orig;}
185  inline scoped_log_enabler(bool e) {
186  m_orig = log_bits::logging_disabled;
187  log_bits::logging_disabled = !e;
188  }
189  inline ~scoped_log_enabler() {
190  log_bits::logging_disabled = m_orig;
191  }
192 };
193 
194 namespace log_bits {
195 
196 class TPIE_EXPORT log_selector {
197 private:
198  static bool s_init;
199  static log_level s_level;
200 
201  logstream & get_log() {
202  if (!s_init) {
203  s_init = true;
204  s_level = LOG_INFORMATIONAL;
205  }
206  switch (s_level) {
207  case LOG_FATAL:
208  return log_fatal();
209  case LOG_ERROR:
210  return log_error();
211  case LOG_INFORMATIONAL:
212  return log_info();
213  case LOG_WARNING:
214  return log_warning();
215  case LOG_APP_DEBUG:
216  return log_app_debug();
217  case LOG_DEBUG:
218  return log_debug();
219  case LOG_MEM_DEBUG:
220  return log_mem_debug();
221  case LOG_PIPE_DEBUG:
222  return log_pipe_debug();
223  case LOG_USER1:
224  case LOG_USER2:
225  case LOG_USER3:
226  break;
227  }
228  return log_info();
229  }
230 
231 public:
232  log_selector & operator<<(log_level_manip mi) {
233  set_level(mi.get_level());
234  return *this;
235  }
236 
237  template <typename T>
238  logstream & operator<<(const T & x) {
239  logstream & res = get_log();
240  res << x;
241  return res;
242  }
243 
244  void flush() {
245  get_log().flush();
246  }
247 
248  void set_level(log_level level) {
249  s_init = true;
250  s_level = level;
251  }
252 
253  void add_target(log_target * t) { add_log_target(t); }
254 
255  void remove_target(log_target * t) { remove_log_target(t); }
256 };
257 
258 } // namespace log_bits
259 
264 
265 #if TPL_LOGGING
266 #define TP_LOG_FLUSH_LOG tpie::get_log().flush()
268 
270 #define TP_LOG_FATAL(msg) tpie::log_fatal() << msg
271 #define TP_LOG_WARNING(msg) tpie::log_warning() << msg
273 #define TP_LOG_APP_DEBUG(msg) tpie::log_app_debug() << msg
275 #define TP_LOG_DEBUG(msg) tpie::log_debug() << msg
277 #define TP_LOG_MEM_DEBUG(msg) tpie::log_mem_debug() << msg
279 
280 #define TP_LOG_ID_MSG __FILE__ << " line " << __LINE__ << ": "
281 
283 #define TP_LOG_FATAL_ID(msg) TP_LOG_FATAL(TP_LOG_ID_MSG << msg << std::endl)
284 
286 #define TP_LOG_WARNING_ID(msg) TP_LOG_WARNING(TP_LOG_ID_MSG << msg << std::endl)
287 
289 #define TP_LOG_APP_DEBUG_ID(msg) TP_LOG_APP_DEBUG(TP_LOG_ID_MSG << msg << std::endl)
290 
292 #define TP_LOG_DEBUG_ID(msg) TP_LOG_DEBUG(TP_LOG_ID_MSG << msg << std::endl)
293 
295 #define TP_LOG_MEM_DEBUG_ID(msg) TP_LOG_MEM_DEBUG(TP_LOG_ID_MSG << msg << std::endl)
296 
297 #else // !TPL_LOGGING
298 
299 // We are not compiling logging.
300 #define TP_LOG_FATAL(msg)
301 #define TP_LOG_WARNING(msg)
302 #define TP_LOG_APP_DEBUG(msg)
303 #define TP_LOG_DEBUG(msg)
304 #define TP_LOG_MEM_DEBUG(msg)
305 
306 #define TP_LOG_FATAL_ID(msg)
307 #define TP_LOG_WARNING_ID(msg)
308 #define TP_LOG_APP_DEBUG_ID(msg)
309 #define TP_LOG_DEBUG_ID(msg)
310 #define TP_LOG_MEM_DEBUG_ID(msg)
311 
312 #define TP_LOG_FLUSH_LOG {}
313 
314 #endif // TPL_LOGGING
315 
316 } // tpie namespace
317 
318 #endif // _TPIE_LOG_H
tpie::LOG_USER1
@ LOG_USER1
Logging levels to be further defined by user applications.
Definition: loglevel.h:62
tpie::log_mem_debug
logstream & log_mem_debug()
Return logstream for writing mem_debug log messages.
Definition: tpie_log.h:173
tpie::stderr_log_target
A simple logger that writes messages to stderr.
Definition: tpie_log.h:72
tpie::log_level_manip
Definition: logstream.h:106
tpie::LOG_INFORMATIONAL
@ LOG_INFORMATIONAL
LOG_INFORMATIONAL is used for informational messagse.
Definition: loglevel.h:46
tpie::log_level
log_level
TPIE logging levels, from higest priority to lowest.
Definition: loglevel.h:33
tpie::LOG_FATAL
@ LOG_FATAL
LOG_FATAL is the highest error level and is used for all kinds of errors that would normally impair s...
Definition: loglevel.h:37
tpie::LOG_APP_DEBUG
@ LOG_APP_DEBUG
LOG_APP_DEBUG can be used by applications built on top of TPIE, for logging debugging information.
Definition: loglevel.h:50
tpie::log_error
logstream & log_error()
Return logstream for writing error log messages.
Definition: tpie_log.h:148
tpie::log_info
logstream & log_info()
Return logstream for writing info log messages.
Definition: tpie_log.h:153
tpie::finish_default_log
void finish_default_log()
Used by tpie_finish to deinitialize the log subsystem.
tpie::file_log_target
A simple logger that writes messages to a tpie temporary file.
Definition: tpie_log.h:38
tpie::log_pipe_debug
logstream & log_pipe_debug()
Return logstream for writing pipe_debug log messages.
Definition: tpie_log.h:178
tpie::log_warning
logstream & log_warning()
Return logstream for writing warning log messages.
Definition: tpie_log.h:158
tpie::get_log
log_bits::log_selector get_log()
Returns the only logstream object.
Definition: tpie_log.h:263
tpie::log_debug
logstream & log_debug()
Return logstream for writing debug log messages.
Definition: tpie_log.h:168
tpie::scoped_log_enabler
Definition: tpie_log.h:180
tpie::log_app_debug
logstream & log_app_debug()
Return logstream for writing app_debug log messages.
Definition: tpie_log.h:163
tpie::LOG_DEBUG
@ LOG_DEBUG
LOG_DEBUG is the lowest level and is used by the TPIE library for logging debugging information.
Definition: loglevel.h:54
tpie::log_target
Definition: logstream.h:41
tpie::log_bits::log_selector
Definition: tpie_log.h:196
tpie::LOG_ERROR
@ LOG_ERROR
LOG_ERROR is used for none fatal errors.
Definition: loglevel.h:40
tpie::log_fatal
logstream & log_fatal()
Return logstream for writing fatal log messages.
Definition: tpie_log.h:143
tpie::logstream
A log is like a regular output stream, but it also supports messages at different priorities,...
Definition: logstream.h:84
tpie::LOG_WARNING
@ LOG_WARNING
LOG_WARNING is used for warnings.
Definition: loglevel.h:43
tpie::LOG_MEM_DEBUG
@ LOG_MEM_DEBUG
Logging level for warnings concerning memory allocation and deallocation.
Definition: loglevel.h:57
logstream.h
tpie::log_name
const std::string & log_name()
Returns the file name of the log stream.
tpie::init_default_log
void init_default_log()
Used by tpie_init to initialize the log subsystem.
tpie
Definition: access_type.h:26