【发布时间】:2021-09-04 12:06:29
【问题描述】:
我有一个简单的日志类,我想用它来记录哪个文件、行和函数创建了日志消息。我通过以下方式传递信息:
Logger::Log(LoggerLevel::ERROR, __FILE__ << ":" << __LINE__ << "::" << __FUNCTION__ << ":::" << logMessage);
这是我的 Logger 头文件。
#pragma once
#include <iostream>
#include <sstream>
enum class LoggerLevel { ERROR = -1, WARN = 0, INFO = 1, DEBUG = 2, TRACE = 3 };
class Logger
{
public:
static LoggerLevel logLevel;
static LoggerLevel GetLoggerLevel();
static void LogMsg(LoggerLevel anLogLevel, const std::ostream &aMsg);
// static void Log(LoggerLevel anLogLevel, const std::basic_streambuf<char> *aMsg)
// {
// LogMsg(anLogLevel, std::stringstream() << aMsg);
// }
private:
};
#define Log(x, y) Logger::LogMsg(x, std::stringstream() << y)
我想知道如何在不使用底部的#define 的情况下做同样的事情,即使用类似于在我的头文件中注释掉的 C++ 函数。
当我尝试使用 C++ 函数时,我收到以下错误消息:
MyClass.cpp:65:44: error: invalid operands of types ‘const char [24]’ and ‘const char [2]’ to binary ‘operator<<’
65 | Logger::Log(LoggerLevel::ERROR, __FILE__ << ":" << __LINE__ << "::" << __FUNCTION__ << ":::" << logMsg);
| ~~~~~~~~ ^~ ~~~
| | |
| | const char [2]
| const char [24]
【问题讨论】:
-
你不能使用这样的语法。如果您可以将语法更改为
Logger::Log(LoggerLevel::ERROR) << __FILE__ << ":" << __LINE__;,则可以使用。 -
@IgorTandetnik 我在搜索中看到了这个选项,但我希望可能有其他人在之前的问题中没有想到的另一种方式。您的回复在这里有类似的答案:stackoverflow.com/questions/6168107/…
标签: c++ logging stringstream ostream