123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- // Copyright (C) 2014-2015,2017 Internet Systems Consortium, Inc. ("ISC")
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this
- // file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #include <config.h>
- #include <dhcpsrv/cfgmgr.h>
- #include <dhcpsrv/logging_info.h>
- #include <log/logger_name.h>
- using namespace isc::log;
- using namespace isc::data;
- namespace isc {
- namespace dhcp {
- bool
- LoggingDestination::equals(const LoggingDestination& other) const {
- return (output_ == other.output_ &&
- maxver_ == other.maxver_ &&
- maxsize_ == other.maxsize_ &&
- flush_ == other.flush_);
- }
- ElementPtr
- LoggingDestination::toElement() const {
- ElementPtr result = Element::createMap();
- // Set output
- result->set("output", Element::create(output_));
- // Set maxver
- result->set("maxver", Element::create(maxver_));
- // Set maxsize
- result->set("maxsize", Element::create(static_cast<long long>(maxsize_)));
- // Set flush
- result->set("flush", Element::create(flush_));
- return(result);
- }
- LoggingInfo::LoggingInfo()
- : name_("kea"), severity_(isc::log::INFO), debuglevel_(0) {
- // If configuration Manager is in the verbose mode, we need to modify the
- // default settings.
- if (CfgMgr::instance().isVerbose()) {
- severity_ = isc::log::DEBUG;
- debuglevel_ = 99;
- }
- // If the process has set the non-empty name for the default logger,
- // let's use this name.
- std::string logger_name = CfgMgr::instance().getDefaultLoggerName();
- if (!logger_name.empty()) {
- name_ = logger_name;
- }
- // Add a default logging destination in case use hasn't provided a
- // logger specification.
- LoggingDestination dest;
- dest.output_ = "stdout";
- destinations_.push_back(dest);
- }
- bool
- LoggingInfo::equals(const LoggingInfo& other) const {
- // If number of destinations aren't equal, the objects are not equal.
- if (destinations_.size() != other.destinations_.size()) {
- return (false);
- }
- // If there is the same number of logging destinations verify that the
- // destinations are equal. The order doesn't matter to we don't expect
- // that they are at the same index of the vectors.
- for (std::vector<LoggingDestination>::const_iterator
- it_this = destinations_.begin();
- it_this != destinations_.end();
- ++it_this) {
- bool match = false;
- for (std::vector<LoggingDestination>::const_iterator
- it_other = other.destinations_.begin();
- it_other != other.destinations_.end();
- ++it_other) {
- if (it_this->equals(*it_other)) {
- match = true;
- break;
- }
- }
- if (!match) {
- return (false);
- }
- }
- // Logging destinations are equal. Check the rest of the parameters for
- // equality.
- return (name_ == other.name_ &&
- severity_ == other.severity_ &&
- debuglevel_ == other.debuglevel_);
- }
- LoggerSpecification
- LoggingInfo::toSpec() const {
- static const std::string STDOUT = "stdout";
- static const std::string STDERR = "stderr";
- static const std::string SYSLOG = "syslog";
- static const std::string SYSLOG_COLON = "syslog:";
- LoggerSpecification spec(name_, severity_, debuglevel_);
- // Go over logger destinations and create output options accordingly.
- for (std::vector<LoggingDestination>::const_iterator dest =
- destinations_.begin(); dest != destinations_.end(); ++dest) {
- OutputOption option;
- // Set up output option according to destination specification
- if (dest->output_ == STDOUT) {
- option.destination = OutputOption::DEST_CONSOLE;
- option.stream = OutputOption::STR_STDOUT;
- } else if (dest->output_ == STDERR) {
- option.destination = OutputOption::DEST_CONSOLE;
- option.stream = OutputOption::STR_STDERR;
- } else if (dest->output_ == SYSLOG) {
- option.destination = OutputOption::DEST_SYSLOG;
- // Use default specified in OutputOption constructor for the
- // syslog destination
- } else if (dest->output_.find(SYSLOG_COLON) == 0) {
- option.destination = OutputOption::DEST_SYSLOG;
- // Must take account of the string actually being "syslog:"
- if (dest->output_ == SYSLOG_COLON) {
- // The expected syntax is syslog:facility. User skipped
- // the logging name, so we'll just use the default ("kea")
- option.facility = isc::log::getDefaultRootLoggerName();
- } else {
- // Everything else in the string is the facility name
- option.facility = dest->output_.substr(SYSLOG_COLON.size());
- }
- } else {
- // Not a recognized destination, assume a file.
- option.destination = OutputOption::DEST_FILE;
- option.filename = dest->output_;
- }
- // Copy the immediate flush flag
- option.flush = dest->flush_;
- // ... and set the destination
- spec.addOutputOption(option);
- }
- return (spec);
- }
- ElementPtr
- LoggingInfo::toElement() const {
- ElementPtr result = Element::createMap();
- // Set name
- result->set("name", Element::create(name_));
- // Set output_options
- ElementPtr options = Element::createList();
- for (std::vector<LoggingDestination>::const_iterator dest =
- destinations_.cbegin();
- dest != destinations_.cend(); ++dest) {
- options->add(dest->toElement());
- }
- result->set("output_options", options);
- // Set severity
- std::string severity;
- switch (severity_) {
- case isc::log::DEBUG:
- severity = "DEBUG";
- break;
- case isc::log::INFO:
- severity = "INFO";
- break;
- case isc::log::WARN:
- severity = "WARN";
- break;
- case isc::log::ERROR:
- severity = "ERROR";
- break;
- case isc::log::FATAL:
- severity = "FATAL";
- break;
- case isc::log::NONE:
- severity = "NONE";
- break;
- default:
- isc_throw(ToElementError, "illegal severity: " << severity_);
- break;
- }
- result->set("severity", Element::create(severity));
- // Set debug level
- result->set("debuglevel", Element::create(debuglevel_));
- return (result);
- }
- } // end of namespace isc::dhcp
- } // end of namespace isc
|