OpenMS  2.4.0
LogStream.h
Go to the documentation of this file.
1 // --------------------------------------------------------------------------
2 // OpenMS -- Open-Source Mass Spectrometry
3 // --------------------------------------------------------------------------
4 // Copyright The OpenMS Team -- Eberhard Karls University Tuebingen,
5 // ETH Zurich, and Freie Universitaet Berlin 2002-2018.
6 //
7 // This software is released under a three-clause BSD license:
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of any author or any participating institution
14 // may be used to endorse or promote products derived from this software
15 // without specific prior written permission.
16 // For a full list of authors, refer to the file AUTHORS.
17 // --------------------------------------------------------------------------
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL ANY OF THE AUTHORS OR THE CONTRIBUTING
22 // INSTITUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // --------------------------------------------------------------------------
31 // $Maintainer: Chris Bielow $
32 // $Authors: Chris Bielow, Stephan Aiche, Andreas Bertsch$
33 // --------------------------------------------------------------------------
34 
35 #pragma once
36 
38 
39 
40 #include <sstream>
41 #include <iostream>
42 #include <list>
43 #include <vector>
44 #include <ctime>
45 #include <map>
46 
47 namespace OpenMS
48 {
75  namespace Logger
76  {
77  // forward declarations
78  class LogStream;
79  class LogStreamNotifier;
80 
102  class OPENMS_DLLAPI LogStreamBuf :
103  public std::streambuf
104  {
105 
106  friend class LogStream;
107 
108 public:
109 
111 
112  static const time_t MAX_TIME;
113  static const std::string UNKNOWN_LOG_LEVEL;
115 
117 
118 
123  explicit LogStreamBuf(std::string log_level = UNKNOWN_LOG_LEVEL);
124 
128  ~LogStreamBuf() override;
129 
131 
133 
134 
145  int sync() override;
146 
151  int overflow(int c = -1) override;
153 
154 
156 
157 
162  void setLevel(std::string level);
163 
164 
168  std::string getLevel();
170 
176  struct OPENMS_DLLAPI StreamStruct
177  {
178  std::ostream * stream;
179  std::string prefix;
181 
183  stream(nullptr),
184  target(nullptr)
185  {}
186 
189  {}
190 
191  };
192 
198  void clearCache();
199 
200 protected:
201 
203  void distribute_(std::string outstring);
204 
206  std::string expandPrefix_(const std::string & prefix, time_t time) const;
207 
208  char * pbuf_;
209  std::string level_;
210  std::list<StreamStruct> stream_list_;
211  std::string incomplete_line_;
212 
214 
215 
220  {
222  int counter;
223  };
224 
230 
232  std::map<std::string, LogCacheStruct> log_cache_;
234  std::map<Size, std::string> log_time_cache_;
235 
237  bool isInCache_(std::string const & line);
238 
247  std::string addToCache_(std::string const & line);
248 
250  Size getNextLogCounter_();
251 
253  int syncLF_();
255  };
256 
258  class OPENMS_DLLAPI LogStreamNotifier
259  {
260 public:
261 
264 
266  virtual ~LogStreamNotifier();
267 
269  virtual void logNotify();
270 
272  void registerAt(LogStream & log_stream);
273 
275  void unregister();
276 
277 protected:
278  std::stringstream stream_;
279 
281  };
282 
283 
304  class OPENMS_DLLAPI LogStream :
305  public std::ostream
306  {
307 public:
308 
310 
311 
321  LogStream(LogStreamBuf * buf = nullptr, bool delete_buf = true, std::ostream * stream = nullptr);
322 
324  ~LogStream() override;
326 
328 
329 
336  LogStreamBuf * rdbuf();
337 
339  LogStreamBuf * operator->();
341 
342 
344 
345 
351  void setLevel(std::string level);
352 
353 
357  std::string getLevel();
359 
361 
362 
377  void insert(std::ostream & s);
378 
389  void remove(std::ostream & s);
390 
392  void insertNotification(std::ostream & s,
393  LogStreamNotifier & target);
394 
415  void setPrefix(const std::ostream & s, const std::string & prefix);
416 
417 
419  void setPrefix(const std::string & prefix);
420 
422  void flush();
424 private:
425 
426  typedef std::list<LogStreamBuf::StreamStruct>::iterator StreamIterator;
427 
428  StreamIterator findStream_(const std::ostream & stream);
429  bool hasStream_(std::ostream & stream);
430  bool bound_() const;
431 
437 
438  }; //LogStream
439 
440  } // namespace Logger
441 
442 
444 #define LOG_FATAL_ERROR \
445  Log_fatal << __FILE__ << "(" << __LINE__ << "): "
446 
448 #define LOG_ERROR \
449  Log_error
450 
452 #define LOG_WARN \
453  Log_warn
454 
456 #define LOG_INFO \
457  Log_info
458 
460 #define LOG_DEBUG \
461  Log_debug << __FILE__ << "(" << __LINE__ << "): "
462 
463  OPENMS_DLLAPI extern Logger::LogStream Log_fatal;
464  OPENMS_DLLAPI extern Logger::LogStream Log_error;
465  OPENMS_DLLAPI extern Logger::LogStream Log_warn;
466  OPENMS_DLLAPI extern Logger::LogStream Log_info;
467  OPENMS_DLLAPI extern Logger::LogStream Log_debug;
468 
469 } // namespace OpenMS
470 
std::string level_
Definition: LogStream.h:209
Logger::LogStream Log_debug
Global static instance of a LogStream to capture messages classified as debug output. By default it is not bound to any output stream. TOPP(AS)Base will connect cout, iff 0 < debug-level.
Logger::LogStream Log_warn
Global static instance of a LogStream to capture messages classified as warnings. By default it is bo...
static const std::string UNKNOWN_LOG_LEVEL
Definition: LogStream.h:113
Definition: LogStream.h:258
LogStream * registered_at_
Definition: LogStream.h:280
const double c
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:46
StreamStruct()
Definition: LogStream.h:182
std::list< StreamStruct > stream_list_
Definition: LogStream.h:210
bool delete_buffer_
Definition: LogStream.h:436
Log Stream Class.
Definition: LogStream.h:304
Logger::LogStream Log_info
Global static instance of a LogStream to capture messages classified as information. By default it is bound to cout.
std::ostream * stream
Definition: LogStream.h:178
std::map< Size, std::string > log_time_cache_
Cache of the occurrence sequence of the last two log messages.
Definition: LogStream.h:234
std::string prefix
Definition: LogStream.h:179
Logger::LogStream Log_error
Global static instance of a LogStream to capture messages classified as errors. By default it is boun...
std::stringstream stream_
Definition: LogStream.h:278
Size log_cache_counter_
Definition: LogStream.h:229
~StreamStruct()
Delete the notification target.
Definition: LogStream.h:188
Holds a stream that is connected to the LogStream. It also includes the minimum and maximum level at ...
Definition: LogStream.h:176
std::string incomplete_line_
Definition: LogStream.h:211
std::map< std::string, LogCacheStruct > log_cache_
Cache of the last two log messages.
Definition: LogStream.h:232
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:127
LogStreamNotifier * target
Definition: LogStream.h:180
Logger::LogStream Log_fatal
Global static instance of a LogStream to capture messages classified as fatal errors. By default it is bound to cerr.
char * pbuf_
Definition: LogStream.h:208
static const time_t MAX_TIME
Definition: LogStream.h:112
std::list< LogStreamBuf::StreamStruct >::iterator StreamIterator
Definition: LogStream.h:426
int counter
Definition: LogStream.h:222
Size timestamp
Definition: LogStream.h:221
Stream buffer used by LogStream.
Definition: LogStream.h:102
Holds a counter of occurrences and an index for the occurrence sequence of the corresponding log mess...
Definition: LogStream.h:219