// // log.cpp // // Copyright (c) 2019 2020 Andrea Bondavalli. All rights reserved. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #include #include #include #include #include #include #include #include #include "config.hpp" #include "log.hpp" namespace logging = boost::log; namespace src = boost::log::sources; namespace sinks = boost::log::sinks; namespace keywords = boost::log::keywords; using sink_t = sinks::synchronous_sink; void log_init(const Config& config) { boost::shared_ptr core = logging::core::get(); // remove all sink in case of re-configuration core->remove_all_sinks(); // set log level core->set_filter(logging::trivial::severity >= config.get_log_severity()); /* if proto is none, syslog is disable, logging on stdout */ if (config.get_syslog_proto() != "none") { boost::shared_ptr backend; /* if proto is udp, syslog_server address is used */ if (config.get_syslog_proto() == "udp") { backend = boost::make_shared( keywords::facility = sinks::syslog::local0, keywords::use_impl = sinks::syslog::udp_socket_based); std::vector address; boost::split(address, config.get_syslog_server(), boost::is_any_of(":")); if (address.size() == 2) { // Setup the target address and port to send syslog messages to backend->set_target_address(address[0], boost::lexical_cast(address[1])); } } else { /* if proto is local, local syslog is used */ backend = boost::make_shared( keywords::facility = sinks::syslog::user, keywords::use_impl = sinks::syslog::native); } // Create and fill in another level translator for "MyLevel" attribute of // type string sinks::syslog::custom_severity_mapping mapping("MyLevel"); mapping["debug"] = sinks::syslog::debug; mapping["normal"] = sinks::syslog::info; mapping["warning"] = sinks::syslog::warning; mapping["failure"] = sinks::syslog::critical; backend->set_severity_mapper(mapping); // Wrap it into the frontend and register in the core. core->add_sink(boost::make_shared(backend)); } }