NS3为脚本运行创建日志LOG

来源:互联网 发布:梦泰软件教学 编辑:程序博客网 时间:2024/05/17 03:41
Ns3 提供一个可供选择的、多级别的方法来记录日志。日志可以完全被禁用,或仅对部分组件可用,或全局可用。并且 ns3 提供了不同详尽程度的日志级别供选。NS-3

日志模块提供了直观的、相对简单的使用方法来帮助用户获得仿真过程的所需信息。

NS3也提供了一个一般性的记录机制,tracing,来获得仿真结果之外的数据(详情参见本教程的 tracing 系统的使用章节)。日志应当作为快速获得你的脚本和模型的调试信息、警告信息、错误信息、或是其他信息的首要选择。
在现有的系统中,有 7 个详尽程度递增的日志级别(级别越高内容越详细),他们分别是:
LOG_ERROR--------------------------->记录错误信息
LOG_WARN—-------------------------->记录警告信息

LOG_DEBUG---------------------------->记录调试信息

LOG_INFO-------------------------------->记录程序进展信息

LOG_FUNCTION--------------------------->记录每个调用函数信息

LOG_LOGIC--------------------------->记录每一个函数内部描述逻辑流程信息

LOG_ALL--------------------------->记录所有信息

我们也提供了一种一直被使用的无条件日志级别,它是跟日志详尽级别或是组件选择无关的:

LOG_UNCOND-------------------------->无条件记录信息

每一个级别能够被单独地被调用或逐级递增的被调用(高级别包括低级别)。日志的配置可以使用一个 shell 环境变量(NS_LOG),或是使用日志系统函数进行如examples/tutorial目录下的firct.cc的 LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);

shell 环境变量(NS_LOG)

我们可以通过设置 NS_LOG 环境变量在不改变脚本或重新编译的情况下来增加日志级别,获得更多信息。

首先不对环境变量做任何要求运行脚本:

./waf --run scratch/myfirst

运行结果:

Waf: Entering directory `/home/yan/NS3/ns-allinone-3.25/ns-3.25/build'Waf: Leaving directory `/home/yan/NS3/ns-allinone-3.25/ns-3.25/build'Build commands will be stored in build/compile_commands.json'build' finished successfully (1.008s)At time 2s client sent 1024 bytes to 10.1.1.2 port 9At time 2.00369s server received 1024 bytes from 10.1.1.1 port 49153At time 2.00369s server sent 1024 bytes to 10.1.1.1 port 49153At time 2.00737s client received 1024 bytes from 10.1.1.2 port 9
默认的是脚本里设置好的

LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);

LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

设置日志为 LOG_LEVEL_INFO 级别。当我们传递一个日志级别标志时,我们实际上打开了这个日志级别和它之下的所有级别。本例中,我们打开了NS_LOG_INFO, NS_LOG_DEBUG, NS_LOG_WARN 和 NS_LOG_ERROR 级别。可以看到只是显示了基本收发信息,信息内容不够多。

在shell界面,我是UBUNTU系统,输入对环境变量NS_LOG的设置:

yan@ysw:~/NS3/ns-allinone-3.25/ns-3.25$ export NS_LOG=UdpEchoClientApplication=level_all
运行结果:

Waf: Entering directory `/home/yan/NS3/ns-allinone-3.25/ns-3.25/build'Waf: Leaving directory `/home/yan/NS3/ns-allinone-3.25/ns-3.25/build'Build commands will be stored in build/compile_commands.json'build' finished successfully (1.023s)UdpEchoClientApplication:UdpEchoClient(0x98f0d0)UdpEchoClientApplication:SetDataSize(0x98f0d0, 1024)UdpEchoClientApplication:StartApplication(0x98f0d0)UdpEchoClientApplication:ScheduleTransmit(0x98f0d0, +0.0ns)UdpEchoClientApplication:Send(0x98f0d0)At time 2s client sent 1024 bytes to 10.1.1.2 port 9At time 2.00369s server received 1024 bytes from 10.1.1.1 port 49153At time 2.00369s server sent 1024 bytes to 10.1.1.1 port 49153UdpEchoClientApplication:HandleRead(0x98f0d0, 0x98fb70)At time 2.00737s client received 1024 bytes from 10.1.1.2 port 9UdpEchoClientApplication:StopApplication(0x98f0d0)UdpEchoClientApplication:DoDispose(0x98f0d0)UdpEchoClientApplication:~UdpEchoClient(0x98f0d0)

相比前者,内容更加丰富,这些额外的调试信息是来自 NS_LOG_FUNTION 级别的日志。这些信息显示了在脚本运行期间程序中每个函数调用过程,UdpEchoClientApplication :方法名,这些方法名可以去build/ns3目录下的udp-echo-client.h查看

当想查看日志来自何处时,可由:

export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'
Waf: Entering directory `/home/yan/NS3/ns-allinone-3.25/ns-3.25/build'Waf: Leaving directory `/home/yan/NS3/ns-allinone-3.25/ns-3.25/build'Build commands will be stored in build/compile_commands.json'build' finished successfully (1.012s)UdpEchoClientApplication:UdpEchoClient(0x1db0180)UdpEchoClientApplication:SetDataSize(0x1db0180, 1024)UdpEchoClientApplication:StartApplication(0x1db0180)UdpEchoClientApplication:ScheduleTransmit(0x1db0180, +0.0ns)UdpEchoClientApplication:Send(0x1db0180)UdpEchoClientApplication:Send(): At time 2s client sent 1024 bytes to 10.1.1.2 port 9At time 2.00369s server received 1024 bytes from 10.1.1.1 port 49153At time 2.00369s server sent 1024 bytes to 10.1.1.1 port 49153UdpEchoClientApplication:HandleRead(0x1db0180, 0x1db0c20)UdpEchoClientApplication:HandleRead(): At time 2.00737s client received 1024 bytes from 10.1.1.2 port 9UdpEchoClientApplication:StopApplication(0x1db0180)UdpEchoClientApplication:DoDispose(0x1db0180)UdpEchoClientApplication:~UdpEchoClient(0x1db0180)

运行脚本你将看到每条日志都有产生此条日志的组件名做前缀了。

同理也可以通过

export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:UdpEchoServerApplication=level_all|prefix_func'

查看回显客户端和服务器的所有日志消息。
有时能够看到日志生成的仿真时间也是很有用的。可以通过使用prefix_time 位来实现。

export'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time:UdpEchoServerApplication=level_all|prefix_func|prefix_time'

现在试着设置 NS_LOG 变量为,
export 'NS_LOG=*=level_all|prefix_func|prefix_time'
上面的星号是日志组件通配符。将打开在仿真过程中使用的所有组件的日志功能。这里不列出结果了。可以将这些信息重定向到一个文件,并且用自己喜欢的编辑器打开查看。

./waf --run scratch/myfirst > log.out 2>&1.
日志系统函数

可以在脚本中使用宏NS_LOG_COMPONENT_DEFINE(name)定义一个日志模块。(注意,为了使用宏NS_LOG(name, level)来输出这个模块所定义的内容,这个定义语句必须写在每个脚本文件的开始。

1)在脚本里使用宏NS_LOG_COMPONENT_DEFINE(name)定义一个日志模块;

2)使用宏LogComponentEnable(name, level)启用日志(对应地,有宏LogComponentDisable(name, level)用于禁用日志);

example:

NS_LOG_COMPONENT_DEFINE("Example");LogComponentEnable("Example", LOG_LEVEL_INFO);   //等价于shell中:export NS_LOG = 'Example=info'
现在我们来增加一个日志消息,显示本脚本在“创建拓扑”:

打开scratch/first.cc文件并且在

NodeContainernodes;

nodes,Create(2);

之前加上一行:

NS_LOG_INFO ("CreatingTopology");    

用waf编译脚本并且清楚NS_LOG环境变量,来关掉之前启用的日志文件

$ ./waf

$ exportNS_LOG=

然后运行脚本,但是看不到新的日志消息,那是因为与它相关的日志组件(FirstScriptExample)没有被启用。为了看到该日志的消息,必须使用大于或等于NS_LOG_INFO的日志级别来启用FirstScriptExample日志组件。如果只是想要看某个级别的日志,你可以通过下面的语句来启用它,

$ exportNS_LOG=FirstScriptExample=info

再运行脚本,可以看到“Creating Topology”的日志消息。

NS3 <wbr>Logging <wbr>Module <wbr>日志模块

 

清除 NS_LOG 环境变量来关掉我们之前启用的日志文件:

export NS_LOG=


0 0