ACE使用经验-利用ACE日志策略进行日志运行时配置管理
为什么要使用ACE日志策略?
因为使用ACE日志策略可以使我们以配置的方式对日志输出进行管理
更为重要的是,其利用配置参数可以控制日志输出中的各种问题, 如:可以配置当应用的日志文件到达指定尺寸是,它能够换用新的日志文件 也可也配置要保留的文件最大数目。 总之,用上ACE日志策略,很多麻烦的事情你都不用管了。
怎么使用ACE日志策略?
使用很简单,你只需建立一个配置文件,然后再你的代码总入口处写上几行就行了。
如建立下面配置文件svc.conf
dynamic Logger Service_Object * ACE:_make_ACE_Logging_Strategy()
"-s log.out -f STDERR|OSTREAM -p DEBUG|NOTICE"
上面配置文件说明了日志同时输出到文件(LOG.OUT)和STDERR中,且只输出日志级别为DEBUG或者NOTICE的信息。
下面列出一个很简单的示例文件main.cpp(例子来源于ACE自带的例子)
#include "ace/Log_Msg.h"
#include "ace/Service_Config.h"
int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
if (ACE_Service_Config::open (argc,
argv,
ACE_DEFAULT_LOGGER_KEY,
1,
0,
1) < 0)
ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\\n"),
ACE_TEXT ("Service Config open")),
1);
ACE_TRACE (ACE_TEXT ("main"));
ACE_DEBUG ((LM_NOTICE, ACE_TEXT ("%t%IHowdy Pardner\\n")));
ACE_DEBUG ((LM_INFO, ACE_TEXT ("%t%IGoodnight\\n")));
return 0;
}
编译并运行main.exe,则会发现日志信息同时出现在了文件和屏幕中
如你想让main.exe 使用另一个配置文件,则使用下面调用即可:
main.exe -f 你的配置文件名
ACE日志策略有那些有用的参数?
上面的配置文件我们已经使用了-s -f -p参数,下面列出一些常用参数的简单说明
-s 指定文件输出时的文件名
-f 指定输出的方向,如OSTREAM ,STDERR,LOGGER等
-p 指定输出或者禁止输出的级别,如INFO、~INFO
-m 指定日志文件的最大尺寸
-N 指定创建的日志文件的最大数目
-w 让日志文件在启动和重新配置时被清除
ACE日志策略其他
你是不是觉得这种配置文件的方式过时了呢?
是的,过时了,所以ACE4.3版后就提供了XML方式的配置文件,并且提供了自动转换以前的配置文件到XML配置文件的方式。但是,我们是为了应用目的,并非为XML而XML,够用即可。
ACE_Service_Config是一个高级的话题,有很多有趣的特性,以后有时间再说了 :) 作为服务端程序其实更关心控制大小和循环日志功能,以前一同事就出现过一个日志文件2G的情况。感觉这是日志策略最有用地方,使用也很方便,避免自己手动写或者再使用log4cpp这样额外的库 日志策略内部是使用reactor来进行事件处理的(主要是使用reactor的定时器来检测日志文件大小等)。所以这个例子是无法实现更换日志文件的功能的。必须在某处调用reactor的run_event_loop方法。 以下是引用ottono1在2006-11-8 23:00:00的发言:
动态的改变日志级别 有没有什么方法
在ACE Programmer's Guide, The Practical Design Patterns for Network and Systems Programming中说了一下子可以用signal做一些控制的东西, 如打开日志输出或关闭之类的。
7.4 NotificationsLet's go back and examine the rest of our LogSwitcher class, which turns logging on and off using signals. The handle_signal() method follows:
int
LogSwitcher::handle_signal (int signum, siginfo_t *, ucontext_t *)
{if (signum == this->on_sig_ || signum == this->off_sig_)
{
this->on_off_ = signum == this->on_sig_;
ACE_Reactor::instance ()->notify (this);
}
return 0;
}
很想使用日志策略,但是没看懂
如何自定义自己的日志策略呢?
页:
[1]