linux網絡log的抓取可使用命令tcpdump來抓取,命令詳細信息以下:linux
tcpdump網絡
options:socket
-a:嘗試將網絡和廣播地址轉換成名稱;tcp
-c<數據包數目>:收到指定的數據包數目後,就中止進行傾倒操做;函數
-d:把編譯過的數據包編碼轉換成可閱讀的格式,並傾倒到標準輸出;編碼
-dd:把編譯過的數據包編碼轉換成C語言的格式,並傾倒到標準輸出;spa
-ddd:把編譯過的數據包編碼轉換成十進制數字的格式,並傾倒到標準輸出;.net
-e:在每列傾倒資料上顯示鏈接層級的文件頭;接口
-f:用數字顯示網際網絡地址;內存
-F<表達文件>:指定內含表達方式的文件;
-i<網絡界面>:使用指定的網絡截面送出數據包;
-l:使用標準輸出列的緩衝區;
-n:不把主機的網絡地址轉換成名字;
-N:不列出域名;
-O:不將數據包編碼最佳化;
-p:不讓網絡界面進入混雜模式;
-q :快速輸出,僅列出少數的傳輸協議信息;
-r<數據包文件>:從指定的文件讀取數據包數據;
-s<數據包大小>:設置每一個數據包的大小;
-S:用絕對而非相對數值列出TCP關聯數;
-t:在每列傾倒資料上不顯示時間戳記;
-tt: 在每列傾倒資料上顯示未經格式化的時間戳記;
-T<數據包類型>:強制將表達方式所指定的數據包轉譯成設置的數據包類型;
-v:詳細顯示指令執行過程;
-vv:更詳細顯示指令執行過程;
-x:用十六進制字碼列出數據包資料;
-w<數據包文件>:把數據包數據寫入指定的文件。
tcpdump能夠在命令中輸入獲取,那若是後臺獲取網絡log並保存成文件呢,這裏有兩種方式。
第一種,也是利用tcpdump,將應用程序攜程deamon的形式,並使用system函數執行tcpdump -i eth0 -w filename。這種方式比較簡單,而且平臺兼容性比較強,由於咱們只是調用的平臺提供的接口而已。
第二種,直接抓取鏈路層的網絡數據,linux提供了原始套接字RAW_SOCKET,能夠獲取鏈路層的報文。這裏也有兩種方式獲取數據,第一種是經過socket的方式,打開指定的網卡,而後經過recv函數獲取數據。另一種是使用packet_mmp共享內存的方式獲取數據。讀取出來的數據保存成pcap的文件格式。這種方式平臺的兼容性較差。保存成pcap文件時linktype很重要,若是linktype錯誤,會致使報錯誤甚至打不開的狀況。有的時候就算linktype正確也會由於平臺的差別而致使讀取的數據但是不符而打開失敗。