DiaDes  0.1
DIAgnosis of Discrete-Event System
Logger.hh
Go to the documentation of this file.
1 #ifndef __DIADES__UTILS__LOGGER__HH
2 #define __DIADES__UTILS__LOGGER__HH
3 
13 #include <string>
14 #include <vector>
15 #include <list>
16 #include <unordered_map>
17 #include <ostream>
18 #include <boost/date_time/posix_time/posix_time.hpp>
19 
20 using namespace boost::posix_time;
21 using std::vector;
22 using std::list;
23 using std::pair;
24 using std::unordered_map;
25 using std::ostream;
26 using std::string;
27 
28 namespace Diades
29 {
30 
31 
32  namespace Utils
33  {
34  class LoggerFactory;
35  class Log;
36 
37 
49  typedef enum { LgNothing=0, LgOutput=1, LgProcess=2, LgCritical=3, LgError=4, LgWarning=5, LgInfo=6, LgDebug=7 } LogLevel;
50 
51 
52 
53 
58  class LoggerData
59  {
60  public:
61  typedef LogLevel Level;
62  private:
63  mutable vector< list< pair<ptime,string> > > _logs;
64  mutable vector< list< pair<ptime,string> >::iterator > _unsavedBegin;
65 
70  LoggerData();
71 
72  public:
77  {
78  _logs.clear(); _unsavedBegin.clear();
79  }
80  private:
88  void trace(Level level, ptime time, const string & msg);
89 
90 
99  void printLevel(Level level,ostream & os) const;
100 
101 
110  friend ostream & operator << (ostream & os, const LoggerData & logger);
111  friend class Logger;
112  friend class LoggerFactory;
113  };
114 
115 
116 
117  /*******************************************************************************/
118 
119 
133  class Logger
134  {
135  private:
136  //mutable
137  std::shared_ptr<LoggerData> _data;
138  public:
139  typedef LogLevel Level;
140  public:
141 
146  Logger();
147 
153  Logger(const string & name);
154 
160  Logger(const Logger & logger):_data(logger._data){}
161 
167 
168  private:
169 
174  Logger(std::shared_ptr<LoggerData> data):_data(data){}
175 
176 
184  void trace(Level level, ptime time, const string & msg) const
185  {
186  _data->trace(level,time,msg);
187  }
188 
189  public:
198  void printLevel(Level level,ostream & os)
199  {
200  _data->printLevel(level,os);
201  }
202 
211  friend ostream & operator << (ostream & os, const Logger & logger)
212  {
213  return os << *(logger._data);
214  }
215  friend class LoggerFactory;
216  friend class Log;
217  };
218 
219 
220  /*******************************************************************************/
221 
230  {
231  private:
233  std::shared_ptr<LoggerData> _defaultLogger;
234  unordered_map<string, std::shared_ptr<LoggerData>> _loggers;
235  vector<string> _levelLabels;
236  protected:
241  LoggerFactory();
242 
243 
244  public:
245 
253  static void destroy();
254 
255 
256 
257 
258  public:
259 
260 
261 
265  const string & getLabel(LogLevel level) const
266  {
267  return _levelLabels[level];
268  }
269 
274  ~LoggerFactory();
275 
276 
283  static LoggerFactory * factory();
291  Logger getLogger(const string & name)
292  {
293  unordered_map<string, std::shared_ptr<LoggerData> >::const_iterator it = _loggers.find(name);
294  if(it==_loggers.end())
295  {
296  std::shared_ptr<LoggerData> newOne(new LoggerData());
297  _loggers[name]=newOne;
298  return Logger(newOne);
299  }
300  return Logger(it->second);
301  }
302 
310  {
311  return Logger(_defaultLogger);
312  }
321  friend ostream & operator << (ostream & os, const LoggerFactory & loggers);
322 
323  };
324 
325 
326 
327 
328  };
329 };
330 
331 
332 #endif
const string & getLabel(LogLevel level) const
Definition: Logger.hh:265
vector< string > _levelLabels
Definition: Logger.hh:235
Logger(const Logger &logger)
Definition: Logger.hh:160
Logger getLogger(const string &name)
Definition: Logger.hh:291
vector< list< pair< ptime, string > > > _logs
Definition: Logger.hh:63
unordered_map< string, std::shared_ptr< LoggerData > > _loggers
Definition: Logger.hh:234
void trace(Level level, ptime time, const string &msg) const
Definition: Logger.hh:184
std::shared_ptr< LoggerData > _defaultLogger
Definition: Logger.hh:233
Logger(std::shared_ptr< LoggerData > data)
Definition: Logger.hh:174
Namespace of the Diades project.
vector< list< pair< ptime, string > >::iterator > _unsavedBegin
Definition: Logger.hh:64
std::ostream & operator<<(std::ostream &os, const Identifier &identifier)
Definition: Identifier.hh:501
static LoggerFactory * _instance
Definition: Logger.hh:232
std::shared_ptr< LoggerData > _data
Definition: Logger.hh:137
void printLevel(Level level, ostream &os)
Definition: Logger.hh:198