转自:http://blog.sina.com.cn/s/blog_7ec2ab360102wx5z.html

一. 日志概述

日志是快速获得脚本和模型的调试信息、警告信息、错误信息或者其他信息的首选。

NS3日志模块提供了一个直观的、相对简单的方法来获取仿真过程中的有用信息。在NS3中,不同详尽级别的日志都是有用的,为了方便高效,NS3提供了可供选择的、多级别的方法来记录日志,例如可以完全禁用日志、仅对部分组件可用、或者全局可用。并且NS3将日志分成了七个详尽递增的级别:

NS_LOG_ERROR——Log error messages. 记录错误信息

NS_LOG_WARN——Log warning messgaes. 记录警告信息

NS_LOG_DEBUG——Log relatively rare, ad-hoc debugging messages. 记录相对不常见ad-hoc的调试信息

NS_LOG_INFO——Log informational messages about program progress. 记录程序进展信息

NS_LOG_FUNCTION——Log a message describing each function called. 记录描述每个调用函数信息

NS_LOG_LOGIC——Log messages describing logical flow within a function. 记录一个函数内描述逻辑流程的信息

NS_LOG_ALL——Log everything mentioned above. 记录所有信息

此外,还有一种一直被使用的无条件日志级别,与日志级别或者组件选择无关。

NS_LOG_UNCOND——Log theassociated message unconditionally. 无条件记录相关消息

每个级别可以被单独调用或者累计调用。日志的配置可以通过使用一个shell环境变量或者调用日志系统函数。

Logging Module的相关信息:

二.使用日志

$ ./waf --run scratch/first


上面的“sent”和“received”的消息来自于UdpEchoClientApplication和UdpEchoServerApplication的日志消息。

我们可以通过设置NS_LOG环境变量,使客户端应用程序输出更多的信息。

首先,假设你在使用一个类sh的shell。此类shell使用“VARIABLE=value”的语法格式。如果你使用的是类csh的shell,则必须将例句改成“setenv VARIABLE value”的语法格式。

scratch/myfirst.cc中UDPecho客户端应用在使用下面的代码行进行响应:

LogComponentEnable("UdpEchoClientApplication",LOG_LEVEL_INFO);     //设置日志级别为LOG_LEVEL_INFO,当传递一个日志标志时,实际上打开了该级别及其以下的所有级别。所以,这行代码表示打开了NS_LOG_INFO,NS_LOG_DEBUG,NS_LOG_WARN,NS_LOG_ERROR。

我们可以通过设置NS_LOG环境变量,在不改变脚本和重新编译的情况下来增加日志的级别:

$ export NS_LOG=UdpEchoClientApplication=level_all

设置shell环境变量NS_LOG为字符串:

UdpEchoClientApplication=level_all

等号左边:想要设置的日志组件名称

等号右边:要用的日志级别

改变环境变量后,可以通过

$ export -p

列出所有的shell赋予程序的环境变量,查看NS_LOG级别是否改变。


改变NS_LOG级别后的结果输出:


这些额外的调试信息是来自NS_LOG_FUNTION级别的日志。这些信息显示了在脚本运行期间程序中每个函数调用过程。

注意,NS3中模型对日志的支持并不是必须的。有关被记录信息的多少是由模型的开发者决定的。在本例中,有很多日志输出可以看到echo客户端程序中调用函数的日志。

如果仔细看,会注意到字符串UdpEchoClientApplication和方法名之间是单冒号,而不是预期的C++域操作符(::)(双冒号)。这里是有意这样做的。因为UdpEchoClientApplication不是类名,而是日志组件名。当一个类仅由一个源文件代表时,这个位置的显示通常是这个类的名字。因此,用单冒号代替双冒号,来提醒用户:这里是组件名,不是类名!

在某些情况下,很难确定某条日志消息是由哪个方法产生的。所以,为了得知日志消息的来源,可以通过在NS_LOG环境变量中的prefix|func级别来解决:

$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func'    //注意这里要用单引号!!


现在每条消息的来源都非常的明确。例如消息“At time 2.00737s client received 1024 bytes from 10.1.1.2 port 9”来自Udpecho客户端程序。

我们可以通过在NS_LOG环境变量中键入一个单冒隔开的组件列表来启用echo服务器的应用组件。
$ export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:UdpEchoServerApplication=level_all|prefix_func'

这样可以看到来自echo客户端和服务器的所有日志消息,这样方便调试。

可以通过prefix_time来知道仿真时间:

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


可以看到UdpEchoServer的构造函数在仿真的第0秒被调用。事实上这实在仿真开始之前就完成了,但时间显示的是0秒。UdpEchoClient的构造函数也是一样。

在scratch/first.cc脚本中,1秒时启动回显服务器应用。可以看到服务器的StartApplication实际上是在1秒时被调用。同样,客户端响应程序正如我们所预料的在仿真2秒时开始。

我们现在可以看到仿真的进度了,我们可以看到从ScheduleTransmit函数在客户端中调用send函数,到回显服务器中调用HandleRead函数的整个过程了。注意到通过点到点连接发送包消耗时间是3.69毫秒。查看回显服务器日志记录了一条消息告诉你已经响应了数据包。在另一个通道延迟后,可以看到响应客户端用它HandleRead方法收到响应包。

在仿真过程中发生了很多你所没有看到的事情。现在可以很容易的打开系统的日志组件,察看整个过程了。现在试着设置NS_LOG变量为:

$ export 'NS_LOG=*=level_all|prefix_func|prefix_time'     //*是日志组件通配符,这将打开仿真过程中使用的所有日志。

可以将这些信息重定向到一个文件,并且用自己喜欢的编辑器打开查看。

$ ./waf --run scratch/first>log.out 2>&1     //重定向到log.out文件中。 2>$1表示将一个标准错误输出重定向到标准输出。

当碰到一个问题或是不知道那里出错了,我们可以选择使用最详细的日志功能,这样可以很简单的跟踪程序,而无需设置断点并且在调试器中一步步运行代码,用喜欢的编辑器来打开查看日志,寻找问题所在。当对错误有了大致了解之后,我们使用调试器对问题有个非常详细的检查。当你的脚本做了完全非预期的事,这种输出将是非常有用的。如果你使用调试器单步运行,或许你会错过偏差的部分。日志使得这些偏差非常明显。

三.为自己的脚本添加日志功能

可以通过几个宏调用日志组件给仿真增加新的日志功能。

例如在first.cc中,我们已经定义了一个组件:

NS_LOG_COMPONENT_DEFINE("FirstScriptExample");

我们已经了解了通过设置NS_LOG环境变量来给组件启用日志功能。我们可以给脚本增加一些日志功能。用来增加信息级别的日志消息的宏是NS_LOG_INFO。

现在我们来增加一个日志消息,显示本脚本在“创建拓扑”:

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

NodeContainer nodes;

nodes,Create(2);

之前加上一行:

NS_LOG_INFO ("Creating Topology");    

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

$ ./waf

$ export NS_LOG=

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

$ export NS_LOG=FirstScriptExample=info

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

-----------------------------------完-------------------------------

NS3 Logging Module 日志模块相关推荐

  1. 日志模块 logging

    举例:# 1.办公室# 2.负责往控制台里面输出日志信息的# 3.往日志文件里面写日志的,按天生成日志,清理日志 import logging #导入日志模块 from logging import ...

  2. Python的日志模块logging的使用

    Python的日志模块logging的使用 1 logging模块介绍 2 logging 简单示例 3 logging.basicConfig() 4 logging组件 4.1 Logger类 4 ...

  3. python logging日志模块的使用

    1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG ,INFO, WARNING ,ERROR, CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预 ...

  4. 日志模块-logging模块

    日志模块 -logging(非常重要) 记录用户行为 程序运行过程 程序错误记录 logging.debug()通常调试时用到的日志信息 logging.info() #证明事情按照预期的那样工作 l ...

  5. python log模块_Python日志模块-logging

    一.logging模块 日志的作用可以简单总结为以下3点: 1.程序调试 2.了解软件程序运行情况,是否正常 3.软件程序运行故障分析与问题定位 1.日志的等级 不同的应用程序所定义的日志等级可能会有 ...

  6. 包,logging日志模块,copy深浅拷贝

    一 包 package 包就是一个包含了 __init__.py文件的文件夹 包是模块的一种表现形式,包即模块 首次导入包: 先创建一个执行文件的名称空间 1.创建包下面的__init__.py文件的 ...

  7. python中logging模块详解_python logging日志模块详解

    logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...

  8. Python:日志模块logging的应用

    2019独角兽企业重金招聘Python工程师标准>>> 在Python中,上面以实现的和已经实现的,均可以使用logging模块迅速搞定,且仅仅只需要一个配置文件,两行代码,实现过程 ...

  9. python 日志输出为json格式文件_Py修行路 python基础 (二十一)logging日志模块 json序列化 正则表达式(re)...

    一.日志模块 两种配置方式:1.config函数 2.logger #1.config函数 不能输出到屏幕 #2.logger对象 (获取别人的信息,需要两个数据流:文件流和屏幕流需要将数据从两个数据 ...

最新文章

  1. python中return和and连用
  2. Android仿支付宝UI功能开发,Android 自定义view仿支付宝咻一咻功能
  3. 使用Python和Numpy进行波士顿房价预测任务(一)【深度学习入门_学习笔记】
  4. C++解析char *p与char p[]
  5. 安卓内录声音软件scr_录屏内录大师软件下载
  6. MP3比特率编码模式
  7. SQL Server默认周日为每周第一天,如何让周一变为每周的第一天
  8. 一个low逼的boofuzz脚本生成器
  9. kubernetes故障现场一之Orphaned pod
  10. Unity 3D游戏编程自学#3——Unity 3D初步
  11. 荟研新材料 毕克BYK024 毕克BYK028 有机硅消泡剂 丙烯酸酯 聚氨酯 水性印刷油墨 罩光清漆 水性UV体系消泡剂
  12. PMOS管经典开关电路-PMOS开关典型电路工作原理及分析-KIA MOS管
  13. jquery 删除数组
  14. 自动驾驶入门(六):反向传播及链式法则
  15. matlab 电化学程序,基于MATLAB的电化学滴定曲线导数变换的实现
  16. J - 【黄色】这题真的是模板题 (Gym - 102072J )(spfa)
  17. Eclipse安装插件的方法
  18. vscode如何连接新设备_新设备进口报关公司如何选择
  19. 单总线解析与DS2401驱动程序设计
  20. 线上分享丨实战经验:解析Oracle中的redo与undo-云和恩墨大讲堂201907

热门文章

  1. iPhone 12相机遭遇质量问题/四款iPhone 12 5G手机售价曝光
  2. 微信拍一拍没反应怎么办?全方面解析微信拍一拍
  3. 云计算都在搞集中,红塔证券却在搞“拆分”,为什么?
  4. java微信自动回复机器人开发(java微信开发学习笔记3)
  5. (对ArrayList排序)编写以下方法,对一个数值的ArrayList进行排序
  6. 告别单调的主妇,这三件好物,让妈妈变身精致美厨娘丨Fancy辣妈系列
  7. word2016自带公式编辑器对公式编号的使用
  8. 微信版花呗来了测测额度!
  9. python中map函数的简单使用
  10. 那些年遇到的形形色色的项目经理们