ACE就不多说的,先说日志。
屏幕输出
ACE的日志是否复杂,我也不知道,但可以从现在开始一步一步入门。ACE默认的输出方式是输出到屏幕。这就是一种方式。
ACE_LOG_MSG
->
set_flags
(
ACE_LOG_MSG
->
STDERR
);
ACE_DEBUG
((
LM_WARNING
,
ACE_TEXT
(
"TEST/n"
)));
也可以这样。
ACE_LOG_MSG
->
open
(
"TestLog"
,
ACE_Log_Msg
::
STDERR
);
ACE_DEBUG
((
LM_WARNING
,
ACE_TEXT
(
"TEST/n"
)));
其实第一句都还是不必要的,因为默认的方式就是使用屏幕打印。除非使用重定向,否则不需要特别说明。ACE的日志系统不是靠宏名本身,而是靠宏的第一个参数,即Severity Level来区分日志信息类型。
系统日志
在Windows事件察看器来看,存在应用程序日志,而通过ACE可以简单的把代码写到应用程序日志上去。
ACE_LOG_MSG->open("TestLog", ACE_Log_Msg::SYSLOG, ACE_TEXT ("ACE log"));
ACE_DEBUG
((
LM_TRACE
,
ACE_TEXT
(
"TEST3/n"
)));
这个地方很简单,查找最底层的代码调用了:: ReportEventA()。这个地方比较有意思。ACE根据LM设定的等级,翻译成SYSLOG的日志等级。
文件
ofstream
stream
(
"UVMG.log"
);
ACE_LOG_MSG
->
msg_ostream
(&
stream
,0);
ACE_LOG_MSG
->
set_flags
(
ACE_LOG_MSG
->
OSTREAM
|
ACE_LOG_MSG
->
STDERR
);
ACE_DEBUG
((
LM_TRACE
,
ACE_TEXT
(
"TEST3/n"
)));
ACE_ERROR
((
LM_ERROR
,
ACE_TEXT
(
"TEST1/n"
)));
考虑如上代码,上面的代码同时支持写文件和屏幕打印。需要注意的是
msg_ostream支持自动删除输出流,这个地方可以放心的new输出流。这个地方是需要注意的,因为ACE_LOG_MSG使用了Singleton,也就是说,同时只有一个输入输出流的存在,如果想写不同的文件,需要在流之间切换。
回调函数
C++回调函数的目的是为了让用户可以实现自己的函数实现,而被系统调用。NMS在错误日志的记录上使用了回调的技术。然而,什么东西都是两面的,如果不是很理解回调的话,最好还是不要轻易用回调。
考虑如下代码
class
MyCallback
:
public
ACE_Log_Msg_Callback
{
public
:
virtual
void
log
(
ACE_Log_Record
&
log_record
)
{
printf("Only Test/n");
}
};
ofstream
stream
(
"UVMG.log"
);
MyCallback
call
;
ACE_LOG_MSG
->
msg_ostream
(&
stream
,0);
ACE_LOG_MSG
->
msg_callback
(&
call
);
ACE_LOG_MSG
->
set_flags
(
ACE_LOG_MSG
->
OSTREAM
|
ACE_LOG_MSG
->
STDERR
|
ACE_LOG_MSG
->
MSG_CALLBACK
);
ACE_DEBUG
((
LM_TRACE
,
ACE_TEXT
(
"TEST3/n"
)));
ACE_ERROR
((
LM_ERROR
,
ACE_TEXT
(
"TEST1/n"
)));
从这一段的代码看出来,其实
log是让用户自己实现对log的定制。然后进行注册就可以了以后所有的调用会支持用户的实现。
// Enable the bits in the logger's options flags.
void set_flags (unsigned long f);
// Disable the bits in the logger's options flags.
void clr_flags (unsigned long f);
这个地方是支持用户或上标识的。可以支持各种日志方式。目前支持的方式有:
STDERR 屏幕打印
LOGGER 把日志写到Log的客户端
OSTREAM 把日志写到输出流
MSG_CALLBACK 把日志写到回调函数中
VERBOSE 准备好程序名称, timestamp, host name, process ID, and消息优先级
VERBOSE_LITE 准备好timestamp and message priority
SILENT Do not print messages at all
SYSLOG Write messages to the system's event log
CUSTOM Write messages to the user-provided back end
VERBOSE和VERBOSE_LITE极为好用,省了很多事情。关于Client/Server会在今后涉及。