在C++ 11应用程序中进行错误记录的优雅方法?

vin*_*nux 8 c++

我正在开发一个小型的C++ 11应用程序(一个SDL2游戏),我很难将一些面向对象的知识从PHP/Java"移植"到C++.例如,为了创建一个优雅的错误日志记录方法,我将创建一个包含各种适配器的类,并在那里集中日志记录.我已经用C++做过了,但我不知道我的类应该如何使用Logger该类.

在Java和PHP中,我将使用依赖注入,并将其Logger作为类成员变量.但在C++中,正确的方法是什么?我真的不认为静止会很好.

Esc*_*alo 5

天啊.

对我来说,日志记录类似于日期/时间处理:基本情况是微不足道的,但是除了微不足道之外的任何事情都非常复杂:没有中间立场.

我建议您研究一个通用的日志记录库,如PantheiosBoost.Log.

我之所以建议采用这种方法,而不是"自己动手",是因为我直接了解"采伐情况"如何:

  • 你从一个简单的"写入文件"或"写入屏幕"开始
  • 那么你还需要登录到另一台设备
  • 那么你想过滤掉严重性级别
  • 那么你想通过管道发送你的日志
  • 那么你想关闭日志记录

这一切变得非常非常困难,日志记录类开始污染您的代码.

所以,就像我说的:基于我有限的经验,我鼓励你研究一下建议的库.

祝好运.

编辑:Boost.Log示例

只是为了完整的帖子(详情请参阅页面).

琐碎案例:

#include <boost/log/trivial.hpp>
int main(int, char*[]) {
    BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
    BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
    BOOST_LOG_TRIVIAL(info) << "An informational severity message";
    BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
    BOOST_LOG_TRIVIAL(error) << "An error severity message";
    BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Max*_*kin 2

一种方法是在函数调用周围传递对记录器对象的引用。然而,日志记录是应用程序逻辑的一种正交方面,因此显式传递该记录器并将其作为成员很快就会变得很麻烦,并且只会增加人为的复杂性。

我更喜欢在应用程序中拥有一个全局记录器。模块可以创建自己的记录器作为主记录器的子记录器,形成层次结构(我认为这类似于 Python 日志记录模块),并在必要时独立控制其输出接收器和详细程度。