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()

總結

相關文章
相關標籤/搜索