ACE的日志输出之小见

ACE的日志输出之小见

1、格式化输出

ace里面只要是可以输出string的也就是c语言里面的那种char *字符串,就都可以像printf那样设置格式予以输出比如:

ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("MAIN!%i%t%s%p\n"), 100, "asdf", ACE_TEXT("SERVICE CONFIGURE OPEN!")),

里面%t%p由系统给定,不用我们自己来,否则出错,应该是段错误,而另外的%i%s就是要认为的输出了,这里有一个问题就是,后门如果出现ACE_TEXT()那么输出的问题就出现了;个人总结了一个结论就是自动寻找,即:每一个格式都要自动寻找后面的输出,如果在没有找到对应的格式输出之前碰到了ACE_TEXT这个东西就先输出它,还有就是它不是作为格式输出的,有几个格式比如%p遇到ACE_TEXT要后输出,具体是哪几个我也不清楚咯,跟printf有点不同:

printf("%s", "asdfasdf\n");而后面的字符串是格式输出,但是ACE_TEXT()不是格式输出的,还有一点跟printf不同的是,输出部分不在一个括号里面,而是在ACE_TEXT()的外面比如:

ACE_TEXT("MAIN!%i%t%s%p\n"), 100, "asdf"

我们来看看两个输出:

1ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("MAIN!%i%t%s%p\n"), 100, "asdf", ACE_TEXT("SERVICE CONFIGURE OPEN!")), 1

输出:MAIN!100682asdfSERVICE CONFIGURE OPEN!no error

2 ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("MAIN!%i,%t,%p,%s\n"), 100,

ACE_TEXT("SERVICE CONFIGURE OPEN!"), "asdf"),

1);

输出:MAIN!100,1792,SERVICE CONFIGURE OPEN!: No error,asdf

2、重定向

ace里面的日志一般都是已经设定了输出对象的,给定一段程序:

#include "ace/OS.h"

#include "ace/Log_Msg.h"

//#define ACE_NTRACE 0

//#include <iostream>

//#include <fstream>

#include "ace/streams.h"

using namespace std;

int ACE_TMAIN(int argc, ACE_TCHAR *argv[])

{

cout << "asdf\n";

printf("%s", "asdfasdf\n");

ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("MAIN!%i,%t,%p,%s\n"), 100,

ACE_TEXT("SERVICE CONFIGURE OPEN!"), "asdf"),

1);

return 0;

}

即便是把程序设定了重定向依旧得不到想要的结果,比如重定向到readme.txt

项目-》××属性-》配置属性-》调试-》命令参数

里面输入>readme.txt,即重写,>>readme.txt就是追加,运行程序你依旧看不到想要的结果:

readme.txt里面只有:÷

asdf

asdfasdf

没有我们要的MAIN!100,1792,SERVICE CONFIGURE OPEN!: No error,asdf,这个部分输出到了stderr了,因此我们就要用ace的重定向来让输出到文件:

#include "ace/OS.h"

#include "ace/Log_Msg.h"

//#define ACE_NTRACE 0

//#include <iostream>

//#include <fstream>

#include "ace/streams.h"

using namespace std;

void foo() {

//cout << "haha\n";

ACE_TRACE((ACE_TEXT("ADF")));

}

int ACE_TMAIN(int argc, ACE_TCHAR *argv[])

{

ACE_OSTREAM_TYPE *output = new ofstream("ReadMe.txt");

ACE_LOG_MSG->msg_ostream(output, 1);

ACE_LOG_MSG->set_flags(ACE_Log_Msg::OSTREAM);

ACE_LOG_MSG->clr_flags(ACE_Log_Msg::STDERR);

ACE_TCHAR *p = "asdfasdf\\";

cout << "haha\n";

cout << "haha\n";

cout << "haha\n";

//ACE_LOG_MSG->priority_mask(31,ACE_Log_Msg::PROCESS);

ACE_TRACE((ACE_TEXT("ADF")));

ACE_DEBUG((LM_DEBUG,"Hello, ACE! \n"));

//ACE_TRACE((ACE_TEXT("ADF%s\n"), p ));

ACE_ERROR((LM_INFO,ACE_TEXT("hi mom!%s,%d %d\n"), p, 100, LM_INFO));

foo();

ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("MAIN!%i,%t,%p,%s\n"), 100, ACE_TEXT("SERVICE CONFIGURE OPEN!"), "asdf"), 1);

//ACE_TRACE((ACE_TEXT("ADFdd")));

ACE_LOG_MSG->clr_flags(ACE_Log_Msg::OSTREAM);

delete output;

//ACE_OS::exit(1);

return 0;

}

以上个人见解而已!

你可能感兴趣的:(OS,D语言)