开发者

Ways for custom logging in C++

I am in progress of refactoring a C++ application of mine. Before I used a macro like

LOG("something interesting") // 1
LOG("something ended")       // 2
LOG("foo: " << bar)          // 3

My idea now was to write a Log class like so:

Log(std::string _init_message):
    init_message(_init_message)
{   PrintLogLine(init_message + "   ...");}
~Log() 
{   PrintLogLine(init_message + " done.");}

to get "automatic" logging of specific ac开发者_JS百科tions (i.e. when they start, stop + additionally timings etc.) when I use it like

void ActionXYZ() {
   Log log("xyz");
   // do stuff
}

Where I am struggling is in defining a way to make it work for case 3). In Java I could use a method which takes one String argument since the compiler takes care of automatically string building. What possibilities do I have in C++?

Can I make it work so that I can use it like either one option?

 // in "do stuff"
 log("foo:" + bar); // OR
 log << "foo:" << bar;


As I've mentioned in the comments, you could use Boost.Format. It also helps with the problem of int-to-string conversions, etc. It might get a bit verbose, though — to avoid calling .str() to call std::string constructor, you could make one that accepts boost::format directly.

Log log(boost::format("foo %1% bar") % 42); // with Log(boost::format)
Log log((boost::format("foo %1% bar") % 42).str()); // with only Log(std::string)

Refer to Boost.Format documentation for details.


Two immediate possibilities come to mind. The first is to take advantage of std::string appending:

Log log(std::string("foo:") + bar);

The second is to make more log constructors that take additional parameters:

Log log("foo:", bar);


You really should consider using Boost.Log for your logging. Logging can be a complex thing; it's useful to get a fully formed implementation.


You can create a logging class that inherits from std::strstream.

class Mstream : public std::strstream
{
  public:
  Mstream() : std::strstream(Buffer = new char[BUFLEN], BUFLEN, ios::out);
  ostream& endf(ostream& s);
  void Write();

  private:
  char* Buffer;
};

Now you can log output as,

Mstream m; 
m <<"Foo"<<s<<endf;

In endf(ostream& s) you can cast ostream to Mstream and call the Write(). In Write(), you format the output and print it to console or to a file.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜