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