在C ++中自定义日志记录的方法

时间:2011-07-26 17:35:58

标签: c++ operator-overloading

我正在重构我的C ++应用程序。在我使用宏之前

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

我现在的想法是写一个Log类,如此:

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

当我使用它时,获取特定动作的“自动”记录(即当它们开始时,停止+另外的时间等)

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

我正在努力的方法是确定一种方法,使其适用于案例3)。在Java中,我可以使用一个方法,它接受一个String参数,因为编译器负责自动构建字符串。我在C ++中有什么可能性?

我可以让它工作,以便我可以像任何一个选项一样使用它吗?

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

4 个答案:

答案 0 :(得分:3)

正如我在评论中提到的,你可以使用Boost.Format。它也有助于解决字符串到字符串的转换等问题。但是,为了避免调用.str()来调用std::string构造函数,可能会有一些接受{boost::format。 1}}直接。

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)

有关详细信息,请参阅Boost.Format documentation

答案 1 :(得分:1)

想到两个直接的可能性。第一种是利用std :: string追加:

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

第二个是制作更多带有其他参数的log构造函数:

Log log("foo:", bar);

答案 2 :(得分:0)

您真的应该考虑使用Boost.Log进行日志记录。记录可能是一件复杂的事情;完成一个完整的实现是很有用的。

答案 3 :(得分:0)

您可以创建一个继承自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;
};

现在您可以将输出记录为

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

在endf(ostream&amp; s)中,您可以将ostream强制转换为Mstream并调用Write()。在Write()中,格式化输出并将其打印到控制台或文件。