ACE C++登录多个文件
ACE C++ Log in multiple files
我正在遍历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
$:
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在 Tizen 中登录特定文件?
- 如何在 c++ 中将密码和用户名保存到 .txt 文件中.如果用户尝试登录,我仍然希望能够检索它们
- Win7 C++ - 从以用户身份登录的服务启动可执行文件的问题
- 如何使用 Apache C 模块登录到文件
- 使用二进制文件的用户名和登录系统
- 不会在登录名中读取C++我的文件
- 为什么这个基于文件的登录程序会挂起
- Curl-通过登录从间接URL下载文件
- 使用现有文件 c++ 登录
- 登录时启动Qt程序,需要设置"Start in"文件夹
- ACE C++登录多个文件
- 登录到文件后使用tell和seekp设置块大小是否合理?
- 通过文本文件登录/注册帐户
- 如何使用自定义Kurento OpenCV模块登录到文本文件