2

我是 g3log 的新手。我编译并运行了我在 repo 中找到的示例之一,但无法修改它以将日志消息打印到控制台而不是文件。示例中的以下几行设置了记录器:

   auto worker = g3::LogWorker::createLogWorker();
   auto handle= worker->addDefaultLogger(argv[0], path_to_log_file);
   g3::initializeLogging(worker.get());

其中中间的行设置了日志的前缀,并给出了应该创建日志文件的路径。如何修改此代码以打印到控制台\控制台和文件?

谢谢,

奥马尔。

4

2 回答 2

1

您可以使用消息接收器函数定义自定义接收器类,将剥离的消息转发到控制台而不进行格式化。下面是最简单的实现形式:

class CustomSink {
public:
    void forwardLogToStdout(g3::LogMessageMover logEntry) {
        std::cout << logEntry.get().message() << std::endl;
    }
};

因此,在您的代码中,您只需将 worker->addDefaultLogger(...) 替换为以下代码段:

auto handle = worker->addSink(std::make_unique<CustomSink>(), &CustomSink::forwardLogToStdout);

于 2018-07-22T02:42:05.943 回答
0

从 g3log github 实现您需要的彩色控制台输出:

struct ColorCoutSink {

// Linux xterm color
// http://stackoverflow.com/questions/2616906/how-do-i-output-coloured-text-to-a-linux-terminal

enum FG_Color {YELLOW = 33, RED = 31, GREEN=32, WHITE = 97};

    FG_Color GetColor(const LEVELS level) const 
    {
        if (level.value == WARNING.value) { return YELLOW; }
        if (level.value == DEBUG.value) { return GREEN; }
        if (g3::internal::wasFatal(level)) { return RED; }

        return WHITE;
    }

    void ReceiveLogMessage(g3::LogMessageMover logEntry)
    {
        auto level = logEntry.get()._level;
        auto color = GetColor(level);

        std::cout << "\033[" << color << "m" << logEntry.get().toString() << "\033[m" << std::endl;
    }
};

// in main.cpp, main() function

auto sinkHandle = logworker->addSink(std::make_unique<CustomSink>(),
                                 &CustomSink::ReceiveLogMessage);

因此,如果您删除颜色“事物”,记录器将输出到控制台

于 2018-06-05T09:04:01.220 回答