|
Boost : |
Subject: Re: [boost] Custom logging backend difficulty
From: Brian Smith (bjs3141_at_[hidden])
Date: 2014-10-28 07:35:36
On 10/27/14, Kenneth Adam Miller <kennethadammiller_at_[hidden]> wrote:
> On Mon, Oct 27, 2014 at 5:02 PM, Kenneth Adam Miller <
> kennethadammiller_at_[hidden]> wrote:
>
>>
>> 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.
>>
>
>
> I got everything to work, and I'm doing ok. Thanks! :)
>
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
>
-- www.maidsafe.net
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk