C++ ACE C&x2B+;登录多个文件

C++ ACE C&x2B+;登录多个文件,c++,ace,C++,Ace,我正在浏览ACE,我正在使用ACE\u ERROR宏将消息记录到一个文件中。 另外,ACE_ERROR将所有消息记录在同一个文件中,而不管它们的错误级别如何 但是,我实际上需要根据错误级别编写消息。 我确实看到了ACE\u LOG\u MSG->open()函数,但我的理解是,当您已经调用该函数两次时,第二次调用时,它将关闭您在开始调用该函数时打开的文件 假设我有一个列表,我想记录它,在这个列表中,两个相邻的项没有相同的错误级别 然后我将打开和关闭文件,这不会影响我的应用程序性能吗 有没有办法让

我正在浏览ACE,我正在使用
ACE\u ERROR
宏将消息记录到一个文件中。 另外,
ACE_ERROR
将所有消息记录在同一个文件中,而不管它们的错误级别如何

但是,我实际上需要根据错误级别编写消息。 我确实看到了
ACE\u LOG\u MSG->open()
函数,但我的理解是,当您已经调用该函数两次时,第二次调用时,它将关闭您在开始调用该函数时打开的文件

假设我有一个列表,我想记录它,在这个列表中,两个相邻的项没有相同的错误级别

然后我将打开和关闭文件,这不会影响我的应用程序性能吗

有没有办法让这些文件保持打开状态?
谢谢

不关闭您登录的文件在调试中尤其糟糕。如果应用程序因打开的文件而崩溃,其内容可能(这种情况经常发生)会损坏,使您完全没有任何信息

但是,如果您正确地关闭文件,您肯定会在那里找到至少一些信息,可能更接近真实问题。如果您关心性能,您应该简单地降低日志级别,或者如果不可行,您可以通过(例如)TCP连接将日志卸载到另一个进程


无论如何,在测量之前不要进行优化!可能不会有任何影响,性能是一个复杂的问题,取决于很多因素。

另一个例子是使用简单的包装器类,根据日志优先级重新引导日志记录

希望这对某人有用

示例程序 样本输出
#include "ace/Log_Msg.h"
#include "ace/streams.h"

// @Author:  Gaurav A
// @Date:    2019OCT11
//
// Log each logging statement
// in file based on its priority
//
// eg: INFO logs goes to INFO.log
//     DEBUG logs goes to DEBUG.log

class Logger
{
  private:
    ACE_OSTREAM_TYPE* m_infolog=nullptr;
    ACE_OSTREAM_TYPE* m_debuglog=nullptr;
  public:
    Logger(void)
    : m_infolog (new std::ofstream ("INFO.log")),
      m_debuglog (new std::ofstream ("DEBUG.log"))
    {
    }
    ~Logger(void)
    {
      delete m_infolog;
      delete m_debuglog;
    }
    int log (ACE_Log_Priority p,
             const ACE_TCHAR* fmt,
             ...)
    {
      ssize_t final_result=0;

      if (p == LM_DEBUG)
      {
        va_list argp;
        va_start (argp, fmt);
        ACE_LOG_MSG->msg_ostream (m_debuglog);
        ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
        final_result = ACE_LOG_MSG->log (fmt, LM_DEBUG, argp);
        va_end (argp);
      }
      else if (p == LM_INFO)
      {
        va_list argp;
        va_start (argp, fmt);
        ACE_LOG_MSG->msg_ostream (m_infolog);
        ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
        final_result = ACE_LOG_MSG->log (fmt, LM_INFO, argp);
        va_end (argp);
      }

      return final_result;
    }
};

int
ACE_TMAIN (void)
{
  Logger logger;

  logger.log (LM_DEBUG, "I am a debug message no %d\n", 1);
  logger.log (LM_INFO,  "I am a info message no %d\n",  2);
  logger.log (LM_DEBUG, "I am a debug message no %d\n", 3);
  logger.log (LM_INFO,  "I am a info message no %d\n",  4);

  return 0;
}
[07:59:10]Host@User:~/acedir
$:  ./logging_each_priority_in_its_own_file
I am a debug message no 1
I am a info message no 2
I am a debug message no 3
I am a info message no 4
[07:59:10]Host@User:~/acedir
$:  ls -lrth
total 464K
-rw-r--r-- 1 aryaaur devusers  231 Oct 11 07:09 logging_each_priority_in_its_own_file.mpc
-rw-r--r-- 1 aryaaur devusers 5.6K Oct 11 07:29 GNUmakefile.logging_each_priority_in_its_own_file
-rw-r--r-- 1 aryaaur devusers 1.5K Oct 11 07:47 main_logging_each_priority_in_its_own_file_20191011.cpp
-rwxr-xr-x 1 aryaaur devusers  65K Oct 11 07:47 logging_each_priority_in_its_own_file
-rw-r--r-- 1 aryaaur devusers   50 Oct 11 07:59 INFO.log
-rw-r--r-- 1 aryaaur devusers   52 Oct 11 07:59 DEBUG.log
[07:59:10]Host@User:~/acedir
$:  cat INFO.log
I am a info message no 2
I am a info message no 4
[07:59:10]Host@User:~/acedir
$:  cat DEBUG.log
I am a debug message no 1
I am a debug message no 3
[07:59:10]Host@User:~/acedir
$: