前言

写这篇博客是为了给我的愚蠢和浪费的6个小时买单!

过程原因分析

我用Mininet创建过不少拓扑了,这次创建的拓扑非常简单,如下图,创建拓扑的代码见github。在以前的拓扑创建过程中,我都是用标准模板去修改一些逻辑,主要包括创建的拓扑逻辑和建好拓扑之后的一些测试代码,这次由于代码比较简单,所以基本都是从头开始写的。

	                  1   3
|---------sw2--------|
| |2 |
1|2 | |1
h1------sw1 | sw4-------h2
|3 | 3| 2
| |3 |
|---------sw3--------|
1 2

很快写好了源码,直接运行,却发现在经过一小段时间时候直接跳入Mininet交互界面,我输入了nodes,也显示出了所有的交换机主机和控制器,输入links也显示链路正常,但是却不出现以前熟悉的adding hosts, adding switches等这些熟悉的提示信息,所以以为拓扑建的有问题,修改了一些无伤大雅的代码之后,发现还是同样的问题,所以拿出了之前的代码,比较,修改,运行,比较,修改,运行,但是却总是不打印信息,搞了好久,终于在最后注意到了平时的一句代码setLogLevel("info"),而我一直忽略他,所以就顺便了解下Mininet的log结构。

Mininet的log等级并没有什么难度,直接使用的python的logging模块,python的logging模块分六个等级:

  • notest
  • debug
  • info
  • warning
  • error
  • critical

这些级别其实对应的都是一个值,在上面的六个等级中,从上到下值依次递增,比如从0到50,在Mininet中,除了上面六个,新增加了一个值为25d的OUTPUT层,而且这层是Mininet的默认log层,即在创建拓扑的代码中要是没有用setLogLevel()函数来指定其他的日志等级,那么OUTPUT便是默认的等,OUTPUT介于info和warning之间,Mininet称之为CLI info,即他只允许用户看到Mininet对自己命令的相应,也就是我上面说的在Mininet CLI界面下输入nodes这些命令,他是有输出信息的,所以提醒大家在使用Mininet的时候注意他的日志系统。

刚刚有人咨询我Mininet建立拓扑的问题,对于熟悉Mininet的人来说,用Mininet模拟网络更多的工作是如何组织拓扑,如何利用list,dict或者其他文件处理数据来达到自己的目的,但对于初学者,简单的拓扑可能更便于学习,所以我将这个简单拓扑的源码附在下面:

#coding="utf-8"
from os import getuid from mininet.log import lg, info, setLogLevel
from mininet.cli import CLI
from mininet.net import Mininet
from mininet.topo import Topo
from mininet.link import Link, Intf
from mininet.node import Host, OVSKernelSwitch, Controller, RemoteController class LisaTopo( Topo ):
"Topology for LISA" def __init__( self ):
#super(LisaTopo, self).__init__()
Topo.__init__(self) # Set topology info
hosts = [1, 2]
switches = [1, 2, 3, 4]
links = [{(1, 2):(2, 1)}, {(1, 3):(3, 1)}, {(2, 3):(2, 3)}, {(2, 4):(3, 1)}, {(3, 4):(2, 3)}]
links_sw_host = [{(1, 1):(1, 1)}, {(2, 4):(1, 2)}] # Wire up switches
for link in links:
s1 = self.addSwitch("s%s" % link.keys()[0][0])
s2 = self.addSwitch("s%s" % link.keys()[0][1])
self.addLink(s1, s2 , link.values()[0][0], link.values()[0][1]) # Wire up hosts
for link in links_sw_host:
h1 = self.addHost("h%s" % link.keys()[0][0])
s2 = self.addSwitch("s%s" % link.keys()[0][1])
self.addLink(h1, s2 , link.values()[0][0], link.values()[0][1]) def LisaTopoTest():
topo = LisaTopo()
main_controller = lambda a:RemoteController(a, ip="localhost",port=6633)
net = Mininet( topo=topo, switch=OVSKernelSwitch, controller=main_controller) net.start() CLI( net )
net.stop() if __name__ == '__main__':
if getuid()!=0:
print "Please run this script as root / use sudo."
exit(-1)
setLogLevel("info") LisaTopoTest()

总结

Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统的更多相关文章

  1. iOS中忽略NSLog打印信息(通过PCH文件中定义DEBUG宏解决)

    iOS中忽略NSLog打印信息 解决办法: 1.新建PrefixHeader_pch文件,在该文件中定义一下宏 //通过DEBUG宏的定义来解决Debug状态下和Release状态下的输出 #ifde ...

  2. Maven3.2创建webapp项目过程中问题以及解决方案

    用maven组件来创建web项目,maven的好处一大堆,但是在创建项目的时候问题也很多,诸多不顺,网上找了很多资料,貌似都没能解决问题. 环境:jdk1.7.0_80,eclipse4.4,mave ...

  3. webpack 创建vue项目过程中遇到的问题和解决方法

    目录 1 webpack简介 2 webpack实现多个输入输出多个html 3  webpack 中的module下rules 下的use和loader选项 4 webpack 文件更新,如何使页面 ...

  4. vs2013在使用ef6时,创建模型向导过程中,四种模型方式缺少2种

    下载eftool,并安装 https://download.microsoft.com/download/2/C/F/2CF7AFAB-4068-4DAB-88C6-CEFD770FAECD/EFTo ...

  5. POWERSHELL 计划任务的创建,收集DC中失败的登录信息并邮件通知

    (注:本文参考以下前辈文章修改而来,源文章连接:http://itadmindev.blogspot.hk/2011/07/powershell-ad-dc-failed-logins-report. ...

  6. 统一处理jquery ajax请求过程中的异常错误信息的机制

    当jQuery ajax向服务器发送请求,服务器发生异常,比如:400.403.404.500等异常,服务器将异常响应给客户端,此时的ajax可以获取异常信息并进行处理,但此时我们一般是跳转到与异常编 ...

  7. allegro导入网表过程中出现的错误信息

    1. 找不到焊盘PAD,下面这句话的意思是器件封装找不到焊盘46.pad WARNING(SPMHNI-): Unable to load symbol ): Could not find padst ...

  8. 程序中使用log4J打印信息的两种方式

    (1)通过org.apache.commons.logging.Log 接口实例化: public static Log log = LogFactory.getLog(String name); p ...

  9. OpenStack虚拟机创建过程中镜像格式的的变化过程

    Glance用来作为独立的大规模镜像查找服务,当它与Nova和Swift配合使用时,就为OpenStack提供了虚拟机镜像的查找服务,像所有的OpenStack项目一样,遵循以下设计思想: 基于组件的 ...

随机推荐

  1. 漏洞科普:对于XSS和CSRF你究竟了解多少

    转自:http://www.freebuf.com/articles/web/39234.html 随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广 ...

  2. SpringMvc-Httl-shiro的整合

    来到新的公司一个月,以前实习公司的用的是srping+hibernate+struts2,而在这里不在用的这些了,而是用的springMVC和jdbc模板来操作数据了,所以又用了一段时间去慢慢融入这个 ...

  3. 利用div实现遮罩层效果

    利用div实现遮罩层效果就是利用一个全屏.半透明的div遮住页面上其它元素,典型的例子就是百度的登录界面.下面贴出示例代码: <!DOCTYPE html> <html> &l ...

  4. How to create and apply a patch with Git

    Creating a patch file with git is quite easy to do, you just need to see how it’s done a few times. ...

  5. WinMain与wWinMain,win32的字符集问题

    刚接触win32开发的会发现,用vs新建一个win32项目默认代码里面的入口函数并不是WinMain而是_tWinMain或者wWinMain,这些都有什么区别呢? WinMain对应的是多字节字符集 ...

  6. 简易的IOS位置定位服务

    有时一些小的需求,其实只是需要得知当前IOS APP使用的地点,有些只是想精确到城市级别,并不需要任何地图. 有了以下的简易实现: @interface MainViewController ()&l ...

  7. Navicat for MySQL连接MYSQL出错,错误代码1045的解决方法

    Navicat for MySQL连接MYSQL

  8. 【2016-10-12】【坚持学习】【Day3】【命令模式】

    今天学习了第二个模式,命令模式 例子: 开关==>发送者 电线==>命令传输 电灯==>接受者 一个开关可以通过不同电线控制不同电器, 结构: 发送者类, 抽象命令类 具体命令类:继 ...

  9. DPM检测模型 训练自己的数据集 读取接口修改

    (转载请注明作者和出处 楼燚(yì)航的blog :http://www.cnblogs.com/louyihang-loves-baiyan/ 未经允许请勿用于商业用途) 本文主要是针对上一篇基于D ...

  10. Appium学习实践(三)测试用例脚本以及测试报告输出

    之前Appium学习实践(二)Python简单脚本以及元素的属性设置中的脚本,会有一个问题,就是在每个测试用例完成之后都会执行tearDown,然后重新setUp,这样导致脚本的执行效率偏低,而且会有 ...