C++ 如何在我的程序中创建日志系统?

C++ 如何在我的程序中创建日志系统?,c++,logging,project-management,C++,Logging,Project Management,当我正在写程序时,突然出现了一个疯狂的想法:在我的程序中创建日志系统的最佳方法是什么?我的意思是如何在代码的任何地方保存日志(当然不包括头文件)?差不多 myLogs << "Ups, somthing failed :("; myLogs创建一个类,重载operator创建一个类,重载operator不确定我是否完全理解这个问题,但我所做的是使用WM_SETTEXT消息(然后是另一个自定义消息来提交数据)将日志数据发送到另一个应用程序-您还需要编写一个基本的侦听器应用程序,该应用

当我正在写程序时,突然出现了一个疯狂的想法:在我的程序中创建日志系统的最佳方法是什么?我的意思是如何在代码的任何地方保存日志(当然不包括头文件)?差不多

myLogs << "Ups, somthing failed :(";

myLogs创建一个类,重载
operator创建一个类,重载
operator不确定我是否完全理解这个问题,但我所做的是使用WM_SETTEXT消息(然后是另一个自定义消息来提交数据)将日志数据发送到另一个应用程序-您还需要编写一个基本的侦听器应用程序,该应用程序将读取和存储数据,最好是在类似列表框的控件中。这是非常快的,因为它不涉及文件系统、管道、套接字等。您也可以在头文件中使用条件编译(由#define/#ifdef指令控制)来打开或关闭日志记录。

不确定我是否完全理解这个问题,但我所做的是将日志数据发送到另一个应用程序,使用WM_SETTEXT消息(然后是另一个自定义消息来提交数据)——您还需要编写一个基本的侦听器应用程序,该应用程序将读取和存储数据,最好是在一个类似列表框的控件中。这非常快,因为它不涉及文件系统、管道、套接字等。您还可以在头文件中使用条件编译(由#define/#ifdef指令控制)来打开或关闭日志记录。

没有一个简单的答案;这取决于应用程序。我已经 曾参与过一些非常大的项目,您可以在其中配置日志记录 对于不同的子系统有不同的要求;这样一个系统在未来将是杀伤力过大的 较小的应用程序。如果应用程序 必须长时间不睡觉;在这种情况下,您将需要 在不停止日志的情况下重新配置日志的一些规定 应用程序

不过,一般来说,您需要一个日志配置文件, 指定不同级别的日志记录,以及如何处理日志 信息。您还需要确保执行最少的操作 当没有日志记录时。我使用的一个解决方案是维护各种 每个可用操作(写入文件、发送电子邮件、, 或发送到syslog)。然后,我将有一个由 日志级别;如果该级别有任何日志记录,我将创建一个 streambuf,转发所有必要的操作streambuf,以及 将使用它的ostream的地址放入表中。这些特别的 streambuf还具有启动和停止每个日志记录的功能: 将使用文件名和行号调用开始记录的文件, 停止记录的那个将刷新每个受管流。 如果给定级别上没有日志记录,则ostream指针为null

基本记录器是:

class Logger
{
    std::ostream* myDest;
    int* myUseCount;
public:
    Logger( int level, char const* filename, int lineNumber )
        : myDest( ourLogTable[level] )
        , myUseCount( new int( 1 ) )
    {
        if ( myDest != NULL ) {
            myDest->rdbuf()->startLogRecord( filename, lineNumber );
        }
    }

    Logger( Logger const& other )
        : myDest( other.myDest )
        , myUseCount( other.myUseCount )
    {
        ++ *myUseCount;
    }

    ~Logger()
    {
        -- *myUseCount;
        if ( *myUseCount == 0 && myDest != NULL ) {
            myDest->flush();
        }
    }

    template <typename T>
    Logger& operator<<( T const& obj )
    {
        if ( myDest != NULL ) {
            *myDest << obj;
        }
    }
};
如果要自动插入,则必须使用宏
文件名和行号。

没有一个简单的答案;这取决于应用程序。我已经 曾参与过一些非常大的项目,您可以在其中配置日志记录 对于不同的子系统有不同的要求;这样一个系统在未来将是杀伤力过大的 较小的应用程序。如果应用程序 必须长时间不睡觉;在这种情况下,您将需要 在不停止日志的情况下重新配置日志的一些规定 应用程序

不过,一般来说,您需要一个日志配置文件, 指定不同级别的日志记录,以及如何处理日志 信息。您还需要确保执行最少的操作 当没有日志记录时。我使用的一个解决方案是维护各种 每个可用操作(写入文件、发送电子邮件、, 或发送到syslog)。然后,我将有一个由 日志级别;如果该级别有任何日志记录,我将创建一个 streambuf,转发所有必要的操作streambuf,以及 将使用它的ostream的地址放入表中。这些特别的 streambuf还具有启动和停止每个日志记录的功能: 将使用文件名和行号调用开始记录的文件, 停止记录的那个将刷新每个受管流。 如果给定级别上没有日志记录,则ostream指针为null

基本记录器是:

class Logger
{
    std::ostream* myDest;
    int* myUseCount;
public:
    Logger( int level, char const* filename, int lineNumber )
        : myDest( ourLogTable[level] )
        , myUseCount( new int( 1 ) )
    {
        if ( myDest != NULL ) {
            myDest->rdbuf()->startLogRecord( filename, lineNumber );
        }
    }

    Logger( Logger const& other )
        : myDest( other.myDest )
        , myUseCount( other.myUseCount )
    {
        ++ *myUseCount;
    }

    ~Logger()
    {
        -- *myUseCount;
        if ( *myUseCount == 0 && myDest != NULL ) {
            myDest->flush();
        }
    }

    template <typename T>
    Logger& operator<<( T const& obj )
    {
        if ( myDest != NULL ) {
            *myDest << obj;
        }
    }
};
如果要自动插入,则必须使用宏 文件名和行号。

MyLogger
MyLogger相关的问题相关的问题
#define LOG(level) Logger( level, __FILE__, __LINE__ )