2010/8/20 Olivier Tournaire <olitour@gmail.com>
Thank you Oskar!

2010/8/20 Oskar Nordquist <oskar.nordquist@gmail.com>
2010/8/20 Olivier Tournaire <olitour@gmail.com>

2010/8/20 Oskar Nordquist <oskar.nordquist@gmail.com>

Hi,

Just a wild guess:

Since the difference between your test program and the Boost example is that you are doing all the preparations in the constructor, whilst Boost example has everything in the main() scope. My guess is something goes out of scope at the end of the constructor, and some attribute is unregistered and thus generates "missing attribute" exception.

Maybe it is a problem with the singleton? No one experienced such a problem?
I tried a really simple program found in the documentation (http://boost-log.sourceforge.net/libs/log/doc/html/log/detailed/attributes.html#log.detailed.attributes.timer) which uses a class. The result is the same: it throws the same exception in the destructor.

 
I tried it on MSVC 10 as well and it throws the same exception. I even did a boolean formatter checking if the attribute exists:

    backend->set_formatter(
        fmt::stream
            << fmt::if_(flt::has_attr("Duration"))
            [
                fmt::stream << "Duration: " << fmt::attr("Duration")
            ]
            << "\tMsg: " << fmt::message());

Still throws the same exception.

I switched the attribute to a attrs::counter<int> and it works as expected.

Seems like attrs::timer is broken!

Seems you are right. Commenting the line
<< "] [" << fmt::time_duration< boost::posix_time::time_duration >("Uptime")
makes the sample work.
Should a bug report be open?

Ah, sorry. I did not realize one had to use fmt::time_duration<> to print an attrs::timer.

There is nothing wrong with attrs::timer. The problem you are having in your example is you are using a scoped thread attribute ("Uptime"). This attribute goes out of scope in your constructor, which throws the exception, as the value is not present in your test function.


The manual says:

  It is possible that in run time the attribute value requested by the formatter is not present in the formatted log record. In this case the formatter   by default will throw an exception. If this behavior is not desired, one can change it in one of the following ways:

  1. Use the conditional formatter with the has_attr filter to first verify that the required attribute value is present and apply formatting then.
  2. Use an additional last std::nothrow argument to the attr placeholder. In this case the formatter will produce no output for the missing attribute value, without throwing the exception.


In your test program, either move the scoped attribute to your outer scope, use a conditional formatter, or use std::nothrow in your format attribute.

For std::nothrow, use this line instead:

<< "] [" << fmt::time_duration< boost::posix_time::time_duration >("Uptime", std::nothrow)

 

Regards,

Olivier
 

Regards,
Oskar