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项目一样,遵循以下设计思想: 基于组件的 ...
随机推荐
- Oracle索引梳理系列(三)- Oracle索引种类之反向索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- SQL Server调优系列进阶篇(深入剖析统计信息)
前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQ ...
- C#显示SQL语句格式
--SQL SERVER生成测试环境: Create database Test; go USE [Test] GO if OBJECT_ID('Tab','U') is not null drop ...
- 一个PHP混淆后门的分析
洒家的朋友的公司的某个站发现最近被上传了一个后门程序.为了取证我们抓取了HTTP请求流量,看到了一堆莫名其妙看似经过混淆的请求,响应也是看似base64的乱码.洒家用了2个小时静态分析了一遍,并写了利 ...
- Fragment中添加ListView而不使用ListFragment
最初的构想是,将Fragment和ViewPager结合起来, 然后突发奇想,在第一个Fragment里添加了ListView, 依照网上的建议,extends了ListFragment,接着各种报错 ...
- redis参数优化
redis内存管理方式,支持tcmalloc,jemalloc,malloc三种内存分配,memcache使用slabs,malloc等内存分配方式. 简单点,就是redis,是边用边申请,使用现场申 ...
- 白话debounce和throttle
遇到的问题 在开发过程中会遇到频率很高的事件或者连续的事件,如果不进行性能的优化,就可能会出现页面卡顿的现象,比如: 鼠标事件:mousemove(拖曳)/mouseover(划过)/mouseWhe ...
- Equinox P2的学习
product.configuration 点击“Add按钮”并添加以下插件: org.eclipse.equinox.p2.ui org.eclipse.equinox.p2.ui.sdk org. ...
- ovirt-engine安装
一.安装 1.更新系统 原来是centos4.5 #yum update 升级后到6.7版本. [root@localhost ~]# cat /etc/redhat-release CentOS r ...
- [转]C#面试题
本文转自http://www.cnblogs.com/lhws/archive/2010/09/21/1827115.html 1.维护数据库的完整性.一致性.你喜欢用触发器还是自写业务逻辑?为什么? ...