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>
37 using boost::lexical_cast;
48 LoggerManagerImpl::processInit() {
49 storeBufferAppenders();
51 log4cplus::Logger::getDefaultHierarchy().resetConfiguration();
57 LoggerManagerImpl::processEnd() {
58 flushBufferAppenders();
65 string const& name(spec.
getName());
71 logger.setLogLevel(LoggerLevelImpl::convertFromBindLevel(
78 logger.removeAllAppenders();
80 if (name == root_logger_name) {
88 appenderFactory(
logger, spec);
93 appenderFactory(
logger, root_spec_);
98 LoggerManagerImpl::appenderFactory(log4cplus::Logger&
logger,
101 switch (i.destination) {
102 case OutputOption::DEST_CONSOLE:
103 createConsoleAppender(
logger, i);
106 case OutputOption::DEST_FILE:
107 createFileAppender(
logger, i);
110 case OutputOption::DEST_SYSLOG:
111 createSyslogAppender(
logger, i);
120 "Unknown logging destination, code = " << i.destination);
127 LoggerManagerImpl::createConsoleAppender(log4cplus::Logger&
logger,
128 const OutputOption& opt)
130 log4cplus::SharedAppenderPtr console(
131 new log4cplus::ConsoleAppender(
132 (opt.stream == OutputOption::STR_STDERR), opt.flush));
134 setAppenderLayout(console, (opt.pattern.empty() ?
135 OutputOption::DEFAULT_CONSOLE_PATTERN : opt.pattern));
136 logger.addAppender(console);
147 LoggerManagerImpl::createFileAppender(log4cplus::Logger&
logger,
148 const OutputOption& opt)
151 const std::ios::openmode mode = std::ios::app;
153 log4cplus::SharedAppenderPtr fileapp;
154 if (opt.maxsize == 0) {
155 fileapp = log4cplus::SharedAppenderPtr(
new log4cplus::FileAppender(
156 opt.filename, mode, opt.flush));
158 log4cplus::helpers::Properties properties;
159 properties.setProperty(
"File", opt.filename);
163 uint64_t maxsize(opt.maxsize);
165 while (std::numeric_limits<int32_t>::max() < maxsize && i < 2) {
169 std::array<std::string, 3>
const suffixes({
"",
"KB",
"MB"});
170 std::string
const max_file_size(to_string(maxsize) + suffixes[i]);
174 if (std::numeric_limits<int32_t>::max() < maxsize) {
175 isc_throw(BadValue,
"expected maxsize < "
176 << std::numeric_limits<int32_t>::max()
177 <<
"MB, but instead got " << max_file_size);
180 properties.setProperty(
"MaxFileSize", max_file_size);
181 properties.setProperty(
"MaxBackupIndex",
182 lexical_cast<string>(opt.maxver));
183 properties.setProperty(
"ImmediateFlush", opt.flush ?
"true" :
"false");
184 properties.setProperty(
"UseLockFile",
"true");
185 fileapp = log4cplus::SharedAppenderPtr(
186 new log4cplus::RollingFileAppender(properties));
189 setAppenderLayout(fileapp, (opt.pattern.empty() ?
190 OutputOption::DEFAULT_FILE_PATTERN : opt.pattern));
191 logger.addAppender(fileapp);
195 LoggerManagerImpl::createBufferAppender(log4cplus::Logger&
logger) {
196 log4cplus::SharedAppenderPtr bufferapp(
new internal::BufferAppender());
197 bufferapp->setName(
"buffer");
198 logger.addAppender(bufferapp);
201 logger.setLogLevel(log4cplus::TRACE_LOG_LEVEL);
206 LoggerManagerImpl::createSyslogAppender(log4cplus::Logger&
logger,
207 const OutputOption& opt)
209 log4cplus::helpers::Properties properties;
211 properties.setProperty(
"facility", opt.facility);
212 log4cplus::SharedAppenderPtr syslogapp(
213 new log4cplus::SysLogAppender(properties));
214 setAppenderLayout(syslogapp, (opt.pattern.empty() ?
215 OutputOption::DEFAULT_SYSLOG_PATTERN : opt.pattern));
216 logger.addAppender(syslogapp);
229 log4cplus::BasicConfigurator config;
233 LoggerLevelImpl::init();
235 initRootLogger(severity, dbglevel, buffer);
245 initRootLogger(severity, dbglevel);
250 int dbglevel,
bool buffer)
252 log4cplus::Logger::getDefaultHierarchy().resetConfiguration();
258 log4cplus::helpers::LogLog::getLogLog()->setQuietMode(
true);
263 log4cplus::Logger::getRoot().setLogLevel(log4cplus::OFF_LOG_LEVEL);
267 log4cplus::Logger kea_root = log4cplus::Logger::getInstance(
269 kea_root.setLogLevel(LoggerLevelImpl::convertFromBindLevel(
270 Level(severity, dbglevel)));
273 createBufferAppender(kea_root);
276 createConsoleAppender(kea_root, opt);
281 void LoggerManagerImpl::setAppenderLayout(
282 log4cplus::SharedAppenderPtr& appender,
287 #
if LOG4CPLUS_VERSION < LOG4CPLUS_MAKE_VERSION(2, 0, 0)
288 auto_ptr<log4cplus::Layout>
290 unique_ptr<log4cplus::Layout>
292 (
new log4cplus::PatternLayout(pattern)));
295 void LoggerManagerImpl::storeBufferAppenders() {
297 log4cplus::LoggerList loggers = log4cplus::Logger::getCurrentLoggers();
298 log4cplus::LoggerList::iterator it;
299 for (it = loggers.begin(); it != loggers.end(); ++it) {
300 log4cplus::SharedAppenderPtr buffer_appender =
301 it->getAppender(
"buffer");
302 if (buffer_appender) {
303 buffer_appender_store_.push_back(buffer_appender);
308 void LoggerManagerImpl::flushBufferAppenders() {
309 std::vector<log4cplus::SharedAppenderPtr>
copy;
310 buffer_appender_store_.swap(
copy);
312 std::vector<log4cplus::SharedAppenderPtr>::iterator it;
313 for (it =
copy.begin(); it !=
copy.end(); ++it) {
314 internal::BufferAppender* app =
315 dynamic_cast<internal::BufferAppender*
>(it->get());
isc::log::Severity getSeverity() const
std::string getName() const
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.