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"
我们来看看两个输出:
1、ACE_ERROR_RETURN( (LM_ERROR, ACE_TEXT("MAIN!%i,%t,%s,%p/n"), 100, "asdf", ACE_TEXT("SERVICE CONFIGURE OPEN!")), 1)
输出:MAIN!100,682,asdf,SERVICE 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
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;
}
以上个人见解而已!