ACE C++登录多个文件

ACE C++ Log in multiple files

本文关键字:文件 登录 C++ ACE      更新时间:2023-10-16

我正在遍历ACE,并使用ACE_ERROR宏将消息记录在一个文件中。AFAIK、ACE_ERROR将所有消息记录在同一文件中,而不管它们的错误级别如何。

然而,我实际上需要根据它们的错误级别来编写消息。然而,我确实看到了ACE_LOG_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 %dn", 1);
  logger.log (LM_INFO,  "I am a info message no %dn",  2);
  logger.log (LM_DEBUG, "I am a debug message no %dn", 3);
  logger.log (LM_INFO,  "I am a info message no %dn",  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
$: