Boost logo

Boost :

Subject: Re: [boost] Custom logging backend difficulty
From: Kenneth Adam Miller (kennethadammiller_at_[hidden])
Date: 2014-10-27 17:02:58


On Mon, Oct 27, 2014 at 4:30 PM, Andrey Semashev <andrey.semashev_at_[hidden]>
wrote:

> On Monday 27 October 2014 23:30:09 you wrote:
> > On Monday 27 October 2014 15:48:28 Kenneth Adam Miller wrote:
> > > On Mon, Oct 27, 2014 at 3:03 PM, Kenneth Adam Miller <
> > >
> > > kennethadammiller_at_[hidden]> wrote:
> > > > Ah ok that clarifies somewhat; I thought it was the formatter that I
> > > > was
> > > > having trouble with. I tried setting one, and then saw that the text
> was
> > > > added to the console to test. But I'm doing
> > > > boost::log::add_common_attributes(), and I print the string to std
> out
> > > > just
> > > > to make sure that I will get what I expect. As it turns out, I think
> > > > that
> > > > the backend is supposed to visit the record_view, and the record view
> > > > has
> > > > the default attributes and any others added.
> >
> > The formatter just composes a string from the attribute values attached
> to
> > the record, it's the sink backend that is supposed to do something with
> > that string, like output to the console or send over the network.
> > Text-based backends typically don't need to access the record view
> > (although they're still able to) because the formatter already did all
> the
> > job.
> >
> > > > I'm trying to get those extra attributes; if I do BOOST_LOG(lg) << "
> > > > blah"
> > > > << endl; I get "blah" on my screen which I swap out the backend from
> the
> > > > default. My backend just prints to the console.
> > > >
> > > > How do I had the record_view items to the string to be sent?
> >
> > With formatter, you just have to use it in the formatting expression. A
> few
> > examples are here:
> >
> >
> http://www.boost.org/doc/libs/1_56_0/libs/log/doc/html/log/tutorial/formatte
> > rs.html
> >
> > Basically, you need the attribute value name and type to do that.
> >
> > > Reading some more at the top of this:
> > >
> http://boost-log.sourceforge.net/libs/log/doc/html/log/tutorial/formatters
> > > .h tml
> > >
> > > I found that:
> > > Even if you added attributes to the logging core or a logger, the
> > > attribute
> > > values will not reach the output unless you specify a formatter that
> will
> > > use these values.
> > >
> > > is what is holding me up. How can I specify a formatter that just gives
> > > the
> > > attribute name and then it's value, each separable by some delimiter? I
> > > want to make certain that all attributes are consumed. Really, the
> reason
> > > why I want this is, I don't know what the actual types are in the attr<
> > > some_type > format, as demonstrated in several examples. This is kind
> of a
> > > work around, but really I just want all the data that I enable at the
> > > consumer level to make it by some default formatting method.
> >
> > There is no built-in formatter in the library that just iterates through
> the
> > values in the record, you have to write your own. It's simple, just
> write a
> > function like described here:
> >
> >
> http://www.boost.org/doc/libs/1_56_0/libs/log/doc/html/log/tutorial/formatte
> > rs.html#log.tutorial.formatters.custom_formatting_functions
> >
> > The record view has attribute_values() member, which returns an
> associative
> > container of all attached values in pairs (name; value). Each value is an
> > object of attribute_value class, from which you can extract the actual
> > contained value through one of the approaches listed in the link I posted
> > earlier. In particular, you can use visitation and something similar to a
> > print_visitor class in the example here:
> >
> >
> http://www.boost.org/doc/libs/1_56_0/libs/log/doc/html/log/detailed/attribut
> >
> es.html#log.detailed.attributes.related_components.value_processing.visitati
> > on
> >
> > Of course, the formatter should insert its output into the provided
> stream,
> > not std::cout.
>
> PS: Please, don't top post.
>
>
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
>

Ah ok, I got it now, it's mostly working.

But I'm getting an error when I set up my formatter... I followed the
example exactly for the format_date_time to get a timestamp, and I'm
getting a compile error.

sink->set_formatter( stream << format_date_time<boost::posix_time::ptime >
("TimeStamp", "%Y-%m-%d %H:%M:%S") << message);

blows up pretty bad.

Also, adding a line for severity

<< "[" << boost::log::trivial::severity << "] "

just yields [] in the output lines.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk