最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python和websocket構(gòu)建實(shí)時(shí)日志跟蹤器的步驟

 更新時(shí)間:2021年04月12日 14:16:17   作者:雞仔說  
這篇文章主要介紹了python和websocket構(gòu)建實(shí)時(shí)日志跟蹤器的步驟,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下

前言

websocket 是一種網(wǎng)絡(luò)傳輸協(xié)議。可在單個(gè) TCP 連接上進(jìn)行全雙工通信?;诖?,websocket 使得客戶端與服務(wù)端的通信變得更加簡便和高效。

什么是 websocket

websocket 是獨(dú)立的、創(chuàng)建在 TCP 上的協(xié)議。該協(xié)議在 2008 年誕生,并在 2011 年成為國際標(biāo)準(zhǔn)。它的一個(gè)主要特點(diǎn)是——全雙工,即一旦建立連接,服務(wù)端或客戶端可以主動(dòng)向?qū)Ψ酵扑拖ⅰ?/p>

在 websocket 出現(xiàn)之前,網(wǎng)站如果需要實(shí)現(xiàn)推送技術(shù),都是采用輪詢的方式,即瀏覽器每隔一段時(shí)間就向服務(wù)器發(fā)出請求。這種模式的缺點(diǎn)在于,瀏覽器需要不斷向服務(wù)器發(fā)送請求,消耗很多的帶寬資源。比較新的 Comet 技術(shù)雖然也可以實(shí)現(xiàn)雙向通信,但依然需要反復(fù)發(fā)送請求,并且 Comet 中普遍采用的 HTTP 長連接也會(huì)消耗服務(wù)器資源。

基于以上的情況,HTML5 定義了 websocket 協(xié)議,能夠更好的節(jié)省服務(wù)器和帶寬資源。并且實(shí)現(xiàn)高效的實(shí)時(shí)通信。目前,所有的瀏覽器都支持它。

websocket 通信原理和機(jī)制

websocket 雖然是一種新的協(xié)議,但它不能夠脫離 http 單獨(dú)存在,當(dāng)客戶端構(gòu)建一個(gè) websocket 實(shí)例,并且向服務(wù)端連接時(shí),會(huì)首先發(fā)起一個(gè) http 報(bào)文請求。告訴服務(wù)端需要將通信協(xié)議切換至 websocket。

如果服務(wù)端支持 websocket 協(xié)議,那么它會(huì)將通信協(xié)議切換至 websocket 并且返回響應(yīng)報(bào)文。此時(shí)的返回狀態(tài)碼是 101,表示同意協(xié)議轉(zhuǎn)換請求,接下來便可以進(jìn)行數(shù)據(jù)傳輸了。

websocket 之所以借助 HTTP 完成握手協(xié)議,是因?yàn)橛辛己玫募嫒菪裕J(rèn)端口是 80 和 443。握手階段不容易被防火墻屏蔽。

websocket 的特點(diǎn)

  • 開銷小,服務(wù)器和客戶端交換數(shù)據(jù)時(shí),協(xié)議包頭部包含較少的信息
  • 實(shí)時(shí)性高,協(xié)議采用全雙工,相對于 http 請求客戶端發(fā)起請求,服務(wù)端才能響應(yīng)的模式,延遲明顯更低
  • 與 HTTP 有良好的兼容性,默認(rèn)端口是 80 和 443。握手采用 HTTP 協(xié)議,不容易被防火墻屏蔽
  • 支持文本和二進(jìn)制數(shù)據(jù)傳輸
  • 支持自定義拓展,用戶可以自己實(shí)現(xiàn)自定義的子協(xié)議
  • 通過心跳機(jī)制保持服務(wù)端與客戶端的長連接

構(gòu)建實(shí)時(shí)日志跟蹤的小例子

服務(wù)端開啟一個(gè)監(jiān)聽日志腳本的服務(wù),服務(wù)會(huì)限制允許訪問的路徑范圍(防止黑客利用程序漏洞,掃描整個(gè)服務(wù)器);服務(wù)器通過解析客戶端的請求,返回日志的消息內(nèi)容給客戶端;服務(wù)器定時(shí)發(fā)送心跳檢測給客戶端,如果沒有收到客戶端的響應(yīng),則斷開連接

服務(wù)端核心程序代碼邏輯如下

with open(file_path) as f:
      # 首次讀取指定行數(shù)(NUM_LINES)的日志文件,發(fā)送給客戶端
            content = ''.join(deque(f, NUM_LINES))
            content = conv.convert(content, full=False)
            await websocket.send(content)
      
      # 如果發(fā)現(xiàn)客戶端有 tail 請求,則進(jìn)行 tail 日志追蹤
            if tail:
        # 首先創(chuàng)建發(fā)起這次請求的心跳時(shí)間
                last_heartbeat = time.time()
                while True:
          # 每次 tail 服務(wù)端最新的日志記錄,返回給客戶端
                    content = f.read()
                    if content:
                        content = conv.convert(content, full=False)
                        await websocket.send(content)
                    else:
                        await asyncio.sleep(1)

                    # 檢測這次請求距上一次發(fā)起請求,是不是已經(jīng)超過了最長心跳檢測時(shí)長,如果是,發(fā)起心跳檢測
                    if time.time() - last_heartbeat > HEARTBEAT_INTERVAL:
                        try:
                            await websocket.send('ping')
                            pong = await asyncio.wait_for(websocket.recv(), 5)
                            logger.info(f"pong:{pong}")
                            if pong != 'pong':
                                raise Exception()
                        except Exception:
                            raise Exception('Ping error')
                        else:
                            last_heartbeat = time.time()
            else:
                await websocket.close()

客戶端就非常簡單了,監(jiān)聽服務(wù)端日志的文件,發(fā)現(xiàn)有新的日志產(chǎn)生則輸出日志或者直接將日志實(shí)時(shí)展示在前端頁面上。相應(yīng)地,如果需要長期監(jiān)聽,那么當(dāng)服務(wù)端發(fā)送心跳檢測的信號過來,也需要回應(yīng)響應(yīng)的心跳反饋

客戶端核心代碼邏輯如下

async def consumer_handler(websocket: WebSocketClientProtocol) -> None:
    async for message in websocket:
        log_message(message)
        if message == "ping":
            await websocket.send("pong")

async def cousume(hostname: str, port: int, log_file: str, tail:bool=True) -> None:
    websocket_resource_url = f"ws://{hostname}:{port}{log_file}"
    if tail:
        websocket_resource_url = f"{websocket_resource_url}?tail=1"
    async with websockets.connect(websocket_resource_url) as websocket:
        await consumer_handler(websocket)

def log_message(message: str) -> None:
    logger.info(f"Message: {message}")

這里模擬一個(gè)日志生產(chǎn)文件

代碼邏輯如下

import os

from loguru import logger

class LoggerExtend(object):
    # 存放目錄名稱
    folder = '../logs'

    def __init__(self, filename, folder=None):

        self.folder = folder or self.folder

        if not os.path.exists(self.folder):
            os.mkdir(self.folder)

        self.file = self.folder + '/' + filename

        logger.add(self.file, rotation="100 MB")

    @property
    def get_logger(self):
        return logger

if __name__ == '__main__':
    logger = LoggerExtend(os.path.basename(__file__).replace(".py", ".log")).get_logger
    import time
    while True:

        logger.info("你好aaa")

最后依次啟動(dòng)日志生產(chǎn)程序→服務(wù)端程序→客戶端程序

日志生產(chǎn)文件啟動(dòng)后,運(yùn)行效果如下

服務(wù)端啟動(dòng)程序運(yùn)行,無運(yùn)行日志產(chǎn)生

這時(shí)候啟動(dòng)客戶端程序,運(yùn)行效果如下

完整代碼請移步至 GitHub 查看

https://github.com/hacksman/l...

日志生產(chǎn)程序路徑:

common/logger_extend.py

服務(wù)端程序路徑:

websoctet_lab/log_server.py

客戶端程序路徑:

websoctet_lab/cousumer_log_view.py

以上就是python和websocket構(gòu)建實(shí)時(shí)日志跟蹤器的步驟的詳細(xì)內(nèi)容,更多關(guān)于python 構(gòu)建實(shí)時(shí)日志跟蹤器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python如何將多個(gè)映射合并為一個(gè)映射

    python如何將多個(gè)映射合并為一個(gè)映射

    ChainMap類是Python中collections模塊的一部分,用于將多個(gè)字典合并為一個(gè)映射,而不會(huì)在物理上合并字典,這使得字典中相同的鍵可以共存,輸出結(jié)果取決于鍵的檢索順序,ChainMap通過維護(hù)一個(gè)底層映射的列表,重定義字典操作來實(shí)現(xiàn)這一功能
    2024-09-09
  • python中引用和賦值的區(qū)別及說明

    python中引用和賦值的區(qū)別及說明

    在Python中,引用和賦值操作有明顯區(qū)別,引用相當(dāng)于別的語言中的“指針”,多個(gè)引用指向同一個(gè)對象,修改對象會(huì)影響所有引用,而賦值則創(chuàng)建新的對象,原對象的修改不會(huì)影響新對象,引用適用于傳遞大型對象,節(jié)省內(nèi)存;賦值則適用于保證對象獨(dú)立性
    2024-09-09
  • django實(shí)現(xiàn)支付寶支付實(shí)例講解

    django實(shí)現(xiàn)支付寶支付實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于django支付寶支付的代碼實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2019-10-10
  • python隨機(jī)生成大小寫字母數(shù)字混合密碼(僅20行代碼)

    python隨機(jī)生成大小寫字母數(shù)字混合密碼(僅20行代碼)

    這篇文章主要介紹了python隨機(jī)生成大小寫字母數(shù)字混合密碼,主要是利用random模塊隨機(jī)生成數(shù)字,大小寫字母,通過循環(huán)次數(shù)來實(shí)現(xiàn)此功能,需要的朋友可以參考下
    2020-02-02
  • Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(2)

    Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(2)

    這篇文章主要為大家詳細(xì)介紹了Python中的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 基于Python編寫將文本轉(zhuǎn)換為語音的簡易應(yīng)用

    基于Python編寫將文本轉(zhuǎn)換為語音的簡易應(yīng)用

    這篇文章主要介紹了如何使用Python編寫一個(gè)簡單的應(yīng)用程序,將文本轉(zhuǎn)換為語音,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下
    2023-08-08
  • python查看FTP是否能連接成功的方法

    python查看FTP是否能連接成功的方法

    這篇文章主要介紹了python查看FTP是否能連接成功的方法,實(shí)例分析了Python連接FTP的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • pytorch 如何使用float64訓(xùn)練

    pytorch 如何使用float64訓(xùn)練

    這篇文章主要介紹了pytorch 使用float64訓(xùn)練的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 使用Python和wxPython實(shí)現(xiàn)下載視頻封面

    使用Python和wxPython實(shí)現(xiàn)下載視頻封面

    這篇文章主要為大家詳細(xì)介紹了如何使用Python和wxPython實(shí)現(xiàn)下載視頻封面,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • python中os.remove()用法及注意事項(xiàng)

    python中os.remove()用法及注意事項(xiàng)

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python中os.remove()用法及注意事項(xiàng),有需要的朋友們可以跟著學(xué)習(xí)下。
    2021-01-01

最新評論

宜兰市| 三门峡市| 荔波县| 宜章县| 曲周县| 阆中市| 平塘县| 阿拉善右旗| 来安县| 柯坪县| 许昌县| 涿鹿县| 大姚县| 上栗县| 达州市| 高淳县| 宝鸡市| 贞丰县| 抚松县| 青海省| 苏尼特左旗| 南木林县| 乡宁县| 满洲里市| 公主岭市| 齐齐哈尔市| 西林县| 嘉祥县| 丰镇市| 平阳县| 隆林| 东乌珠穆沁旗| 革吉县| 雅江县| 武功县| 青冈县| 基隆市| 西贡区| 叙永县| 栾川县| 临沂市|