boost log: attributes and different loggers

Hi, I am trying to use 2 loggers - 1 severity logger - 1 'normal' logger However, when I add sink->set_filter(flt::attr< severity_level >("Severity") >= level); to the severity logger sink and try to use the second logger I get: terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::log_mt_posix::missing_value>
' what(): Requested attribute value not found
The second logger has no formatter: backend->set_formatter(fmt::stream << fmt::message()); Nor has it any attribute. I tried different solutions, but nothing works - what am I missing? Best, Dirk

On 06/10/2010 02:19 PM, Dirk Griffioen wrote:
Hi,
I am trying to use 2 loggers - 1 severity logger - 1 'normal' logger
However, when I add
sink->set_filter(flt::attr< severity_level >("Severity") >= level);
to the severity logger sink and try to use the second logger I get:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::log_mt_posix::missing_value>
' what(): Requested attribute value not found
The second logger has no formatter:
backend->set_formatter(fmt::stream << fmt::message());
Nor has it any attribute.
I tried different solutions, but nothing works - what am I missing?
If you emit log records from the basic logger (not the one with severity level), the record doesn't contain the severity level attached. The filter throws because it doesn't find it in the record. You can change the filter in two ways to avoid the exception: 1. flt::attr< severity_level >("Severity", std::nothrow) >= level That way the filter will silently drop all records without the level attached. 2. !flt::has_attr< severity_level >("Severity") || flt::attr< severity_level >("Severity") >= level That way it will pass all records without the level.

Hi Andrey, Thanks for your reply!
If you emit log records from the basic logger (not the one with severity level), the record doesn't contain the severity level attached. The filter throws because it doesn't find it in the record.
You can change the filter in two ways to avoid the exception:
1. flt::attr< severity_level>("Severity", std::nothrow)>= level
This works fine for me.
That way the filter will silently drop all records without the level attached.
2. !flt::has_attr< severity_level>("Severity") || flt::attr< severity_level>("Severity")>= level
That way it will pass all records without the level.
I tried something in this direction, but didnt get it quite right before. Thanks for clarifying - Best, Dirk
participants (2)
-
Andrey Semashev
-
Dirk Griffioen