TFCweb
1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
Pàgina principal
Pàgines Relacionades
Espais de Noms
Classes
Fitxers
Llista dels Fitxers
Membres de Fitxers
src
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
99
class
ErrorDestiNoAssociat
:
public
ErrorTFC
{
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
{
117
NivellDebug
= 1,
118
NivellInfo
,
119
NivellWarning
,
120
NivellError
,
121
NIVELL_PER_DEFECTE_LOG
=
NivellDebug
,
// FIXME
122
NIVELL_MES_SILENCIOS
=
NivellError
,
123
NIVELL_MES_VERBOS
=
NivellDebug
,
124
NIVELL_PER_DEFECTE_MISSATGE
=
NivellWarning
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
191
MissatgeLog
&
operator<<
(
NivellLog
n) {
192
nivell
(n);
193
return
*
this
;
194
}
195
203
MissatgeLog
&
operator<<
(
MissatgeLog
&(*manipulador)(
MissatgeLog
&)) {
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
:
243
MissatgeLog
()
244
:
nivell_
(
NIVELL_PER_DEFECTE_MISSATGE
),
oss_
()
245
{
246
// buit
247
}
248
MissatgeLog
(
const
MissatgeLog
& m)
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
260
NivellLog
nivell_
;
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
298
void
associa
(
const
boost::filesystem::path
& f,
NivellLog
n =
NIVELL_PER_DEFECTE_LOG
)
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
);
323
NivellLog
nivell_sortida
(
const
boost::filesystem::path
& d)
const
324
throw
(
ErrorDestiNoAssociat
);
331
void
nivell_sortida
(
const
std::ostream & d,
NivellLog
nn)
332
throw
(
ErrorDestiNoAssociat
);
334
void
nivell_sortida
(
const
boost::filesystem::path
& d,
NivellLog
nn)
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
&) {
357
throw
ErrorNoImplementat
(
FITXER_I_LINIA_
);
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: //
Generat a Dl Jun 17 2013 20:07:39 per a TFCweb per
1.8.1.2