Commit 1f8a509b authored by Dominik Charousset's avatar Dominik Charousset

Replace component-filter with component-blacklist

The component filter only used substring-matching, which makes it
impossible to filter the "caf" component without also filtering
"caf.flow". The new blacklist approach uses exact matches and also uses
atoms instead of strings for the component names to speed up lookups.
parent 4eb2d18a
...@@ -73,5 +73,5 @@ console-format="%m" ...@@ -73,5 +73,5 @@ console-format="%m"
; configures the minimum severity of messages that are written to the console ; configures the minimum severity of messages that are written to the console
; (quiet|error|warning|info|debug|trace) ; (quiet|error|warning|info|debug|trace)
console-verbosity='trace' console-verbosity='trace'
; excludes listed components from logging ; excludes listed components from logging (list of atoms)
component-filter="" component-blacklist=[]
...@@ -28,11 +28,12 @@ ...@@ -28,11 +28,12 @@
#include <unordered_map> #include <unordered_map>
#include "caf/abstract_actor.hpp" #include "caf/abstract_actor.hpp"
#include "caf/atom.hpp"
#include "caf/config.hpp" #include "caf/config.hpp"
#include "caf/deep_to_string.hpp" #include "caf/deep_to_string.hpp"
#include "caf/detail/arg_wrapper.hpp" #include "caf/detail/arg_wrapper.hpp"
#include "caf/detail/pretty_type_name.hpp"
#include "caf/detail/log_level.hpp" #include "caf/detail/log_level.hpp"
#include "caf/detail/pretty_type_name.hpp"
#include "caf/detail/ringbuffer.hpp" #include "caf/detail/ringbuffer.hpp"
#include "caf/detail/scope_guard.hpp" #include "caf/detail/scope_guard.hpp"
#include "caf/detail/shared_spinlock.hpp" #include "caf/detail/shared_spinlock.hpp"
...@@ -113,7 +114,7 @@ public: ...@@ -113,7 +114,7 @@ public:
event& operator=(const event&) = default; event& operator=(const event&) = default;
event(unsigned lvl, unsigned line, string_view cat, string_view full_fun, event(unsigned lvl, unsigned line, atom_value cat, string_view full_fun,
string_view fun, string_view fn, std::string msg, std::thread::id t, string_view fun, string_view fn, std::string msg, std::thread::id t,
actor_id a, timestamp ts); actor_id a, timestamp ts);
...@@ -126,7 +127,7 @@ public: ...@@ -126,7 +127,7 @@ public:
unsigned line_number; unsigned line_number;
/// Name of the category (component) logging the event. /// Name of the category (component) logging the event.
string_view category_name; atom_value category_name;
/// Name of the current function as reported by `__PRETTY_FUNCTION__`. /// Name of the current function as reported by `__PRETTY_FUNCTION__`.
string_view pretty_fun; string_view pretty_fun;
...@@ -228,7 +229,7 @@ public: ...@@ -228,7 +229,7 @@ public:
/// Returns whether the logger is configured to accept input for given /// Returns whether the logger is configured to accept input for given
/// component and log level. /// component and log level.
bool accepts(unsigned level, string_view component_name); bool accepts(unsigned level, atom_value component_name);
/// Returns the output format used for the log file. /// Returns the output format used for the log file.
const line_format& file_format() const { const line_format& file_format() const {
...@@ -345,7 +346,7 @@ private: ...@@ -345,7 +346,7 @@ private:
config cfg_; config cfg_;
// Filters events by component name. // Filters events by component name.
std::string component_filter; std::vector<atom_value> component_blacklist;
// References the parent system. // References the parent system.
actor_system& system_; actor_system& system_;
...@@ -416,7 +417,7 @@ bool operator==(const logger::field& x, const logger::field& y); ...@@ -416,7 +417,7 @@ bool operator==(const logger::field& x, const logger::field& y);
#define CAF_LOG_MAKE_EVENT(aid, component, loglvl, message) \ #define CAF_LOG_MAKE_EVENT(aid, component, loglvl, message) \
::caf::logger::event { \ ::caf::logger::event { \
loglvl, __LINE__, component, CAF_PRETTY_FUN, __func__, \ loglvl, __LINE__, caf::atom(component), CAF_PRETTY_FUN, __func__, \
caf::logger::skip_path(__FILE__), \ caf::logger::skip_path(__FILE__), \
(::caf::logger::line_builder{} << message).get(), \ (::caf::logger::line_builder{} << message).get(), \
::std::this_thread::get_id(), aid, ::caf::make_timestamp() \ ::std::this_thread::get_id(), aid, ::caf::make_timestamp() \
...@@ -457,7 +458,7 @@ inline caf::actor_id caf_set_aid_dummy() { return 0; } ...@@ -457,7 +458,7 @@ inline caf::actor_id caf_set_aid_dummy() { return 0; }
do { \ do { \
auto CAF_UNIFYN(caf_logger) = caf::logger::current_logger(); \ auto CAF_UNIFYN(caf_logger) = caf::logger::current_logger(); \
if (CAF_UNIFYN(caf_logger) != nullptr \ if (CAF_UNIFYN(caf_logger) != nullptr \
&& CAF_UNIFYN(caf_logger)->accepts(loglvl, component)) \ && CAF_UNIFYN(caf_logger)->accepts(loglvl, caf::atom(component))) \
CAF_UNIFYN(caf_logger) \ CAF_UNIFYN(caf_logger) \
->log(CAF_LOG_MAKE_EVENT(CAF_UNIFYN(caf_logger)->thread_local_aid(), \ ->log(CAF_LOG_MAKE_EVENT(CAF_UNIFYN(caf_logger)->thread_local_aid(), \
component, loglvl, message)); \ component, loglvl, message)); \
...@@ -563,7 +564,7 @@ inline caf::actor_id caf_set_aid_dummy() { return 0; } ...@@ -563,7 +564,7 @@ inline caf::actor_id caf_set_aid_dummy() { return 0; }
/// The log component responsible for logging control flow events that are /// The log component responsible for logging control flow events that are
/// crucial for understanding happens-before relations. See RFC SE-0001. /// crucial for understanding happens-before relations. See RFC SE-0001.
#define CAF_LOG_FLOW_COMPONENT "caf.flow" #define CAF_LOG_FLOW_COMPONENT "caf_flow"
#define CAF_LOG_SPAWN_EVENT(ref, ctor_data) \ #define CAF_LOG_SPAWN_EVENT(ref, ctor_data) \
CAF_LOG_IMPL(CAF_LOG_FLOW_COMPONENT, CAF_LOG_LEVEL_DEBUG, \ CAF_LOG_IMPL(CAF_LOG_FLOW_COMPONENT, CAF_LOG_LEVEL_DEBUG, \
......
...@@ -35,7 +35,7 @@ R make_actor(actor_id aid, node_id nid, actor_system* sys, Ts&&... xs) { ...@@ -35,7 +35,7 @@ R make_actor(actor_id aid, node_id nid, actor_system* sys, Ts&&... xs) {
#if CAF_LOG_LEVEL >= CAF_LOG_LEVEL_DEBUG #if CAF_LOG_LEVEL >= CAF_LOG_LEVEL_DEBUG
actor_storage<T>* ptr = nullptr; actor_storage<T>* ptr = nullptr;
if (logger::current_logger()->accepts(CAF_LOG_LEVEL_DEBUG, if (logger::current_logger()->accepts(CAF_LOG_LEVEL_DEBUG,
CAF_LOG_FLOW_COMPONENT)) { caf::atom(CAF_LOG_FLOW_COMPONENT))) {
std::string args; std::string args;
args = deep_to_string(std::forward_as_tuple(xs...)); args = deep_to_string(std::forward_as_tuple(xs...));
ptr = new actor_storage<T>(aid, std::move(nid), sys, ptr = new actor_storage<T>(aid, std::move(nid), sys,
......
...@@ -157,6 +157,8 @@ actor_system_config::actor_system_config() ...@@ -157,6 +157,8 @@ actor_system_config::actor_system_config()
"sets the console output verbosity " "sets the console output verbosity "
"(quiet|error|warning|info|debug|trace)") "(quiet|error|warning|info|debug|trace)")
.add(logger_component_filter, "component-filter", .add(logger_component_filter, "component-filter",
"DEPRECATED/IGNORED, use component-blacklist instead")
.add<std::vector<atom_value>>("component-blacklist",
"exclude all listed components from logging") "exclude all listed components from logging")
.add(logger_verbosity, "verbosity", .add(logger_verbosity, "verbosity",
"set file and console verbosity (deprecated)") "set file and console verbosity (deprecated)")
......
...@@ -254,7 +254,7 @@ logger::config::config() ...@@ -254,7 +254,7 @@ logger::config::config()
// nop // nop
} }
logger::event::event(unsigned lvl, unsigned line, string_view cat, logger::event::event(unsigned lvl, unsigned line, atom_value cat,
string_view full_fun, string_view fun, string_view fn, string_view full_fun, string_view fun, string_view fn,
std::string msg, std::thread::id t, actor_id a, std::string msg, std::thread::id t, actor_id a,
timestamp ts) timestamp ts)
...@@ -351,15 +351,11 @@ logger* logger::current_logger() { ...@@ -351,15 +351,11 @@ logger* logger::current_logger() {
return get_current_logger(); return get_current_logger();
} }
bool logger::accepts(unsigned level, string_view cname) { bool logger::accepts(unsigned level, atom_value cname) {
if (level > cfg_.verbosity) if (level > cfg_.verbosity)
return false; return false;
if (!component_filter.empty()) { return !std::any_of(component_blacklist.begin(), component_blacklist.end(),
auto it = std::search(component_filter.begin(), component_filter.end(), [=](atom_value name) { return name == cname; });
cname.begin(), cname.end());
return it != component_filter.end();
}
return true;
} }
logger::logger(actor_system& sys) : system_(sys) { logger::logger(actor_system& sys) : system_(sys) {
...@@ -377,8 +373,10 @@ logger::~logger() { ...@@ -377,8 +373,10 @@ logger::~logger() {
void logger::init(actor_system_config& cfg) { void logger::init(actor_system_config& cfg) {
CAF_IGNORE_UNUSED(cfg); CAF_IGNORE_UNUSED(cfg);
namespace lg = defaults::logger; namespace lg = defaults::logger;
component_filter = get_or(cfg, "logger.component-filter", using atom_list = std::vector<atom_value>;
lg::component_filter); auto blacklist = get_if<atom_list>(&cfg, "logger.component-blacklist");
if (blacklist)
component_blacklist = move_if_optional(blacklist);
// Parse the configured log level. // Parse the configured log level.
auto verbosity = get_if<atom_value>(&cfg, "logger.verbosity"); auto verbosity = get_if<atom_value>(&cfg, "logger.verbosity");
auto file_verbosity = verbosity ? *verbosity : lg::file_verbosity; auto file_verbosity = verbosity ? *verbosity : lg::file_verbosity;
...@@ -476,7 +474,7 @@ void logger::render(std::ostream& out, const line_format& lf, ...@@ -476,7 +474,7 @@ void logger::render(std::ostream& out, const line_format& lf,
const event& x) const { const event& x) const {
for (auto& f : lf) for (auto& f : lf)
switch (f.kind) { switch (f.kind) {
case category_field: out << x.category_name; break; case category_field: out << to_string(x.category_name); break;
case class_name_field: render_fun_prefix(out, x); break; case class_name_field: render_fun_prefix(out, x); break;
case date_field: render_date(out, x.tstamp); break; case date_field: render_date(out, x.tstamp); break;
case file_field: out << x.file_name; break; case file_field: out << x.file_name; break;
...@@ -617,8 +615,8 @@ void logger::log_first_line() { ...@@ -617,8 +615,8 @@ void logger::log_first_line() {
msg += to_string(get_or(system_.config(), config_name, default_value)); msg += to_string(get_or(system_.config(), config_name, default_value));
msg += ", node = "; msg += ", node = ";
msg += to_string(system_.node()); msg += to_string(system_.node());
msg += ", component_filter = "; msg += ", component-blacklist = ";
msg += deep_to_string(component_filter); msg += deep_to_string(component_blacklist);
return msg; return msg;
}; };
namespace lg = defaults::logger; namespace lg = defaults::logger;
......
...@@ -180,7 +180,7 @@ CAF_TEST(rendering) { ...@@ -180,7 +180,7 @@ CAF_TEST(rendering) {
logger::event e{ logger::event e{
CAF_LOG_LEVEL_WARNING, CAF_LOG_LEVEL_WARNING,
42, 42,
"unit.test", atom("unit_test"),
"void ns::foo::bar()", "void ns::foo::bar()",
"bar", "bar",
"foo.cpp", "foo.cpp",
...@@ -199,7 +199,7 @@ CAF_TEST(rendering) { ...@@ -199,7 +199,7 @@ CAF_TEST(rendering) {
using namespace std::placeholders; using namespace std::placeholders;
auto render_event = bind(&logger::render, &lg, _1, _2, _3); auto render_event = bind(&logger::render, &lg, _1, _2, _3);
CAF_CHECK_EQUAL(render(render_event, lf, e), CAF_CHECK_EQUAL(render(render_event, lf, e),
"unit.test WARN actor0 ns.foo bar foo.cpp:42 hello world"); "unit_test WARN actor0 ns.foo bar foo.cpp:42 hello world");
} }
CAF_TEST(render_fun_prefix) { CAF_TEST(render_fun_prefix) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment