12 #include <log4cplus/logger.h>
13 #include <log4cplus/configurator.h>
14 #include <log4cplus/hierarchy.h>
15 #include <log4cplus/consoleappender.h>
16 #include <log4cplus/fileappender.h>
17 #include <log4cplus/syslogappender.h>
18 #include <log4cplus/helpers/loglog.h>
19 #include <log4cplus/version.h>
33 #include <boost/lexical_cast.hpp>
36 using boost::lexical_cast;
47 LoggerManagerImpl::processInit() {
48 storeBufferAppenders();
50 log4cplus::Logger::getDefaultHierarchy().resetConfiguration();
56 LoggerManagerImpl::processEnd() {
57 flushBufferAppenders();
64 log4cplus::Logger
logger = log4cplus::Logger::getInstance(
68 logger.setLogLevel(LoggerLevelImpl::convertFromBindLevel(
77 logger.removeAllAppenders();
81 i != spec.
end(); ++i) {
82 switch (i->destination) {
83 case OutputOption::DEST_CONSOLE:
84 createConsoleAppender(logger, *i);
87 case OutputOption::DEST_FILE:
88 createFileAppender(logger, *i);
91 case OutputOption::DEST_SYSLOG:
92 createSyslogAppender(logger, *i);
101 "Unknown logging destination, code = " <<
110 LoggerManagerImpl::createConsoleAppender(log4cplus::Logger&
logger,
113 log4cplus::SharedAppenderPtr console(
114 new log4cplus::ConsoleAppender(
115 (opt.
stream == OutputOption::STR_STDERR), opt.
flush));
117 setAppenderLayout(console, (opt.
pattern.empty() ?
118 OutputOption::DEFAULT_CONSOLE_PATTERN : opt.
pattern));
119 logger.addAppender(console);
130 LoggerManagerImpl::createFileAppender(log4cplus::Logger& logger,
131 const OutputOption& opt)
134 const std::ios::openmode mode = std::ios::app;
136 log4cplus::SharedAppenderPtr fileapp;
137 if (opt.maxsize == 0) {
138 fileapp = log4cplus::SharedAppenderPtr(
new log4cplus::FileAppender(
139 opt.filename, mode, opt.flush));
141 log4cplus::helpers::Properties properties;
142 properties.setProperty(
"File", opt.filename);
143 properties.setProperty(
"MaxFileSize",
144 lexical_cast<string>(opt.maxsize));
145 properties.setProperty(
"MaxBackupIndex",
146 lexical_cast<string>(opt.maxver));
147 properties.setProperty(
"ImmediateFlush", opt.flush ?
"true" :
"false");
148 properties.setProperty(
"UseLockFile",
"true");
149 fileapp = log4cplus::SharedAppenderPtr(
150 new log4cplus::RollingFileAppender(properties));
153 setAppenderLayout(fileapp, (opt.pattern.empty() ?
154 OutputOption::DEFAULT_FILE_PATTERN : opt.pattern));
155 logger.addAppender(fileapp);
159 LoggerManagerImpl::createBufferAppender(log4cplus::Logger& logger) {
160 log4cplus::SharedAppenderPtr bufferapp(
new internal::BufferAppender());
161 bufferapp->setName(
"buffer");
162 logger.addAppender(bufferapp);
165 logger.setLogLevel(log4cplus::TRACE_LOG_LEVEL);
170 LoggerManagerImpl::createSyslogAppender(log4cplus::Logger& logger,
171 const OutputOption& opt)
173 log4cplus::helpers::Properties properties;
175 properties.setProperty(
"facility", opt.facility);
176 log4cplus::SharedAppenderPtr syslogapp(
177 new log4cplus::SysLogAppender(properties));
178 setAppenderLayout(syslogapp, (opt.pattern.empty() ?
179 OutputOption::DEFAULT_SYSLOG_PATTERN : opt.pattern));
180 logger.addAppender(syslogapp);
193 log4cplus::BasicConfigurator config;
197 LoggerLevelImpl::init();
199 initRootLogger(severity, dbglevel, buffer);
209 initRootLogger(severity, dbglevel);
214 int dbglevel,
bool buffer)
216 log4cplus::Logger::getDefaultHierarchy().resetConfiguration();
222 log4cplus::helpers::LogLog::getLogLog()->setQuietMode(
true);
227 log4cplus::Logger::getRoot().setLogLevel(log4cplus::OFF_LOG_LEVEL);
231 log4cplus::Logger kea_root = log4cplus::Logger::getInstance(
233 kea_root.setLogLevel(LoggerLevelImpl::convertFromBindLevel(
234 Level(severity, dbglevel)));
237 createBufferAppender(kea_root);
240 createConsoleAppender(kea_root, opt);
245 void LoggerManagerImpl::setAppenderLayout(
246 log4cplus::SharedAppenderPtr& appender,
251 #
if LOG4CPLUS_VERSION < LOG4CPLUS_MAKE_VERSION(2, 0, 0)
252 auto_ptr<log4cplus::Layout>
254 unique_ptr<log4cplus::Layout>
256 (
new log4cplus::PatternLayout(pattern)));
259 void LoggerManagerImpl::storeBufferAppenders() {
261 log4cplus::LoggerList loggers = log4cplus::Logger::getCurrentLoggers();
262 log4cplus::LoggerList::iterator it;
263 for (it = loggers.begin(); it != loggers.end(); ++it) {
264 log4cplus::SharedAppenderPtr buffer_appender =
265 it->getAppender(
"buffer");
266 if (buffer_appender) {
267 buffer_appender_store_.push_back(buffer_appender);
272 void LoggerManagerImpl::flushBufferAppenders() {
273 std::vector<log4cplus::SharedAppenderPtr>
copy;
274 buffer_appender_store_.swap(copy);
276 std::vector<log4cplus::SharedAppenderPtr>::iterator it;
277 for (it = copy.begin(); it != copy.end(); ++it) {
278 internal::BufferAppender* app =
279 dynamic_cast<internal::BufferAppender*
>(it->get());
const std::string & getRootLoggerName()
Get root logger name.
#define isc_throw_assert(expr)
Replacement for assert() that throws if the expression is false.
bool flush
true to flush after each message
Stream stream
stdout/stderr if console output
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
std::string pattern
log content pattern
isc::log::Severity getSeverity() const
std::string expandLoggerName(const std::string &name)
Expand logger name.
Defines the logger used by the top-level component of kea-dhcp-ddns.
isc::log::Logger logger("asiodns")
Use the ASIO logger.
std::vector< OutputOption >::const_iterator const_iterator
Logging initialization functions.
std::string getName() const
size_t optionCount() const