
Thanks Thomas !! On Mon, Jul 4, 2011 at 3:23 PM, Thomas Heller <thom.heller@googlemail.com>wrote:
Hi Fernando,
On Mon, Jul 4, 2011 at 5:04 PM, Fernando Pelliccioni <fpelliccioni@gmail.com> 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/ex...
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.