Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统
前言
写这篇博客是为了给我的愚蠢和浪费的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系统的更多相关文章
- iOS中忽略NSLog打印信息(通过PCH文件中定义DEBUG宏解决)
iOS中忽略NSLog打印信息 解决办法: 1.新建PrefixHeader_pch文件,在该文件中定义一下宏 //通过DEBUG宏的定义来解决Debug状态下和Release状态下的输出 #ifde ...
- Maven3.2创建webapp项目过程中问题以及解决方案
用maven组件来创建web项目,maven的好处一大堆,但是在创建项目的时候问题也很多,诸多不顺,网上找了很多资料,貌似都没能解决问题. 环境:jdk1.7.0_80,eclipse4.4,mave ...
- webpack 创建vue项目过程中遇到的问题和解决方法
目录 1 webpack简介 2 webpack实现多个输入输出多个html 3 webpack 中的module下rules 下的use和loader选项 4 webpack 文件更新,如何使页面 ...
- vs2013在使用ef6时,创建模型向导过程中,四种模型方式缺少2种
下载eftool,并安装 https://download.microsoft.com/download/2/C/F/2CF7AFAB-4068-4DAB-88C6-CEFD770FAECD/EFTo ...
- POWERSHELL 计划任务的创建,收集DC中失败的登录信息并邮件通知
(注:本文参考以下前辈文章修改而来,源文章连接:http://itadmindev.blogspot.hk/2011/07/powershell-ad-dc-failed-logins-report. ...
- 统一处理jquery ajax请求过程中的异常错误信息的机制
当jQuery ajax向服务器发送请求,服务器发生异常,比如:400.403.404.500等异常,服务器将异常响应给客户端,此时的ajax可以获取异常信息并进行处理,但此时我们一般是跳转到与异常编 ...
- allegro导入网表过程中出现的错误信息
1. 找不到焊盘PAD,下面这句话的意思是器件封装找不到焊盘46.pad WARNING(SPMHNI-): Unable to load symbol ): Could not find padst ...
- 程序中使用log4J打印信息的两种方式
(1)通过org.apache.commons.logging.Log 接口实例化: public static Log log = LogFactory.getLog(String name); p ...
- OpenStack虚拟机创建过程中镜像格式的的变化过程
Glance用来作为独立的大规模镜像查找服务,当它与Nova和Swift配合使用时,就为OpenStack提供了虚拟机镜像的查找服务,像所有的OpenStack项目一样,遵循以下设计思想: 基于组件的 ...
随机推荐
- CentOS 6.3下配置LVM(逻辑卷管理)
一.简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵 ...
- android canvas d
(以下转自:http://blog.csdn.net/longyi_java/article/details/6930480) 1.基本的绘制图片方法 //Bitmap:图片对象,left:偏移左边的 ...
- Android之drawable state各个属性详解
android:drawable 放一个drawable资源android:state_pressed 是否按下,如一个按钮触摸或者点击.android:state_focused 是否取得焦点,比如 ...
- 四、Android学习第四天——JAVA基础回顾(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...
- Linux 下从头再走 GTK+-3.0 (二)
仅仅创建一个空白窗口是不够的,下面我们为创建的窗口添加一个按钮. 以 Hello,World!为例. 首先创建一个源文件:example2.c 内容如下. #include <gtk/gtk.h ...
- 使用jlink直接烧norflash或者nandflash不借助uboot的猜想
由于喜欢折腾,我是在linux下使用jlink的,既然JLinkExe可以进行内存读写操作,loadbin等操作,并且通过指定命令文件支持批量指令输入,那么首先jlink是可以直接访问内部存储器的,包 ...
- PaintView 绘图控件解析
博客地址:博客园,版权所有,转载须联系作者. GitHub地址:JustWeTools 最近做了个绘图的控件,实现了一些有趣的功能. 先上效果图: PaintView画图工具: 1.可直接使用设定按钮 ...
- RCC BUCK变压器设计
RCC电路工作于临界模式,不是固定工作频率,其设计遵从BUCK原理.Buck电路在最高输入电压时为电感最恶劣工作条件: 以下图为例: 1.首先设定如下参数:输入电压Vin,输出电压Iout,工作频率f ...
- 怎样运用好ZBrush中的布尔运算
我们知道DynaMesh常用于基础模型的起稿到中模的制作,它是ZBrush ® 4R2新增的功能,其强大的功能除了对模型进行重新布线,还可以进行布尔运算.配合Insert笔刷进行布尔运算,可以做出Z ...
- Appium学习实践(二)Python简单脚本以及元素的属性设置
1.简单的Python脚本 Appium中的设置与Appium学习实践(一)简易运行Appium中的一致 Launch后,执行脚本 #coding:utf-8 import unittest impo ...