6 #include "GaudiKernel/Kernel.h"
7 #include "GaudiKernel/StatusCode.h"
8 #include "GaudiKernel/Message.h"
19 static const std::string levelNames[
MSG::NUM_LEVELS] = {
"NIL",
"VERBOSE",
"DEBUG",
"INFO",
20 "WARNING",
"ERROR",
"FATAL",
"ALWAYS"};
24 : base_class(
name, svcloc ), m_keysUsed(false)
28 declareProperty(
"Format",
m_defaultFormat = Message::getDefaultFormat() );
30 declareProperty(
"showStats",
m_stats =
false );
42 declareProperty(
"useColors",
m_color=
false);
46 declareProperty(
"errorColorCode",
m_logColors[MSG::ERROR] );
47 declareProperty(
"warningColorCode",
m_logColors[MSG::WARNING] );
64 declareProperty(
"enableSuppression",
m_suppress =
false );
71 declareProperty(
"loggingLevel",
m_logLevel =
MSG::FATAL,
"Message level above which all messages are saved" );
74 declareProperty(
"keywords",
m_keywords,
"keywords to scan messages for and save");
77 declareProperty(
"loggedStreams",
79 "MessageStream sources we want to dump into a logfile" );
100 for ( ; iStream != endStream; ++iStream ) {
101 delete iStream->second;
102 iStream->second =
nullptr;
112 if(
sc.isFailure() )
return sc;
138 return StatusCode::SUCCESS;
145 m_state = Gaudi::StateMachine::OFFLINE;
156 vector<string> fatDef;
157 fatDef.push_back(
"[94;101;1m" );
164 vector<string> errDef;
165 errDef.push_back(
"[97;101;1m" );
172 vector<string> warDef;
173 warDef.push_back(
"[93;1m" );
198 if (prop.name() ==
"fatalColorCode") {
200 }
else if (prop.name() ==
"errorColorCode") {
202 }
else if (prop.name() ==
"warningColorCode") {
204 }
else if (prop.name() ==
"infoColorCode") {
206 }
else if (prop.name() ==
"debugColorCode") {
208 }
else if (prop.name() ==
"verboseColorCode") {
210 }
else if (prop.name() ==
"alwaysColorCode") {
213 cout <<
"ERROR: Unknown message color parameter: " << prop.name()
219 vector<string>::const_iterator itr;
226 }
else if ((*itr)[0] ==
'[') {
227 code =
"\033" + *itr;
233 vector<string>::const_iterator itr2 = itr + 1;
248 if (prop.name() ==
"fatalLimit") {
250 }
else if (prop.name() ==
"errorLimit") {
252 }
else if (prop.name() ==
"warningLimit") {
254 }
else if (prop.name() ==
"infoLimit") {
256 }
else if (prop.name() ==
"debugLimit") {
258 }
else if (prop.name() ==
"verboseLimit") {
260 }
else if (prop.name() ==
"alwaysLimit") {
261 IntegerProperty *
p =
dynamic_cast<IntegerProperty*
>(&prop);
262 if (
p &&
p->value() != 0) {
263 cout <<
"LoggedMessageSvc ERROR: cannot suppress ALWAYS messages" << endl;
267 }
else if (prop.name() ==
"defaultLimit") {
274 cout <<
"LoggedMessageSvc ERROR: Unknown message limit parameter: "
275 << prop.name() << endl;
285 if (prop.name() ==
"setFatal") {
287 }
else if (prop.name() ==
"setError") {
289 }
else if (prop.name() ==
"setWarning") {
291 }
else if (prop.name() ==
"setInfo") {
293 }
else if (prop.name() ==
"setDebug") {
295 }
else if (prop.name() ==
"setVerbose") {
297 }
else if (prop.name() ==
"setAlways") {
299 }
else if (prop.name() ==
"loggingLevel") {
300 IntegerProperty *iap =
dynamic_cast<IntegerProperty*
>( &prop );
304 }
else if (prop.name() ==
"keywords") {
305 StringArrayProperty *sap =
dynamic_cast<StringArrayProperty*
>( &prop );
306 if (sap!=
nullptr && sap->value().size() > 0) {
313 cerr <<
"LoggedMessageSvc ERROR: Unknown message theshold parameter: "
314 << prop.name() << endl;
318 StringArrayProperty *sap =
dynamic_cast<StringArrayProperty*
>( &prop);
319 if (sap ==
nullptr) {
320 std::cerr <<
"could not dcast " << prop.name()
321 <<
" to a StringArrayProperty (which it should be!)" << endl;
324 std::vector<std::string>::const_iterator itr;
325 for ( itr = sap->value().begin();
326 itr != sap->value().end();
337 if (prop.name() ==
"countInactive") {
339 BooleanProperty *
p =
dynamic_cast<BooleanProperty*
>(&prop);
341 MsgStream::enableCountInactive(
p->value());
352 std::ostringstream
os;
355 os <<
"Summarizing all message counts" << endl;
357 os <<
"Listing sources of suppressed message: " << endl;
360 os <<
"=====================================================" << endl;
361 os <<
" Message Source | Level | Count" << endl;
362 os <<
"-----------------------------+---------+-------------" << endl;
368 std::map<std::string,MsgAry>::const_iterator itr;
375 os.setf(ios_base::left,ios_base::adjustfield);
381 os.setf(ios_base::right,ios_base::adjustfield);
382 os << levelNames[
ic];
387 os << itr->second.msg[
ic];
395 os <<
"=====================================================" << endl;
405 std::ostringstream
os;
406 os <<
"Listing sources of Unprotected and Unseen messages\n";
411 std::map<std::string,MsgAry>::const_iterator itr;
414 if (itr->second.msg[
ic] != 0) {
415 if (itr->first.length() > ml) { ml = itr->first.length(); }
420 for (
unsigned int i=0;
i<ml+25; ++
i) {
426 os.setf(ios_base::left,ios_base::adjustfield);
427 os <<
"Message Source";
429 os <<
"| Level | Count" << endl;
431 for (
unsigned int i=0;
i<ml+3; ++
i) {
434 os <<
"+---------+-----------" << endl;
439 if (itr->second.msg[
ic] != 0) {
442 os.setf(ios_base::left,ios_base::adjustfield);
448 os.setf(ios_base::right,ios_base::adjustfield);
449 os << levelNames[
ic];
454 os << itr->second.msg[
ic];
462 for (
unsigned int i=0;
i<ml+25; ++
i) {
473 return StatusCode::SUCCESS;
478 ColorMap::const_iterator itr =
m_colMap.find(col);
485 std::ostringstream os1;
513 if (
msg.getSource() !=
"AthenaSummarySvc") {
514 for (vector<string>::const_iterator itr=
m_keywords.value().begin(); itr!=
m_keywords.value().end(); ++itr) {
515 if (
msg.getMessage().find( *itr ) != string::npos) {
524 std::unique_ptr<Message> suppressed_msg;
530 (*iLog->second) << *cmsg << std::endl;
539 itr->second.msg[
key] += 1;
540 nmsg = itr->second.msg[
key];
555 std::string
str = levelNames[
key] +
" message limit (";
557 str +=
") reached for ";
558 str +=
msg.getSource() +
". Suppressing further output.";
559 suppressed_msg = std::make_unique<Message>(
msg.getSource(),MSG::WARNING,
str);
560 suppressed_msg->setFormat(
msg.getFormat());
561 cmsg = suppressed_msg.get();
573 while(
first != last ) {
574 std::ostream&
stream = *( (*first).second.second );
575 stream << *cmsg << std::endl;
583 (*m_defaultStream) << *cmsg << std::endl <<
std::flush;
629 while(
first != last ) {
632 std::ostringstream os1;
633 os1 <<
"Status Code " <<
key.getCode() << std::ends;
643 std::ostringstream
os2;
644 os2 <<
"Status Code " <<
key.getCode() << std::ends;
698 if (
nullptr !=
stream ) {
704 while(
first != last ) {
705 if ( (*first).second.second ==
stream ) {
723 if (
nullptr !=
stream ) {
729 if ( (*first).second.second ==
stream ) {
798 while(
first != last ) {
812 return m_outputLevel;
826 m_outputLevel = new_level;
838 }
else if (
i->second !=
level ) {
883 typedef std::map<std::string,std::string> StreamMap_t;
885 typedef StreamMap_t::const_iterator StreamMapIter;
887 for ( StreamMapIter iProp = streamMap.begin(), iEnd = streamMap.end();
891 const std::string sourceName = iProp->first;
894 std::set<std::string> outFileNames;
895 for ( StreamMapIter jProp = streamMap.begin();
898 if ( jProp->first != iProp->first ) {
899 outFileNames.insert( jProp->second );
913 const std::set<std::string>& outFileNames )
916 std::ios_base::trunc;
920 if ( iStream != iEnd ) {
921 delete iStream->second;
922 iStream->second =
nullptr;
929 for ( iStream =
m_loggedStreams.begin(); iStream != iEnd; ++iStream ) {
930 if ( outFileNames.find(
outFileName ) != outFileNames.end() ) {
936 std::ofstream *
out =
new std::ofstream(
outFileName.c_str(), openMode );
938 if ( !
out->good() ) {
956 std::vector< std::pair<std::string, std::string> >
965 -> std::vector< LoggedMessage >