Mininet在建立拓扑的过程当中为何不打印信息了——了解Mininet的log系统

前言

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

过程缘由分析

我用Mininet建立过很多拓扑了,此次建立的拓扑很是简单,以下图,建立拓扑的代码见github。在之前的拓扑建立过程当中,我都是用标准模板去修改一些逻辑,主要包括建立的拓扑逻辑和建好拓扑以后的一些测试代码,此次因为代码比较简单,因此基本都是从头开始写的。python

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模块分六个等级:git

  • 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的时候注意他的日志系统。github

刚刚有人咨询我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()

总结

相关文章
相关标签/搜索