2

我正在浏览 ACE,并且正在使用 ACE_ERROR宏将消息记录在文件中。并且 AFAIKACE_ERROR将所有消息记录在同一个文件中,无论它们的错误级别如何。

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

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

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

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

4

2 回答 2

2

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

但是,如果您正确关闭文件,则可以保证至少在那里找到一些信息,可能更接近真正的问题。如果您关心性能,您应该简单地降低日志级别,或者如果它不可行,您也许可以通过(例如)TCP 连接将日志记录卸载到其他进程。

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

于 2013-07-12T14:40:54.153 回答
0

另一个使用简单包装类根据日志记录优先级重新定向日志记录的示例。

希望这对某人有用。

示例程序

#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
$:
于 2019-10-11T07:06:00.053 回答