首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++11应用程序中记录错误的优雅方法?

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

Stack Overflow用户
提问于 2013-10-04 01:50:08
回答 4查看 4K关注 0票数 9

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

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

EN

回答 4

Stack Overflow用户

发布于 2013-10-04 03:05:39

哦天哪。

对我来说,日志记录类似于日期/时间处理:基本情况是微不足道的,但任何比微不足道更复杂的事情都是极其复杂的:没有中间地带。

我建议您研究一下通用的日志库,比如PantheiosBoost.Log

我之所以建议使用这种方法,而不是“自己努力”,是因为我直接知道“日志记录情况”是如何进行的:

  • 您可以从简单的"write to
  • “或"write to screen”开始然后还需要记录到另一个device
  • 然后您希望筛选出severity levels
  • 然后您希望通过管道发送日志
  • 然后您希望关闭日志记录

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

因此,正如我所说的:基于我有限的经验,我鼓励您研究一下建议的库。

祝好运。

编辑: Boost.Log示例

只是为了文章的完整性(refer to page for details)。

琐碎的案例:

代码语言:javascript
复制
#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;
}
票数 6
EN

Stack Overflow用户

发布于 2013-10-04 01:59:37

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-10-04 02:14:05

我总是使用这样的东西:

代码语言:javascript
复制
class Log
{
public:
    Log()
        : m_filename( "dafault.log" )
    {}

    // if you wanna give other names eventually...
    Log( const std::string & p_filename )
        : m_filename( p_filename )
    {}

    virtual ~Log()
    {
        // implement  your writeToFile() with std::ofstream 
        writeToFile( m_filename, m_stream, true );
    } 

    template< typename T >
    Log & operator<<( const T & p_value )
    {
        m_stream << p_value;
        return *this;
    }

private:
    std::string         m_filename;
    std::ostringstream  m_stream;
};

因此,通过这种方式,我可以这样记录:

代码语言:javascript
复制
Log() << "My message in the log with numbers " << 1 << 2 << 3 << " and so on...";

Log( "other.log" ) << "Log in another file eventually...";
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19165817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档