關鍵字:
iFlow、dumpcap、tshark、tcpflow、ngrep、BPF過濾器、JSON
⚠️ 注意事項
- 對於不能丟失端口數據包信息的ATIS監控需求,dumpcap是最佳選擇,其次是優化配置的tcpdump。這兩個工具都能在內核層面進行高效抓包,並提供完善的緩衝和輪轉機制來防止數據丟失。
- .\TotalMonitor\logs\totalMonitor.log日誌中記錄:"atisVersion":"H","updateTime":"2025-12-25 00:00:41"
2025-12-25 00:00:51.836 [Thread-16] INFO com.adcc.thread.DatisThread: Datis json: {"status":"UP","data":{"ip":"127.0.0.1","category":"SINGLE_CLI","atisVersion":"H","updateTime":"2025-12-25 00:00:41","expiredTime":"2025-12-25 01:05:41","broadcast":0,"voice":0,"aftngs":0,"db":0,"edit":0,"ws":0,"version":"3.9.1"}}
2025-12-25 00:00:51.839 [Thread-16] INFO com.adcc.thread.DatisThread: DatisThread to changeUI
🎯 TLDR
- dumpcap - 最推薦 ⭐⭐⭐⭐⭐
理由:
- 零數據丟失:作為Wireshark核心引擎,使用內核級抓包,性能最優
- 環形緩衝機制:-b filesize:100000 -b files:10 避免磁盤滿導致的數據丟失
- 精確端口過濾:-f "tcp port 80" 在內核層面就過濾,減少不必要的數據處理
- 支持多接口:-i any 確保抓取所有網絡接口的數據包
- tcpdump - 次推薦 ⭐⭐⭐⭐
理由:
- 成熟穩定:經過長期驗證,在各種環境下表現穩定
- 靈活的過濾語法:可以精確指定端口範圍
- 緩衝區控制:-B 參數可以調整緩衝區大小
- 輕量高效:資源佔用相對較少
- tshark - 中等推薦 ⭐⭐⭐
理由:
- 強大的解析能力:但解析過程可能增加處理延遲
- 實時輸出:-l 參數啓用行緩衝,但仍有丟失風險
- 資源佔用較高:協議解析消耗更多CPU和內存
- tcpflow - 不太推薦 ⭐⭐
理由:
- 流重組延遲:需要等待完整TCP流才能輸出,實時性差
- 內存佔用大:重組過程需要大量內存
- 可能丟失瞬時數據:流未完成時數據暫存內存
- ngrep - 最不推薦 ⭐
理由:
- 高層應用:工作在應用層,可能丟失底層包信息
- 模式匹配限制:只輸出匹配的行,可能遺漏重要上下文
- 緩衝機制簡單:沒有高級的緩衝和文件輪轉機制
1、原來的東東,tcpdump抓包獲取atisVersion
sudo python sendVer2Com1.py ttyS1
sendVer2Com1.py //輸出模版: ./data/atis.xml
# -*- coding:utf-8 -*-
import os
import struct
import subprocess
import sys
import binascii
import time
import serial
def unpack2ascii(_hex):
byte = binascii.a2b_hex(_hex)
version = struct.unpack("%ss" % str(len(byte)), byte)[0]
version = version.strip()[:]
return version
def searchVersion():
process = subprocess.Popen(["tcpdump", "-x"], stdout=subprocess.PIPE)
ver_before = ' '
while True:
next_line = process.stdout.readline().split(":")[-1].strip().replace(" ", "")
#print(next_line)
if next_line != '' and "6174697356657273696f6e22" in next_line: # 'Upd'ateTime=
#print("aaa")
version = unpack2ascii(next_line[:])
ver_alpha = version[14:15]
#print(ver_alpha)
if ver_before != ver_alpha :
ver_before = ver_alpha
print (atisxml + read_data.format(ver_alpha)) #output to serial
ser.write(atisxml + read_data.format(ver_alpha))
else:
time.sleep(0.01)
if __name__ == '__main__':
try:
comNo = sys.argv[1] #使用ttyS1
comNo = '/dev/' + str(comNo)
except:
print("Please input serial numner,such as ttyS1 !!!")
os._exit(1)
ser = serial.Serial(comNo, timeout=1)
with open('./data/atis.xml', 'r') as f:
read_data = f.read()
atisxml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n'
searchVersion()
2、新程序monitor_atis_version.py,從logs/totalMonitor.log日誌中獲取atisVersion字段的值
提示詞: 使用iFlow, glm-4.7模型
編寫python程序,實時動態讀取日誌@logs/totalMonitor.log ,從日誌中這個位置2025-12-25 00:00:51.836 [Thread-16] INFO
com.adcc.thread.DatisThread: Datis json:
{"status":"UP","data":{"ip":"127.0.0.1","category":"SINGLE_CLI","atisVersion":"H","updateTime":"2025-12-25
00:00:41","expiredTime":"2025-12-25
01:05:41","broadcast":0,"voice":0,"aftngs":0,"db":0,"edit":0,"ws":0,"version":"3.9.1"}}獲取"atisVersion":"H"信息,並將
atisVersion的值,例如這裏是H,賦值給變量ver_alpha返回,要求持續監控並動態輸出最新的atisVersion值
---
執行結果:
成功創建了Python程序來實時監控日誌文件並提取atisVersion信息。程序的主要功能如下:
程序功能
1. 實時監控日誌文件:監控.\TotalMonitor\logs\totalMonitor.log 文件
2. 解析日誌行:使用正則表達式匹配包含 "Datis json" 的日誌行
3. 提取JSON數據:從日誌行中提取JSON字符串並解析
4. 獲取atisVersion:從解析的JSON數據中提取 atisVersion 字段的值
5. 歷史日誌查詢:首先檢查歷史日誌中是否已有atisVersion信息
6. 實時監控:如果歷史日誌中沒有,則開始實時監控新日誌
使用方法
python monitor_atis_version.py
程序會返回 ver_alpha 變量,其中包含從日誌中提取的atisVersion值。程序會先檢查歷史日誌,如果沒有找到則會持續監控新的日誌條目,直到找到ati
sVersion信息或用户按Ctrl+C停止監控。