2
Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
4
This program is free software; you can redistribute it and/or modify
5
it under the terms of the GNU General Public License as published by
6
the Free Software Foundation; version 2 of the License.
8
This program is distributed in the hope that it will be useful,
9
but WITHOUT ANY WARRANTY; without even the implied warranty of
10
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
GNU General Public License for more details.
13
You should have received a copy of the GNU General Public License
14
along with this program; if not, write to the Free Software
15
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
#include <ndb_global.h>
22
#include <LogHandler.hpp>
23
#include <ConsoleLogHandler.hpp>
24
#include <FileLogHandler.hpp>
25
#include "LogHandlerList.hpp"
28
#include "EventLogHandler.hpp"
30
#include <SysLogHandler.hpp>
33
const char* Logger::LoggerLevelNames[] = { "ON ",
43
m_pCategory("Logger"),
44
m_pConsoleHandler(NULL),
46
m_pSyslogHandler(NULL)
48
m_pHandlerList = new LogHandlerList();
49
m_mutex= NdbMutex_Create();
50
m_handler_mutex= NdbMutex_Create();
59
delete m_pHandlerList;
60
NdbMutex_Destroy(m_handler_mutex);
61
NdbMutex_Destroy(m_mutex);
65
Logger::setCategory(const char* pCategory)
68
m_pCategory = pCategory;
72
Logger::createConsoleHandler(NdbOut &out)
74
Guard g(m_handler_mutex);
76
if (m_pConsoleHandler)
77
return true; // Ok, already exist
79
LogHandler* log_handler = new ConsoleLogHandler(out);
83
if (!addHandler(log_handler))
89
m_pConsoleHandler = log_handler;
94
Logger::removeConsoleHandler()
96
Guard g(m_handler_mutex);
97
if (removeHandler(m_pConsoleHandler))
99
m_pConsoleHandler = NULL;
104
Logger::createEventLogHandler(const char* source_name)
107
Guard g(m_handler_mutex);
109
LogHandler* log_handler = new EventLogHandler(source_name);
113
if (!addHandler(log_handler))
126
Logger::createFileHandler(char*filename)
128
Guard g(m_handler_mutex);
131
return true; // Ok, already exist
133
LogHandler* log_handler = filename ? new FileLogHandler(filename)
134
: new FileLogHandler();
138
if (!addHandler(log_handler))
144
m_pFileHandler = log_handler;
149
Logger::removeFileHandler()
151
Guard g(m_handler_mutex);
152
if (removeHandler(m_pFileHandler))
154
m_pFileHandler = NULL;
159
Logger::createSyslogHandler()
164
Guard g(m_handler_mutex);
166
if (m_pSyslogHandler)
167
return true; // Ok, already exist
169
LogHandler* log_handler = new SysLogHandler();
173
if (!addHandler(log_handler))
179
m_pSyslogHandler = log_handler;
185
Logger::removeSyslogHandler()
187
Guard g(m_handler_mutex);
188
if (removeHandler(m_pSyslogHandler))
190
m_pSyslogHandler = NULL;
195
Logger::addHandler(LogHandler* pHandler)
198
assert(pHandler != NULL);
200
if (!pHandler->is_open() &&
207
if (!m_pHandlerList->add(pHandler))
214
Logger::addHandler(const BaseString &logstring, int *err, int len, char* errStr) {
216
Vector<BaseString> logdest;
217
DBUG_ENTER("Logger::addHandler");
219
logstring.split(logdest, ";");
221
for(i = 0; i < logdest.size(); i++) {
222
DBUG_PRINT("info",("adding: %s",logdest[i].c_str()));
224
Vector<BaseString> v_type_args;
225
logdest[i].split(v_type_args, ":", 2);
227
BaseString type(v_type_args[0]);
229
if(v_type_args.size() >= 2)
230
params = v_type_args[1];
232
LogHandler *handler = NULL;
237
handler = new SysLogHandler();
241
handler = new FileLogHandler();
242
else if(type == "CONSOLE")
243
handler = new ConsoleLogHandler();
247
BaseString::snprintf(errStr,len,"Could not create log destination: %s",
252
if(!handler->parseParams(params))
254
*err= handler->getErrorCode();
255
if(handler->getErrorStr())
256
strncpy(errStr, handler->getErrorStr(), len);
261
if (!addHandler(handler))
263
BaseString::snprintf(errStr,len,"Could not add log destination: %s",
274
Logger::removeHandler(LogHandler* pHandler)
278
if (pHandler != NULL)
280
if (pHandler == m_pConsoleHandler)
281
m_pConsoleHandler= NULL;
282
if (pHandler == m_pFileHandler)
283
m_pFileHandler= NULL;
284
if (pHandler == m_pSyslogHandler)
285
m_pSyslogHandler= NULL;
287
rc = m_pHandlerList->remove(pHandler);
294
Logger::removeAllHandlers()
297
m_pHandlerList->removeAll();
299
m_pConsoleHandler= NULL;
300
m_pFileHandler= NULL;
301
m_pSyslogHandler= NULL;
305
Logger::isEnable(LoggerLevel logLevel) const
308
if (logLevel == LL_ALL)
310
for (unsigned i = 1; i < MAX_LOG_LEVELS; i++)
315
return m_logLevels[logLevel];
319
Logger::enable(LoggerLevel logLevel)
322
if (logLevel == LL_ALL)
324
for (unsigned i = 0; i < MAX_LOG_LEVELS; i++)
326
m_logLevels[i] = true;
331
m_logLevels[logLevel] = true;
336
Logger::enable(LoggerLevel fromLogLevel, LoggerLevel toLogLevel)
339
if (fromLogLevel > toLogLevel)
341
LoggerLevel tmp = toLogLevel;
342
toLogLevel = fromLogLevel;
346
for (int i = fromLogLevel; i <= toLogLevel; i++)
348
m_logLevels[i] = true;
353
Logger::disable(LoggerLevel logLevel)
356
if (logLevel == LL_ALL)
358
for (unsigned i = 0; i < MAX_LOG_LEVELS; i++)
360
m_logLevels[i] = false;
365
m_logLevels[logLevel] = false;
370
Logger::alert(const char* pMsg, ...) const
374
log(LL_ALERT, pMsg, ap);
379
Logger::critical(const char* pMsg, ...) const
383
log(LL_CRITICAL, pMsg, ap);
387
Logger::error(const char* pMsg, ...) const
391
log(LL_ERROR, pMsg, ap);
395
Logger::warning(const char* pMsg, ...) const
399
log(LL_WARNING, pMsg, ap);
404
Logger::info(const char* pMsg, ...) const
408
log(LL_INFO, pMsg, ap);
413
Logger::debug(const char* pMsg, ...) const
417
log(LL_DEBUG, pMsg, ap);
422
Logger::log(LoggerLevel logLevel, const char* pMsg, va_list ap) const
425
if (m_logLevels[LL_ON] && m_logLevels[logLevel])
427
char buf[MAX_LOG_MESSAGE_SIZE];
428
BaseString::vsnprintf(buf, sizeof(buf), pMsg, ap);
429
LogHandler* pHandler = NULL;
430
while ( (pHandler = m_pHandlerList->next()) != NULL)
432
pHandler->append(m_pCategory, logLevel, buf);
437
void Logger::setRepeatFrequency(unsigned val)
439
LogHandler* pHandler;
440
while ((pHandler = m_pHandlerList->next()) != NULL)
442
pHandler->setRepeatFrequency(val);