Gaudi Framework, version v24r2
Home
Generated: Wed Dec 4 2013
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
GaudiMonitor
src
IssueLogger.cpp
Go to the documentation of this file.
1
#include "
IssueLogger.h
"
2
3
#include "
GaudiKernel/SvcFactory.h
"
4
#include "
GaudiKernel/ISvcLocator.h
"
5
#include "
GaudiKernel/MsgStream.h
"
6
#include "
GaudiKernel/Tokenizer.h
"
7
#include "
GaudiKernel/System.h
"
8
#include "
GaudiKernel/Time.h
"
9
10
#include <
sstream
>
11
#include <
streambuf
>
12
#include <
algorithm
>
13
14
#include "boost/bind.hpp"
15
16
using namespace
std
;
17
18
DECLARE_SERVICE_FACTORY
(
IssueLogger
)
19
20
//*************************************************************************//
21
inline
void
toupper
(
std
::
string
&
s
)
22
{
23
std::transform
(s.begin(), s.end(), s.begin(),
24
(
int
(*)(
int
))
toupper
);
25
}
26
27
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
28
29
IssueLogger::IssueLogger
(
const
std::string
& name,
ISvcLocator
* svc )
30
:
base_class
(name, svc) {
31
32
declareProperty
(
"Output"
,
m_outputfile
);
33
declareProperty
(
"ReportLevel"
,
m_reportLevelS
=
"WARNING"
);
34
declareProperty
(
"TracebackLevel"
,
m_traceLevelS
=
"ERROR"
);
35
declareProperty
(
"ShowTime"
,
m_showTime
=
false
);
36
37
m_reportLevelS
.
declareUpdateHandler
(&
IssueLogger::setupLevels
,
this
);
38
m_traceLevelS
.
declareUpdateHandler
(&
IssueLogger::setupLevels
,
this
);
39
m_outputfile
.
declareUpdateHandler
(&
IssueLogger::setupStreams
,
this
);
40
41
m_reportLevel
=
IssueSeverity::WARNING
;
42
m_traceLevel
=
IssueSeverity::ERROR
;
43
44
for
(
int
i
=0;
i
<
IssueSeverity::NUM_LEVELS
; ++
i
) {
45
m_logger
[
i
] = 0;
46
}
47
48
m_msgSevMap
[
MSG::NIL
] =
IssueSeverity::NIL
;
49
m_msgSevMap
[
MSG::VERBOSE
] =
IssueSeverity::VERBOSE
;
50
m_msgSevMap
[
MSG::DEBUG
] =
IssueSeverity::DEBUG
;
51
m_msgSevMap
[
MSG::INFO
] =
IssueSeverity::INFO
;
52
m_msgSevMap
[
MSG::WARNING
] =
IssueSeverity::WARNING
;
53
m_msgSevMap
[
MSG::ERROR
] =
IssueSeverity::ERROR
;
54
m_msgSevMap
[
MSG::FATAL
] =
IssueSeverity::FATAL
;
55
m_msgSevMap
[
MSG::ALWAYS
] =
IssueSeverity::ALWAYS
;
56
57
m_sevMsgMap
[
IssueSeverity::NIL
] =
MSG::NIL
;
58
m_sevMsgMap
[
IssueSeverity::VERBOSE
] =
MSG::VERBOSE
;
59
m_sevMsgMap
[
IssueSeverity::DEBUG
] =
MSG::DEBUG
;
60
m_sevMsgMap
[
IssueSeverity::DEBUG1
] =
MSG::DEBUG
;
61
m_sevMsgMap
[
IssueSeverity::DEBUG2
] =
MSG::DEBUG
;
62
m_sevMsgMap
[
IssueSeverity::DEBUG3
] =
MSG::DEBUG
;
63
m_sevMsgMap
[
IssueSeverity::INFO
] =
MSG::INFO
;
64
m_sevMsgMap
[
IssueSeverity::WARNING
] =
MSG::WARNING
;
65
m_sevMsgMap
[
IssueSeverity::RECOVERABLE
] =
MSG::ERROR
;
66
m_sevMsgMap
[
IssueSeverity::ERROR
] =
MSG::ERROR
;
67
m_sevMsgMap
[
IssueSeverity::FATAL
] =
MSG::FATAL
;
68
m_sevMsgMap
[
IssueSeverity::ALWAYS
] =
MSG::ALWAYS
;
69
70
m_levelTrans
[
IssueSeverity::VERBOSE
] =
"VERBOSE"
;
71
m_levelTrans
[
IssueSeverity::DEBUG
] =
"DEBUG"
;
72
m_levelTrans
[
IssueSeverity::DEBUG1
] =
"DEBUG1"
;
73
m_levelTrans
[
IssueSeverity::DEBUG2
] =
"DEBUG2"
;
74
m_levelTrans
[
IssueSeverity::DEBUG3
] =
"DEBUG3"
;
75
m_levelTrans
[
IssueSeverity::INFO
] =
"INFO"
;
76
m_levelTrans
[
IssueSeverity::WARNING
] =
"WARNING"
;
77
m_levelTrans
[
IssueSeverity::RECOVERABLE
] =
"RECOVERABLE"
;
78
m_levelTrans
[
IssueSeverity::ERROR
] =
"ERROR"
;
79
m_levelTrans
[
IssueSeverity::FATAL
] =
"FATAL"
;
80
m_levelTrans
[
IssueSeverity::ALWAYS
] =
"ALWAYS"
;
81
82
m_levelSTrans
[
"VERBOSE"
] =
IssueSeverity::VERBOSE
;
83
m_levelSTrans
[
"DEBUG"
] =
IssueSeverity::DEBUG
;
84
m_levelSTrans
[
"DEBUG1"
] =
IssueSeverity::DEBUG1
;
85
m_levelSTrans
[
"DEBUG2"
] =
IssueSeverity::DEBUG2
;
86
m_levelSTrans
[
"DEBUG3"
] =
IssueSeverity::DEBUG3
;
87
m_levelSTrans
[
"INFO"
] =
IssueSeverity::INFO
;
88
m_levelSTrans
[
"WARNING"
] =
IssueSeverity::WARNING
;
89
m_levelSTrans
[
"RECOVERABLE"
] =
IssueSeverity::RECOVERABLE
;
90
m_levelSTrans
[
"ERROR"
] =
IssueSeverity::ERROR
;
91
m_levelSTrans
[
"FATAL"
] =
IssueSeverity::FATAL
;
92
m_levelSTrans
[
"ALWAYS"
] =
IssueSeverity::ALWAYS
;
93
94
95
}
96
97
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
98
99
IssueLogger::~IssueLogger
() {
100
101
}
102
103
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
104
105
StatusCode
106
IssueLogger::initialize
() {
107
108
StatusCode
st =
Service::initialize
();
109
if
(st.
isFailure
()) {
return
st; }
110
111
setupDefaultLogger
();
112
113
return
st;
114
115
}
116
117
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
118
119
StatusCode
120
IssueLogger::reinitialize
() {
121
122
MsgStream
log
(
msgSvc
(),
name
() );
123
log <<
MSG::WARNING
<<
"reinitialize not implemented"
<<
endmsg
;
124
125
126
return
StatusCode::SUCCESS
;
127
128
}
129
130
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
131
132
StatusCode
133
IssueLogger::finalize
() {
134
135
MsgStream
log
(
msgSvc
(),
name
() );
136
log <<
MSG::DEBUG
<<
"IssueLogger::finalize"
<<
endmsg
;
137
138
for
(
int
i
=0;
i
<
IssueSeverity::NUM_LEVELS
; ++
i
) {
139
IssueSeverity::Level
j =
IssueSeverity::Level
(
i
);
140
delete
m_logger
[j];
141
}
142
143
return
Service::finalize
();
144
}
145
146
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
147
148
void
149
IssueLogger::getTraceBack
(
std::string
&
stack
) {
150
const
int
depth = 30;
151
const
int
offset = 5;
152
System::backTrace
(stack, depth, offset);
153
}
154
155
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
156
157
StatusCode
158
IssueLogger::connect
(
const
std::string
& ident) {
159
160
MsgStream
log
(
msgSvc
(),
name
() );
161
Tokenizer
tok(
true
);
162
163
string::size_type
loc = ident.find(
" "
);
164
// string stream = ident.substr(0,loc); // icc remark #177: variable "stream" was declared but never referenced
165
// typedef std::pair<std::string,std::string> Prop;
166
// std::vector<Prop> props;
167
string
val,VAL,TAG,filename;
168
169
tok.
analyse
(ident.substr(loc+1,ident.length()),
" "
,
""
,
""
,
"="
,
"'"
,
"'"
);
170
171
for
(
Tokenizer::Items::iterator
i
= tok.
items
().
begin
();
172
i
!= tok.
items
().
end
();
i
++) {
173
const
std::string
& tag = (*i).tag();
174
TAG = tag;
175
toupper
(TAG);
176
177
val = (*i).value();
178
VAL = val;
179
toupper
(VAL);
180
181
IssueSeverity::Level
level
;
182
183
if
(TAG ==
"DEBUG"
) {
184
level =
IssueSeverity::DEBUG
;
185
}
else
if
( TAG ==
"INFO"
) {
186
level =
IssueSeverity::INFO
;
187
}
else
if
( TAG ==
"WARNING"
) {
188
level =
IssueSeverity::WARNING
;
189
}
else
if
( TAG ==
"RECOVERABLE"
) {
190
level =
IssueSeverity::RECOVERABLE
;
191
}
else
if
( TAG ==
"ERROR"
) {
192
level =
IssueSeverity::ERROR
;
193
}
else
if
( TAG ==
"FATAL"
) {
194
level =
IssueSeverity::FATAL
;
195
}
else
{
196
log <<
MSG::ERROR
<<
"Unknown output level \""
<< TAG <<
"\""
197
<<
endmsg
;
198
continue
;
199
}
200
201
if
(
m_logger
[level] != 0) {
202
log <<
MSG::INFO
<<
"closing stream "
<<
m_logger
[
level
]->
name
()
203
<<
endmsg
;
204
delete
m_logger
[
level
];
205
m_logger
[
level
] = 0;
206
}
207
208
if
(val ==
"MsgSvc"
) {
209
m_logger
[
level
] =
new
StreamLogger
(
msgSvc
(),
m_sevMsgMap
[level]);
210
m_log
[
level
] =
211
boost::bind(&
StreamLogger::WriteToMsgSvc
,
m_logger
[level],
212
_1);
213
}
else
if
(val ==
"STDERR"
) {
214
m_logger
[
level
] =
new
StreamLogger
(
std::cerr
);
215
m_log
[
level
] =
216
boost::bind(&
StreamLogger::WriteToStream
,
m_logger
[level],
217
_1);
218
}
else
if
(val ==
"STDOUT"
) {
219
m_logger
[
level
] =
new
StreamLogger
(
std::cout
);
220
m_log
[
level
] =
221
boost::bind(&
StreamLogger::WriteToStream
,
m_logger
[level],
222
_1);
223
}
else
{
// A file
224
try
{
225
m_logger
[
level
] =
new
StreamLogger
(val.c_str());
226
}
227
catch
(
std::exception
&) {
228
m_logger
[
level
] = 0;
229
log <<
MSG::ERROR
<<
"Unable to open file \""
<< VAL
230
<<
"\" for writing issues at level "
<< TAG <<
endmsg
;
231
return
StatusCode::FAILURE
;
232
}
233
m_log
[
level
] =
234
boost::bind(&
StreamLogger::WriteToStream
,
m_logger
[level], _1);
235
}
236
log <<
MSG::DEBUG
<<
"Writing "
<<
m_levelTrans
[
level
]
237
<<
" issues to "
<<
m_logger
[
level
]->
name
() <<
endmsg
;
238
239
}
240
241
return
StatusCode::SUCCESS
;
242
}
243
244
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
245
246
void
247
IssueLogger::report
(
IssueSeverity::Level
lev,
const
std::string
& str,
248
const
std::string
& org) {
249
250
if
( lev <
m_reportLevel
)
return
;
251
252
std::string
msg
=
m_levelTrans
[lev] +
" "
+ org +
" \""
+ str +
"\""
;
253
254
if
(
m_showTime
) {
255
msg +=
" ["
+ Gaudi::Time::current().
format
(
true
,
"%H:%M:%S %Y/%m/%d %Z"
) +
"]"
;
256
}
257
258
if
(lev >=
m_traceLevel
) {
259
std::string
stack
;
260
getTraceBack
(stack);
261
msg +=
"\n"
+ stack;
262
}
263
264
265
m_log
[lev](
msg
);
266
267
268
}
269
270
271
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
272
273
274
void
275
IssueLogger::report
(
const
IssueSeverity
&err ) {
276
277
report
(err.
getLevel
(), err.
getMsg
(), err.
getOrigin
());
278
279
}
280
281
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
282
283
void
284
IssueLogger::setupLevels
(
Property
& prop) {
285
286
287
StringProperty
*sap =
dynamic_cast<
StringProperty
*
>
(&prop);
288
if
(sap == 0) {
289
MsgStream
log
(
msgSvc
(),
name
() );
290
log <<
MSG::ERROR
<<
"Could not convert "
<< prop.
name
()
291
<<
"to a StringProperty (which it should be!)"
<<
endmsg
;
292
return
;
293
}
294
295
std::string
val = sap->
value
();
296
297
if
(prop.
name
() ==
"ReportLevel"
) {
298
if
(
m_levelSTrans
.
find
(val) ==
m_levelSTrans
.
end
()) {
299
MsgStream
log
(
msgSvc
(),
name
() );
300
log <<
MSG::ERROR
301
<<
"Option ReportLevel: unknown Issue Severity level \""
302
<< val <<
"\". Setting it WARNING"
<<
endmsg
;
303
m_reportLevel
=
IssueSeverity::WARNING
;
304
return
;
305
}
else
{
306
m_reportLevel
=
m_levelSTrans
[
m_reportLevelS
];
307
}
308
}
else
if
(prop.
name
() ==
"TracebackLevel"
) {
309
if
(
m_levelSTrans
.
find
(val) ==
m_levelSTrans
.
end
()) {
310
MsgStream
log
(
msgSvc
(),
name
() );
311
log <<
MSG::ERROR
312
<<
"Option TracebackLevel: unknown Issue Severity level \""
313
<< val <<
"\". Setting it to ERROR"
<<
endmsg
;
314
m_traceLevel
=
IssueSeverity::ERROR
;
315
return
;
316
}
else
{
317
m_traceLevel
=
m_levelSTrans
[
m_traceLevelS
];
318
}
319
}
else
{
320
MsgStream
log
(
msgSvc
(),
name
() );
321
log <<
MSG::ERROR
<<
"setting up unknown property \""
<< prop.
name
()
322
<<
"\""
<<
endmsg
;
323
return
;
324
}
325
326
}
327
328
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
329
330
void
331
IssueLogger::setupStreams
(
Property
& prop) {
332
333
StringArrayProperty
*sap =
dynamic_cast<
StringArrayProperty
*
>
( &prop );
334
if
(sap == 0) {
335
MsgStream
log
(
msgSvc
(),
name
() );
336
log <<
MSG::ERROR
<<
"Could not convert "
<< prop.
name
()
337
<<
"to a StringArrayProperty (which it should be!)"
<<
endmsg
;
338
return
;
339
}
340
341
vector<string>::const_iterator
itr;
342
for
(itr = sap->
value
().begin(); itr != sap->
value
().end(); ++itr) {
343
if
(
connect
(*itr).
isFailure
()) {
344
MsgStream
log
(
msgSvc
(),
name
() );
345
log <<
MSG::ERROR
<<
"Could not setup stream "
<< *itr <<
endmsg
;
346
}
347
}
348
349
return
;
350
351
}
352
353
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//
354
355
void
356
IssueLogger::setupDefaultLogger
() {
357
for
(
int
i
=1;
i
<
IssueSeverity::NUM_LEVELS
; ++
i
) {
358
if
(
m_logger
[
i
] == 0) {
359
// default: dump to msgSvc
360
IssueSeverity::Level
j =
IssueSeverity::Level
(
i
);
361
362
m_logger
[j] =
new
StreamLogger
(
msgSvc
(),
m_sevMsgMap
[j]);
363
m_log
[j] = boost::bind(&
StreamLogger::WriteToMsgSvc
,
m_logger
[j],
364
_1);
365
366
MsgStream
log
(
msgSvc
(),
name
() );
367
log <<
MSG::DEBUG
<<
"Writing "
<<
m_levelTrans
[j]
368
<<
" issues to "
<<
m_logger
[j]->
name
() <<
endmsg
;
369
370
}
371
}
372
}
Generated at Wed Dec 4 2013 14:33:10 for Gaudi Framework, version v24r2 by
Doxygen
version 1.8.2 written by
Dimitri van Heesch
, © 1997-2004