Diana Software
QMessage.cc
Go to the documentation of this file.
1 /* Diana Reconstruction program
2  *
3  * Author: MP 11/11/05
4  * $Id: QMessage.cc 76 2006-05-18 15:54:00Z pallas $
5  *
6  * Class QMessage
7  *
8 */
9 
10 #include <stdexcept>
11 #include <iostream>
12 #include <sstream>
13 #include <unistd.h>
14 
15 #include "QMessage.hh"
16 #include "QStringHandler.hh"
17 
18 using namespace QStringHandler;
19 
21 
22 QMessageHandler *QMessageHandler::me = 0 ;
23 
24 QMessageHandler *QMessageHandler::Get() {
25  if (!me) {
26  me = new QMessageHandler();
27  }
28  return me;
29 }
30 
31 void QMessageHandler::Send(MsgLevel l, const std::string& sender, const std::string& msg ) {
32 
33  std::string s = sender;
34  s += ":";
35  if (s.size() < 31 ) {
36  int i = 31 - s.size();
37  while(i--) s += " ";
38  }
39 
40  if ( l >= print_level ) {
41  SetColor(l);
42  std::istringstream msgStream(msg);
43  std::string line;
44  while(std::getline(msgStream,line)) {
45  std::cout << s << line << std::endl;
46  }
47  SetColor(NoMsg);
48  }
49 
50  if ( l >= log_level ) {
51  std::string stringLevel;
52  switch(l) {
53  case DebugMsg:
54  stringLevel = "(DD) ";
55  break;
56  case InfoMsg:
57  stringLevel = "(II) ";
58  break;
59  case WarnMsg:
60  stringLevel = "(WW) ";
61  break;
62  case ErrorMsg:
63  stringLevel = "(EE) ";
64  break;
65  case PanicMsg:
66  stringLevel = "(PP) ";
67  break;
68  case NoMsg:
69  default:
70  stringLevel = "(NN) ";
71  break;
72  }
73  std::istringstream msgStream(msg);
74  std::string line;
75  while(std::getline(msgStream,line)) {
76  logfile << stringLevel << s << line << std::endl;
77  }
78 
79  }
80 
81  if ( l == PanicMsg )
82  throw std::runtime_error("Diana Panic!");
83 }
84 
85 void QMessageHandler::Init(MsgLevel plevel, MsgLevel llevel, const std::string& lfile)
86 {
87  print_level = plevel;
88  log_level = llevel;
89  std::string logfilename = lfile;
90  logfile.open(logfilename.c_str());
91  unlink("diana_last.log");
92  symlink(logfilename.c_str(), "diana_last.log");
93  if(logfile.fail()) {
94  std::string msg = "cannot open logfile: " + logfilename + std::string(" for writing");
95  Send(ErrorMsg,"QMessageHandler",msg);
96  } else {
97  std::string msg = "logfile is: " + logfilename;
98  Send(InfoMsg,"QMessageHandler",msg);
99  }
100 
101  time_t now = ::time(0);
102  char time_s[100];
103  ::strftime(time_s,50,"Diana Run Started at %H:%M:%S on %d-%m-%Y", ::localtime(&now) );
104  Send(NoFilterMsg,"QMessageHandler",time_s);
105 
106 
107 }
109  print_level = InfoMsg;
110  log_level = DebugMsg;
111 }
112 
113 // colors: 00 default white, 31 red, 32 green, 33 yellow, 35 magenta
114 // 37 bright white 36 cyan
116  switch (l) {
117  case NoMsg:
118  case DebugMsg:
119  std::cout << "\033[01;00m";
120  break; // reset (white on black)
121  case InfoMsg:
122  std::cout << "\033[01;00m";
123  break; // green on black
124  case WarnMsg:
125  std::cout << "\033[01;32m";
126  break; // yellow on black
127  case ErrorMsg:
128  std::cout << "\033[01;31m";
129  break; // red on black
130  case PanicMsg:
131  std::cout << "\033[01;35m";
132  break; // magenta on black
133  default:
134  std::cout << "\033[01;00m";
135  break; // default (white on black)
136  }
137 }
138 
#define Q_END_NAMESPACE
Definition: QDiana.hh:22
#define Q_BEGIN_NAMESPACE
Definition: QDiana.hh:20
MsgLevel
Definition: QMessageDefs.hh:4
@ ErrorMsg
Definition: QMessageDefs.hh:9
@ DebugMsg
Definition: QMessageDefs.hh:6
@ WarnMsg
Definition: QMessageDefs.hh:8
@ PanicMsg
Definition: QMessageDefs.hh:10
@ InfoMsg
Definition: QMessageDefs.hh:7
@ NoMsg
Definition: QMessageDefs.hh:5
@ NoFilterMsg
Definition: QMessageDefs.hh:11
void Init(MsgLevel plevel, MsgLevel llevel, const std::string &logfile)
Definition: QMessage.cc:85
static QMessageHandler * Get()
Definition: QMessage.cc:24
void Send(MsgLevel l, const std::string &sender, const std::string &msg)
Definition: QMessage.cc:31
void SetColor(MsgLevel)
Definition: QMessage.cc:115
static QMessageHandler * me
Definition: QMessage.hh:61
general purpose string manipulation functions