1#include "Framework/Logger.h"
9#include <boost/core/null_deleter.hpp>
10#include <boost/log/utility/setup/common_attributes.hpp>
25level convertLevel(
int iLvl) {
33logger makeLogger(
const std::string& name) {
34 logger lg(log::keywords::channel = name);
35 return boost::move(lg);
39const T& safeExtract(log::attribute_value attr) {
40 static const T empty_value = {};
41 auto attr_val = log::extract<T>(attr);
57 level fallback_level_;
58 std::unordered_map<std::string, level> custom_levels_;
61 Filter(level fallback, std::unordered_map<std::string, level> custom)
62 : fallback_level_{fallback}, custom_levels_{custom} {}
64 bool operator()(log::attribute_value_set
const& attrs) {
65 auto it = custom_levels_.find(safeExtract<std::string>(attrs[
"Channel"]));
66 if (it != custom_levels_.end()) {
67 return safeExtract<level>(attrs[
"Severity"]) >= it->second;
69 return safeExtract<level>(attrs[
"Severity"]) >= fallback_level_;
75 typedef sinks::text_ostream_backend ourSinkBack_t;
76 typedef sinks::synchronous_sink<ourSinkBack_t> ourSinkFront_t;
78 level file_level{convertLevel(p.
get<
int>(
"fileLevel", 0))};
79 std::string file_path{p.
get<std::string>(
"filePath",
"")};
81 level term_level{convertLevel(p.
get<
int>(
"termLevel", 4))};
82 std::vector<framework::config::Parameters> empty{};
83 const auto& log_rules{
84 p.
get<std::vector<framework::config::Parameters>>(
"logRules", empty)};
85 std::unordered_map<std::string, level> custom_levels;
86 for (
const auto& log_rule : log_rules) {
87 custom_levels[log_rule.get<std::string>(
"name")] =
88 convertLevel(log_rule.get<
int>(
"level"));
96 log::add_common_attributes();
99 boost::shared_ptr<log::core> core = log::core::get();
103 if (not file_path.empty()) {
104 boost::shared_ptr<ourSinkBack_t> file_back =
105 boost::make_shared<ourSinkBack_t>();
106 file_back->add_stream(boost::make_shared<std::ofstream>(file_path));
108 boost::shared_ptr<ourSinkFront_t> file_sink =
109 boost::make_shared<ourSinkFront_t>(file_back);
112 file_sink->set_filter(Filter(file_level, custom_levels));
113 file_sink->set_formatter(
114 [](
const log::record_view& view, log::formatting_ostream& os) {
117 core->add_sink(file_sink);
121 boost::shared_ptr<ourSinkBack_t> term_back =
122 boost::make_shared<ourSinkBack_t>();
123 term_back->add_stream(boost::shared_ptr<std::ostream>(
125 boost::null_deleter()
128 term_back->auto_flush(
true);
130 boost::shared_ptr<ourSinkFront_t> term_sink =
131 boost::make_shared<ourSinkFront_t>(term_back);
134 term_sink->set_filter(Filter(term_level, custom_levels));
136 term_sink->set_formatter(
137 [](
const log::record_view& view, log::formatting_ostream& os) {
140 core->add_sink(term_sink);
148 log::core::get()->remove_all_sinks();
155 return the_formatter;
161 log::formatting_ostream& os) {
162 os <<
"[ " << log::extract<std::string>(
"Channel", view) <<
" ] "
163 << event_number_ <<
" ";
168 const level msg_level{safeExtract<level>(view[
"Severity"])};
198 os <<
": " << view[log::expressions::smessage];
Class encapsulating parameters for configuring a processor.
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Our filter implementation aligning with Boost.Log.
All classes in the ldmx-sw project use this namespace.