TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
Log.h
Veure la documentació d'aquest fitxer.
1 #if !defined(_TFCWEB_LOG_H_)
2 #define _TFCWEB_LOG_H_
3 
43 /*
44  * Copyright (c) 2012 Toni Corvera
45  *
46  * This file is part of TFCWeb.
47  *
48  * TFCWeb is free software: you can redistribute it and/or modify
49  * it under the terms of the GNU General Public License as published by
50  * the Free Software Foundation, either version 3 of the License, or
51  * (at your option) any later version.
52  *
53  * TFCWeb is distributed in the hope that it will be useful,
54  * but WITHOUT ANY WARRANTY; without even the implied warranty of
55  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
56  * GNU General Public License for more details.
57  *
58  * You should have received a copy of the GNU General Public License
59  * along with TFCWeb. If not, see <http://www.gnu.org/licenses/>.
60  */
61 // La construcció de missatges combinada amb una impressió "atòmica" hauria de permetre
62 // treballar cocurrentment sense problema
63 
64 #include "Excepcions.h"
65 
66 #include <fstream>
67 #include <memory>
68 #include <ostream>
69 #include <sstream>
70 #include <stdexcept>
71 #include <string>
72 #include <vector>
73 #include <boost/filesystem.hpp>
74 #include <boost/thread.hpp>
75 
76 namespace tfc {
77 
79 // EXCEPCIONS
81 
86 class ErrorLogNoValid : public ErrorTFC {
87 public:
88  explicit ErrorLogNoValid(const std::string & w = "Fitxer de log no vàlid")
89  : ErrorTFC(w)
90  {
91  // buit
92  }
93 };
94 
100 public:
101  explicit ErrorDestiNoAssociat(const std::string & w = "Destí de logging desconegut")
102  : ErrorTFC(w)
103  {
104  // buit
105  }
106 };
107 
109 // MISSATGES DE LOGGING
111 
116 enum NivellLog {
125 };
126 
127 // Forward declarations
128 class Log;
129 class MissatgeLog;
134 class ManipuladorParametritzat;
138 class DestiLogging;
139 
145 MissatgeLog log();
146 
155 void commit(MissatgeLog & ml);
156 
160 MissatgeLog& rollback(MissatgeLog & ml);
161 
172 std::shared_ptr<ManipuladorParametritzat> nivell(NivellLog n);
173 
178 class MissatgeLog {
179 public:
183  template<typename T> MissatgeLog& operator<<(const T & t) {
184  oss_ << t;
185  return *this;
186  }
187 
192  nivell(n);
193  return *this;
194  }
195 
204  return manipulador(*this);
205  }
206 
211  MissatgeLog& operator<<(const std::shared_ptr<ManipuladorParametritzat> &);
212 
219  void operator<<(void(*finalitzador)(MissatgeLog&)) {
220  finalitzador(*this);
221  }
222 
229  MissatgeLog& operator<<(std::ostream&(*tt)(std::ostream&)) {
230  oss_ << tt;
231  return *this;
232  }
233 
235  std::string str() const { return oss_.str(); }
236 
238  NivellLog nivell() const { return nivell_; }
239 
241  void nivell(NivellLog n) { nivell_ = n; }
242 private:
245  {
246  // buit
247  }
249  : nivell_(m.nivell_), oss_(m.oss_.str())
250  {
251  // buit
252  }
253 
254  // Construcció
255  friend MissatgeLog log();
256  // Detalls d'implementació en forma de manipuladors:
257  friend void commit(MissatgeLog &ml);
258  friend MissatgeLog& rollback(MissatgeLog & ml);
259 
261  std::ostringstream oss_;
262 };
263 
279 class Log {
280 public:
284  static Log& singleton();
285 
290  void associa(std::ostream & os, NivellLog n = NIVELL_PER_DEFECTE_LOG);
291 
299  throw (ErrorLogNoValid);
300 
306  void desassocia(std::ostream & os);
307 
312  void imprimeix(const MissatgeLog & ml);
313 
320  NivellLog nivell_sortida(const std::ostream & d) const
321  throw (ErrorDestiNoAssociat);
324  throw (ErrorDestiNoAssociat);
331  void nivell_sortida(const std::ostream & d, NivellLog nn)
332  throw (ErrorDestiNoAssociat);
335  throw (ErrorDestiNoAssociat);
336 
340  void nivell_sortida(NivellLog nn);
341 
342 protected:
343  Log()
344  : destins_()
345  {
346  // buit
347  }
348 
350  static std::string marca_de_temps();
351 private:
353  Log(const Log & l) { throw ErrorNoImplementat(FITXER_I_LINIA_); }
354 
356  Log& operator=(const Log &) {
358  return *this;
359  }
360 
361  std::vector< std::shared_ptr<DestiLogging> > destins_;
362 };
363 
364 } // ns tfc
365 
366 #endif // _TFCWEB_LOG_H_
367 
368 // vim:set ts=4 et ai: //