3

我正在寻找将自定义初始消息添加到std::cout(或std::cerr)打印到控制台/文件输出的所有消息的最佳方法。

例如,如果我将此自定义提示消息设置为字符串“[Log]”,那么经典

std::cerr << "This is a log message" << std::endl;

将以这种方式打印:

> [Log] This is a log message

显然我可以使用

std::string PROMPT_MSG = "[Log]";
std::cerr << PROMPT_MSG << "This is a log message" << std::endl;

但我想要一种侵入性较小的方式。

提前致谢

4

4 回答 4

7

您可以编写自己的课程:

#include <iostream>
#include <string>

class MyLogger
{
    std::ostream & out;
    std::string const msg;
public:
    MyLogger(std::ostream & o, std::string s)
    : out(o)
    , msg(std::move(s))
    { }

    template <typename T>
    std::ostream & operator<<(T const & x)
    {
        return out << msg << x;
    }
};

MyLogger MyErr(std::cerr, "[LOG] ");

用法:

MyErr << "Hello" << std::endl;
于 2013-08-09T16:05:42.593 回答
5

正如 Joachim Pileborg 建议的那样,您可以使用日志框架。您可以使用现有的,也可以从只包含一个类的您自己的开始:

class MyLogger{}
template <typename T>
MyLogger& operator << (MyLogger& logger, const T& logStuff)
{
   std::cerr << PROMPT_MSG << logStuff << std::endl;
   return logger;
}

然后定义一个 MyLogger 类的全局变量:

MyLogger mylogger;

然后当你想写日志记录时,写:

mylogger << "This is a log message";

MyLogger 类的重载运算符 << 会做你想做的事;

于 2013-08-09T16:11:47.777 回答
2

我在最近的一个项目中遇到了同样的问题。我用这个小课解决了这个问题:

class DebugOut
{
public:
static const int COLUMN_WIDTH = 15;
DebugOut(const std::wstring &type)
{
    std::wcout << type;
    for(int i=type.length();i<COLUMN_WIDTH;i++)
        std::wcout << " ";
    std::wcout << ": ";
}

~DebugOut()
{
    std::wcout << std::endl;
}
template <typename T>
friend DebugOut& operator<<(DebugOut& out,T i)
{
    std::wcout << i;
    return out;
}
};

示例用法:DebugOut(L"Log") << "Something";

于 2013-08-09T16:03:40.163 回答
0

我想你可以只定义一个函数log和一个函数error,然后在你想打印日志或错误方法时调用它们。这样您就不必每次都添加 PROMPT_MSG。

于 2013-08-09T16:03:49.147 回答