Boost logo

Boost :

Subject: Re: [boost] Phoenix V3 and Logging library help.
From: Fernando Pelliccioni (fpelliccioni_at_[hidden])
Date: 2011-07-04 15:36:47


Thanks Thomas !!

On Mon, Jul 4, 2011 at 3:23 PM, Thomas Heller <thom.heller_at_[hidden]>wrote:

> Hi Fernando,
>
> On Mon, Jul 4, 2011 at 5:04 PM, Fernando Pelliccioni
> <fpelliccioni_at_[hidden]> wrote:
> > Hi Thomas, all,
> >
> > I am researching about logging libraries.
> > I had to discard Boost.Log ( from Andrey) because this library does not
> > support GCC 3.4.
> > I've seen other libraries, but none convinced me.
>
> Yes, Phoenix seems to work with 3.4.6. For a complete overview see:
> http://www.boost.org/development/tests/trunk/developer/phoenix.html
>
> If you run into any problems, let me know.
>

Sure, thanks!

>
> > I'm thinking of writing a simple logging library, and to avoid the use of
> > macros, I decided to do something like this:
>
> Will comment inline.
>
> > namespace prototype1
> > {
> > namespace levels
> > {
>
> This won't work. If you want to get the stuff working you sketched further
> down,
> All these placeholders would need to be of a different type.
> I would suggest to define different expression nodes for every level,
> please have a look at the docs:
>
> http://beta.boost.org/doc/libs/1_47_0_beta1/libs/phoenix/doc/html/phoenix/examples/adding_an_expression.html
>
> > boost::phoenix::expression::argument<1>::type const trace = {{{}}};
> > boost::phoenix::expression::argument<1>::type const debug = {{{}}};
> > boost::phoenix::expression::argument<1>::type const info = {{{}}};
> > boost::phoenix::expression::argument<1>::type const warn = {{{}}};
> > boost::phoenix::expression::argument<1>::type const error = {{{}}};
> > boost::phoenix::expression::argument<1>::type const fatal = {{{}}};
> > } //namespace levels
> >
> > struct dynamic_logger
> > {
> > template <typename Pred>
> > void log( Pred const & pred ) const
> > {
> > streams_type::const_iterator it = streams_.begin();
> > streams_type::const_iterator end = streams_.end();
> >
> > for ( ; it != end; ++it )
> > {
> > pred( **it );
> > }
> > }
> >
> > void add_target ( std::ostream & ostr )
> > {
> > streams_.push_back( &ostr );
> > }
> >
> >
> > typedef std::vector< std::ostream* > streams_type; //to improve
> > streams_type streams_;
> > };
> >
> >
> > template <typename Logger, typename Pred>
> > void log( Logger & logger, Pred const & pred )
> > {
> > return logger.log(pred);
> > }
> >
> >
> > } //namespace prototype1
> >
> >
> >
> > int main(/*int argc, char* argv[]*/)
> > {
> > {
> > using namespace prototype1;
> > using namespace prototype1::levels;
> >
> > std::ofstream outfile ("test.log");
> >
> > dynamic_logger dl;
> > dl.add_target( std::cout );
> > dl.add_target( outfile );
> >
> > dl.log ( info << "hello" << " world!" << std::endl );
> > dl.log ( warn << "hello" << " world!" << std::endl );
> > dl.log ( error << "hello" << " world!" << std::endl );
> >
> > log( dl, info "hello" << " world!" << std::endl ); //free function
> > }
> >
> > return 0;
> > }
> >
> >
> >
> > This code is a simple prototype,
> >
> > This code is a prototype should be improved.
> > The questions are:
> >
> > 1. Does PhoenixV3 (and Proto) supports GCC 3?
>
> See above
>
> > 2. How to make the above code write the following ... ?
> >
> > INFO - hello world!
> > WARN - hello world!
> > ERROR - hello world!
> > INFO - hello world!
> >
> > Is it possible?
>
> Yes, please work through the docs, the link i posted you above should
> get you started.
>
>
I have read quickly the link you sent me, I have some doubts.
I will read all the documentation from Phoenix to see if I will clarify
concepts.

Thanks,
Fernando.


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