我正在开发一个小型的C++11应用程序(一个SDL2游戏),我很难将我的一些面向对象的知识从C++11/Java“移植”到C++。例如,为了创建一种优雅的错误日志记录方法,我将创建一个具有各种适配器的类,并在那里集中日志记录。我已经在C++中这样做了,但是我不知道我的类应该如何使用Logger类。
在Java和PHP中,我会使用依赖注入,并将Logger作为类成员变量放入其中。但是在C++中,正确的方式是什么呢?我真的不认为静电会很好。
发布于 2013-10-04 03:05:39
哦天哪。
对我来说,日志记录类似于日期/时间处理:基本情况是微不足道的,但任何比微不足道更复杂的事情都是极其复杂的:没有中间地带。
我建议您研究一下通用的日志库,比如Pantheios或Boost.Log。
我之所以建议使用这种方法,而不是“自己努力”,是因为我直接知道“日志记录情况”是如何进行的:
这一切都变得非常非常困难,日志记录类开始污染你的代码。
因此,正如我所说的:基于我有限的经验,我鼓励您研究一下建议的库。
祝好运。
编辑: Boost.Log示例
只是为了文章的完整性(refer to page for details)。
琐碎的案例:
#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;
}发布于 2013-10-04 01:59:37
一种方法是在函数调用中传递对记录器对象的引用。但是,日志记录是应用程序逻辑的一种正交方面,因此显式传递日志记录器并将其作为成员很快就会变得令人讨厌,并且只会增加人为的复杂性。
我更喜欢在应用程序中有一个全局记录器。模块可以创建自己的记录器作为主记录器的子记录器,形成一个层次结构(我认为这类似于Python日志记录模块),并在必要时独立控制其输出接收器和详细程度。
发布于 2013-10-04 02:14:05
我总是使用这样的东西:
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;
};因此,通过这种方式,我可以这样记录:
Log() << "My message in the log with numbers " << 1 << 2 << 3 << " and so on...";
Log( "other.log" ) << "Log in another file eventually...";https://stackoverflow.com/questions/19165817
复制相似问题