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> 31 #include <boost/lexical_cast.hpp> 34 using boost::lexical_cast;
45 LoggerManagerImpl::processInit() {
46 storeBufferAppenders();
48 log4cplus::Logger::getDefaultHierarchy().resetConfiguration();
54 LoggerManagerImpl::processEnd() {
55 flushBufferAppenders();
62 log4cplus::Logger
logger = log4cplus::Logger::getInstance(
66 logger.setLogLevel(LoggerLevelImpl::convertFromBindLevel(
75 logger.removeAllAppenders();
79 i != spec.
end(); ++i) {
80 switch (i->destination) {
81 case OutputOption::DEST_CONSOLE:
82 createConsoleAppender(
logger, *i);
85 case OutputOption::DEST_FILE:
86 createFileAppender(
logger, *i);
89 case OutputOption::DEST_SYSLOG:
90 createSyslogAppender(
logger, *i);
99 "Unknown logging destination, code = " <<
108 LoggerManagerImpl::createConsoleAppender(log4cplus::Logger&
logger,
111 log4cplus::SharedAppenderPtr console(
112 new log4cplus::ConsoleAppender(
113 (opt.
stream == OutputOption::STR_STDERR), opt.
flush));
114 setConsoleAppenderLayout(console);
115 logger.addAppender(console);
126 LoggerManagerImpl::createFileAppender(log4cplus::Logger&
logger,
127 const OutputOption& opt)
130 const std::ios::openmode mode = std::ios::app;
132 log4cplus::SharedAppenderPtr fileapp;
133 if (opt.maxsize == 0) {
134 fileapp = log4cplus::SharedAppenderPtr(
new log4cplus::FileAppender(
135 opt.filename, mode, opt.flush));
137 log4cplus::helpers::Properties properties;
138 properties.setProperty(
"File", opt.filename);
139 properties.setProperty(
"MaxFileSize",
140 lexical_cast<string>(opt.maxsize));
141 properties.setProperty(
"MaxBackupIndex",
142 lexical_cast<string>(opt.maxver));
143 properties.setProperty(
"ImmediateFlush", opt.flush ?
"true" :
"false");
144 properties.setProperty(
"UseLockFile",
"true");
145 fileapp = log4cplus::SharedAppenderPtr(
146 new log4cplus::RollingFileAppender(properties));
150 setConsoleAppenderLayout(fileapp);
151 logger.addAppender(fileapp);
155 LoggerManagerImpl::createBufferAppender(log4cplus::Logger&
logger) {
156 log4cplus::SharedAppenderPtr bufferapp(
new internal::BufferAppender());
157 bufferapp->setName(
"buffer");
158 logger.addAppender(bufferapp);
161 logger.setLogLevel(log4cplus::TRACE_LOG_LEVEL);
166 LoggerManagerImpl::createSyslogAppender(log4cplus::Logger&
logger,
167 const OutputOption& opt)
169 log4cplus::helpers::Properties properties;
171 properties.setProperty(
"facility", opt.facility);
172 log4cplus::SharedAppenderPtr syslogapp(
173 new log4cplus::SysLogAppender(properties));
174 setSyslogAppenderLayout(syslogapp);
175 logger.addAppender(syslogapp);
188 log4cplus::BasicConfigurator config;
192 LoggerLevelImpl::init();
194 initRootLogger(severity, dbglevel, buffer);
204 initRootLogger(severity, dbglevel);
209 int dbglevel,
bool buffer)
211 log4cplus::Logger::getDefaultHierarchy().resetConfiguration();
217 log4cplus::helpers::LogLog::getLogLog()->setQuietMode(
true);
222 log4cplus::Logger::getRoot().setLogLevel(log4cplus::OFF_LOG_LEVEL);
226 log4cplus::Logger kea_root = log4cplus::Logger::getInstance(
228 kea_root.setLogLevel(LoggerLevelImpl::convertFromBindLevel(
229 Level(severity, dbglevel)));
232 createBufferAppender(kea_root);
235 createConsoleAppender(kea_root, opt);
239 void LoggerManagerImpl::setConsoleAppenderLayout(
240 log4cplus::SharedAppenderPtr& appender)
243 string pattern =
"%D{%Y-%m-%d %H:%M:%S.%q} %-5p [%c/%i] %m\n";
247 #
if LOG4CPLUS_VERSION < LOG4CPLUS_MAKE_VERSION(2, 0, 0)
248 auto_ptr<log4cplus::Layout>
250 unique_ptr<log4cplus::Layout>
252 (
new log4cplus::PatternLayout(pattern)));
259 void LoggerManagerImpl::setSyslogAppenderLayout(
260 log4cplus::SharedAppenderPtr& appender)
263 string pattern =
"%-5p [%c] %m\n";
267 #
if LOG4CPLUS_VERSION < LOG4CPLUS_MAKE_VERSION(2, 0, 0)
268 auto_ptr<log4cplus::Layout>
270 unique_ptr<log4cplus::Layout>
272 (
new log4cplus::PatternLayout(pattern)));
275 void LoggerManagerImpl::storeBufferAppenders() {
277 log4cplus::LoggerList loggers = log4cplus::Logger::getCurrentLoggers();
278 log4cplus::LoggerList::iterator it;
279 for (it = loggers.begin(); it != loggers.end(); ++it) {
280 log4cplus::SharedAppenderPtr buffer_appender =
281 it->getAppender(
"buffer");
282 if (buffer_appender) {
283 buffer_appender_store_.push_back(buffer_appender);
288 void LoggerManagerImpl::flushBufferAppenders() {
289 std::vector<log4cplus::SharedAppenderPtr>
copy;
290 buffer_appender_store_.swap(
copy);
292 std::vector<log4cplus::SharedAppenderPtr>::iterator it;
293 for (it =
copy.begin(); it !=
copy.end(); ++it) {
294 internal::BufferAppender* app =
295 dynamic_cast<internal::BufferAppender*>(it->get());
const std::string & getRootLoggerName()
Get root logger name.
std::string getName() const
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 expandLoggerName(const std::string &name)
Expand logger name.
Defines the logger used by the top-level component of kea-dhcp-ddns.
isc::log::Severity getSeverity() const
isc::log::Logger logger("asiodns")
Use the ASIO logger.
std::vector< OutputOption >::const_iterator const_iterator
Logging initialization functions.
size_t optionCount() const