1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // Logger.cc
4 // ---------
5 // Managing log messages
6 //
7 // Design and Implementation by Bjoern Lemke
8 //
9 // (C)opyright 2000-2016 Bjoern Lemke
10 //
11 // IMPLEMENTATION MODULE
12 //
13 // Class: Logger
14 //
15 // Description: Managing module notices and debug messages
16 //
17 // Status: CLEAN
18 //
19 ///////////////////////////////////////////////////////////////////////////////
20
21
22 // LFC INCLUDES
23 #include "Datetime.h"
24 #include "Logger.h"
25
26 #ifndef DISABLE_SYSLOG
27 #include <syslog.h>
28 #endif
29
30 // DEFINES
31
Logger()32 Logger::Logger()
33 {
34 _pF = 0;
35 #ifndef DISABLE_SYSLOG
36 _writeSysLog = false;
37 #endif
38 }
39
Logger(const Chain & logFile,const Chain & progname)40 Logger::Logger(const Chain& logFile, const Chain& progname)
41 {
42 if ( logFile != Chain("") )
43 {
44 _pF = new File(logFile);
45 if (_pF)
46 {
47 _pF->open(File::APPEND);
48 }
49 }
50
51 #ifndef DISABLE_SYSLOG
52 if ( progname != Chain("") )
53 {
54 _writeSysLog = true;
55 openlog ((char*)progname, LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
56 setlogmask (LOG_UPTO (LOG_DEBUG));
57 }
58 else
59 {
60 _writeSysLog = false;
61 }
62 #endif
63
64 _logLevel = Logger::NOTICE;
65 _modId = 0;
66 }
67
~Logger()68 Logger::~Logger()
69 {
70 if (_pF)
71 {
72 delete _pF;
73 }
74 }
75
logModule(unsigned long modId,const Chain & module,Logger::LogLevel level)76 void Logger::logModule(unsigned long modId, const Chain& module, Logger::LogLevel level)
77 {
78 if ( modId > 0 )
79 {
80 ModEntry *pME = _modSet.Find(ModEntry(modId));
81 if ( pME )
82 {
83 pME->setModule(module);
84 pME->setLevel(level);
85 }
86 else
87 {
88 _modSet.Insert(ModEntry(modId, module, level));
89 }
90 }
91 }
92
log(unsigned long modId,Logger::LogLevel level,const Chain & msg)93 void Logger::log(unsigned long modId, Logger::LogLevel level, const Chain& msg)
94 {
95 ModEntry *pME = _modSet.Find(ModEntry(modId));
96
97 if ( pME )
98 {
99 // cout << "Logging <" << msg << " on level " << level << " MsgLevel = " << pME->getLogLevel() << endl;
100 if ( level <= pME->getLogLevel() )
101 {
102 Chain cat;
103
104 switch (level)
105 {
106 case NOTICE:
107 cat = Chain("NOTICE");
108 break;
109 case LOGERR:
110 cat = Chain("ERROR");
111 break;
112 case LOGALERT:
113 cat = Chain("ALERT");
114 break;
115 case DEBUG:
116 cat = Chain("DEBUG");
117 break;
118 case NONE:
119 cat = Chain("NONE");
120 break;
121 }
122
123 Datetime dt;
124
125 #ifndef DISABLE_SYSLOG
126
127 int priority;
128
129 switch (level)
130 {
131 case NOTICE:
132 priority = LOG_NOTICE;
133 break;
134 case LOGERR:
135 priority = LOG_ERR;
136 break;
137 case LOGALERT:
138 priority = LOG_ALERT;
139 break;
140 case DEBUG:
141 priority = LOG_DEBUG;
142 break;
143 case NONE:
144 priority = -1;
145 break;
146 }
147 if ( priority >= 0 && _writeSysLog )
148 {
149 syslog (priority, "%s", (char*)msg);
150 }
151 #endif
152
153 if ( _pF )
154 {
155 _pF->writeChain(dt.asChain() + Chain(" [") + pME->getModule() + Chain("] ") + cat + Chain(" : ") + msg + Chain("\n"));
156 }
157 }
158 }
159 }
160
operator <<(unsigned long modId)161 Logger& Logger::operator << ( unsigned long modId)
162 {
163 ModEntry *pME = _modSet.Find(ModEntry(modId));
164
165 if ( pME )
166 {
167 _modId = modId;
168 }
169 else
170 {
171 _modId = 0;
172 }
173 return (*this);
174 }
175
operator <<(const Logger::LogLevel & level)176 Logger& Logger::operator << ( const Logger::LogLevel& level)
177 {
178 ModEntry *pME = _modSet.Find(ModEntry(_modId));
179
180 if ( pME )
181 {
182 _msgLevel = level;
183 _logLevel = pME->getLogLevel();
184 if ( level <= _logLevel )
185 {
186 Chain cat;
187 Datetime dt;
188 switch (level)
189 {
190 case NOTICE:
191 cat = Chain("NOTICE");
192 break;
193 case LOGERR:
194 cat = Chain("ERROR");
195 break;
196 case LOGALERT:
197 cat = Chain("ALERT");
198 break;
199 case DEBUG:
200 cat = Chain("DEBUG");
201 break;
202 case NONE:
203 cat = Chain("NONE");
204 break;
205 }
206
207 if ( _pF )
208 {
209 _pF->writeChain(dt.asChain() + Chain(":") + pME->getModule() + Chain(":") + cat + Chain(":"));
210 }
211 }
212 }
213 return (*this);
214 }
215
operator <<(const Chain & str)216 Logger& Logger::operator << ( const Chain& str)
217 {
218 if ( _msgLevel <= _logLevel && _modId > 0 )
219 {
220 #ifndef DISABLE_SYSLOG
221
222 int priority;
223
224 switch (_msgLevel)
225 {
226 case NOTICE:
227 priority = LOG_NOTICE;
228 break;
229 case LOGERR:
230 priority = LOG_ERR;
231 break;
232 case LOGALERT:
233 priority = LOG_ALERT;
234 break;
235 case DEBUG:
236 priority = LOG_DEBUG;
237 break;
238 case NONE:
239 priority = -1;
240 break;
241 }
242 if ( priority >= 0 && _writeSysLog )
243 {
244 syslog (priority, "%s", (char*)str);
245 }
246 #endif
247
248 if ( _pF )
249 {
250 _pF->writeChain(str);
251 }
252 }
253 return (*this);
254 }
255
operator <<(const char * str)256 Logger& Logger::operator << ( const char* str)
257 {
258 Chain s(str);
259 *this << s;
260 return (*this);
261 }
262