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