Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Inheriting from std::ostream to override formatting.

Reply
Thread Tools

Inheriting from std::ostream to override formatting.

 
 
AJG
Guest
Posts: n/a
 
      06-29-2008
Hi there. I am using a library called SOCI that has a method to set a
stream which it uses to log SQL queries. The signature is as follows:

void setLogStream(std:stream *s);

This works great when used with something like
setLogStream(&std::cerr). However, I would like to add more context to
the query logged. Specifically, I'd like to add the thread ID. So,
instead of the query logged looking like:

select * from foo;

it would look like:

<thread-id>| select * from foo;

I already have the function to get the thread id
(boost::this_thread::get_id()), but I need to find a way to pass an
object to setLogStream that will do the formatting for me. As far as I
can tell, the only way to do this is inheriting from std:stream and
somehow overriding the default formatting. Except I'm not sure which
of its methods are virtual and meant to be overridden. Any clues?

Basically, I figure what I need might look something like:

struct ThreadLogger : public std:stream {
// ...
virtual void someOverridenFunction(const char *const buffer) {
std::cerr << boost::this_thread::get_id() << "| " << buffer;
}
// ...
};

and then:

ThreadLogger logger;
setLogStream(&logger);

Is what I'm looking to do possible? Should I look into IO manipulators
instead? Any help greatly appreciated .

Thanks!


 
Reply With Quote
 
 
 
 
James Kanze
Guest
Posts: n/a
 
      06-29-2008
On Jun 29, 4:37 am, AJG <(E-Mail Removed)> wrote:
> Hi there. I am using a library called SOCI that has a method
> to set a stream which it uses to log SQL queries. The
> signature is as follows:


> void setLogStream(std:stream *s);


> This works great when used with something like
> setLogStream(&std::cerr). However, I would like to add more
> context to the query logged. Specifically, I'd like to add the
> thread ID. So, instead of the query logged looking like:


> select * from foo;


> it would look like:


> <thread-id>| select * from foo;


> I already have the function to get the thread id
> (boost::this_thread::get_id()), but I need to find a way to
> pass an object to setLogStream that will do the formatting for
> me.


You also need a way of ensuring correct locking on the output
stream object.

> As far as I can tell, the only way to do this is inheriting
> from std:stream and somehow overriding the default
> formatting. Except I'm not sure which of its methods are
> virtual and meant to be overridden.


None of the functions (except the destructor) are virtual and
are meant to be overridden. That's not how ostream works.

> Any clues?


You could use a filtering streambuf to insert the thread id at
the start of each line, but that still leaves the issue of
locking. The usual solution is to combine a filtering streambuf
(to "decorate" the output, i.e. adding timestamp, thread id,
line and filename...) and an output stream wrapper (to manage
the lock, and more generally the notion of a "record", and to
ensure that each record ends with a new line, is immediately
flushed, and is atomic, e.g. when the output stream sends emails
or writes to syslog).

For more information on filtering streambufs, see
http://kanze.james.neuf.fr/articles-en.html; an implementation
is also available there, or you can use boost::iostream (if e.g.
you're already using Boost). I'm not aware of any good article
on output stream wrappers, but the concept is simple enough that
it might not be necessary. Again, an implementation is
available at my site, but if you don't feel like installing the
entire library (and I've made no effort to date to make it
fractionable), it's small enough and simple enough that you
should be able to just copy the relevant code and manage it as
your own.

--
James Kanze (GABI Software) email:(E-Mail Removed)
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Inheriting class with private constructor Michael Carr ASP .Net 1 12-29-2003 04:59 AM
Inheriting System.UI.ControlCollection for a WebControl - FindControl doesn't work??? Harry F. Harrison ASP .Net 0 12-18-2003 06:28 PM
Inheriting from base form Andy Breward ASP .Net 1 11-07-2003 06:15 AM
inheriting from a class that inherits from the UserControl class Joel Barsotti ASP .Net 4 10-30-2003 08:05 PM
Inheriting local variables from a common source? Wayne J ASP .Net 2 10-24-2003 05:59 PM



Advertisments