13#include <log4cplus/logger.h>
14#include <log4cplus/configurator.h>
15#include <log4cplus/hierarchy.h>
16#include <log4cplus/consoleappender.h>
17#include <log4cplus/fileappender.h>
18#include <log4cplus/syslogappender.h>
19#include <log4cplus/helpers/loglog.h>
20#include <log4cplus/version.h>
34#include <boost/lexical_cast.hpp>
37using boost::lexical_cast;
49 storeBufferAppenders();
51 log4cplus::Logger::getDefaultHierarchy().resetConfiguration();
58 flushBufferAppenders();
65 log4cplus::Logger
logger = log4cplus::Logger::getInstance(
78 logger.removeAllAppenders();
82 i != spec.
end(); ++i) {
83 switch (i->destination) {
85 createConsoleAppender(
logger, *i);
89 createFileAppender(
logger, *i);
93 createSyslogAppender(
logger, *i);
102 "Unknown logging destination, code = " <<
111LoggerManagerImpl::createConsoleAppender(log4cplus::Logger&
logger,
114 log4cplus::SharedAppenderPtr console(
115 new log4cplus::ConsoleAppender(
118 setAppenderLayout(console, (opt.
pattern.empty() ?
120 logger.addAppender(console);
131LoggerManagerImpl::createFileAppender(log4cplus::Logger&
logger,
132 const OutputOption& opt)
135 const std::ios::openmode mode = std::ios::app;
137 log4cplus::SharedAppenderPtr fileapp;
138 if (opt.maxsize == 0) {
139 fileapp = log4cplus::SharedAppenderPtr(
new log4cplus::FileAppender(
140 opt.filename, mode, opt.flush));
142 log4cplus::helpers::Properties properties;
143 properties.setProperty(
"File", opt.filename);
147 uint64_t maxsize(opt.maxsize);
149 while (std::numeric_limits<int32_t>::max() < maxsize && i < 2) {
153 std::array<std::string, 3>
const suffixes({
"",
"KB",
"MB"});
154 std::string
const max_file_size(to_string(maxsize) + suffixes[i]);
158 if (std::numeric_limits<int32_t>::max() < maxsize) {
159 isc_throw(BadValue,
"expected maxsize < "
160 << std::numeric_limits<int32_t>::max()
161 <<
"MB, but instead got " << max_file_size);
164 properties.setProperty(
"MaxFileSize", max_file_size);
165 properties.setProperty(
"MaxBackupIndex",
166 lexical_cast<string>(opt.maxver));
167 properties.setProperty(
"ImmediateFlush", opt.flush ?
"true" :
"false");
168 properties.setProperty(
"UseLockFile",
"true");
169 fileapp = log4cplus::SharedAppenderPtr(
170 new log4cplus::RollingFileAppender(properties));
173 setAppenderLayout(fileapp, (opt.pattern.empty() ?
175 logger.addAppender(fileapp);
179LoggerManagerImpl::createBufferAppender(log4cplus::Logger&
logger) {
180 log4cplus::SharedAppenderPtr bufferapp(
new internal::BufferAppender());
181 bufferapp->setName(
"buffer");
182 logger.addAppender(bufferapp);
185 logger.setLogLevel(log4cplus::TRACE_LOG_LEVEL);
190LoggerManagerImpl::createSyslogAppender(log4cplus::Logger&
logger,
191 const OutputOption& opt)
193 log4cplus::helpers::Properties properties;
195 properties.setProperty(
"facility", opt.facility);
196 log4cplus::SharedAppenderPtr syslogapp(
197 new log4cplus::SysLogAppender(properties));
198 setAppenderLayout(syslogapp, (opt.pattern.empty() ?
200 logger.addAppender(syslogapp);
213 log4cplus::BasicConfigurator config;
219 initRootLogger(severity, dbglevel, buffer);
229 initRootLogger(severity, dbglevel);
234 int dbglevel,
bool buffer)
236 log4cplus::Logger::getDefaultHierarchy().resetConfiguration();
242 log4cplus::helpers::LogLog::getLogLog()->setQuietMode(
true);
247 log4cplus::Logger::getRoot().setLogLevel(log4cplus::OFF_LOG_LEVEL);
251 log4cplus::Logger kea_root = log4cplus::Logger::getInstance(
254 Level(severity, dbglevel)));
257 createBufferAppender(kea_root);
260 createConsoleAppender(kea_root, opt);
265void LoggerManagerImpl::setAppenderLayout(
266 log4cplus::SharedAppenderPtr& appender,
271#
if LOG4CPLUS_VERSION < LOG4CPLUS_MAKE_VERSION(2, 0, 0)
272 auto_ptr<log4cplus::Layout>
274 unique_ptr<log4cplus::Layout>
276 (
new log4cplus::PatternLayout(pattern)));
279void LoggerManagerImpl::storeBufferAppenders() {
281 log4cplus::LoggerList loggers = log4cplus::Logger::getCurrentLoggers();
282 log4cplus::LoggerList::iterator it;
283 for (it = loggers.begin(); it != loggers.end(); ++it) {
284 log4cplus::SharedAppenderPtr buffer_appender =
285 it->getAppender(
"buffer");
286 if (buffer_appender) {
287 buffer_appender_store_.push_back(buffer_appender);
292void LoggerManagerImpl::flushBufferAppenders() {
293 std::vector<log4cplus::SharedAppenderPtr>
copy;
294 buffer_appender_store_.swap(
copy);
296 std::vector<log4cplus::SharedAppenderPtr>::iterator it;
297 for (it =
copy.begin(); it !=
copy.end(); ++it) {
298 internal::BufferAppender* app =
299 dynamic_cast<internal::BufferAppender*
>(it->get());
static log4cplus::LogLevel convertFromBindLevel(const isc::log::Level &level)
Convert Kea level to log4cplus logging level.
static void init()
Initialize extended logging levels.
static void processSpecification(const LoggerSpecification &spec)
Process Specification.
void processEnd()
End Processing.
static void init(isc::log::Severity severity=isc::log::INFO, int dbglevel=0, bool buffer=false)
Implementation-specific initialization.
static void reset(isc::log::Severity severity=isc::log::INFO, int dbglevel=0)
Reset logging.
void processInit()
Initialize Processing.
isc::log::Severity getSeverity() const
std::string getName() const
std::vector< OutputOption >::const_iterator const_iterator
size_t optionCount() const
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
#define isc_throw_assert(expr)
Replacement for assert() that throws if the expression is false.
Logging initialization functions.
isc::log::Logger logger("asiodns")
Use the ASIO logger.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
const std::string & getRootLoggerName()
Get root logger name.
std::string expandLoggerName(const std::string &name)
Expand logger name.
Defines the logger used by the top-level component of kea-lfc.
std::string pattern
log content pattern
bool flush
true to flush after each message
static const std::string DEFAULT_FILE_PATTERN
Default layout pattern for file logs.
Stream stream
stdout/stderr if console output
static const std::string DEFAULT_SYSLOG_PATTERN
Default layout pattern for syslog logs.
static const std::string DEFAULT_CONSOLE_PATTERN
Default layout pattern for console logs.