WebSocket+Nginx實(shí)現(xiàn)動(dòng)態(tài)日志監(jiān)控-簡(jiǎn)單版

由于工作需要我們想要實(shí)現(xiàn)一個(gè)從頁(yè)面能夠查看tomcat后臺(tái)日志的功能洋侨,我們有兩種方案:

  1. 將日志保存到mongo DB中宪迟,從頁(yè)面進(jìn)行查看呀忧,mongo DB中的日志定期清理
  2. 通過(guò)WebSocket實(shí)現(xiàn)讀取后臺(tái)日志的功能蚜点,最簡(jiǎn)單的就是利用tail命令實(shí)現(xiàn)

下面主要說(shuō)一下我在通過(guò)WebSocket實(shí)現(xiàn)tail查看實(shí)時(shí)滾動(dòng)日志時(shí)遇到的問(wèn)題和解決方法

首先呢荆虱,我先在GitHub上找到了一個(gè)例子
文章的末尾有GitHub的地址,我down了下來(lái)纸颜, 需要注意三個(gè)地方

  1. pom中下面的dependency scope一定要設(shè)置成provided兽泣,避免與tomcat自帶的websocket-api沖突,我遇到問(wèn)題時(shí)查了很多帖子胁孙,有些說(shuō)沒(méi)有影響的唠倦,但是萬(wàn)一要有影響呢,包沖突還是最好避免掉
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.1</version>
            <scope>provided</scope>
        </dependency>
  1. index.html中的js腳本
<script>
    $(document).ready(function() {
        // 指定websocket路徑
        var websocket = new WebSocket('ws://192.168.80.128:8080/websocket/log');
        websocket.onmessage = function(event) {
            // 接收服務(wù)端的實(shí)時(shí)日志并添加到HTML頁(yè)面中
            $("#log-container div").append(event.data);
            // 滾動(dòng)條滾動(dòng)到最低部
            $("#log-container").scrollTop($("#log-container div").height() - $("#log-container").height());
        };
    });
</script>

其中
var websocket = new WebSocket('ws://192.168.80.128:8080/websocket/log');
這句的路徑一定要寫(xiě)對(duì)涮较,我從GitHub上拉下來(lái)的代碼稠鼻, 是這樣的
var websocket = new WebSocket('ws://192.168.80.128:8080/log');
看著沒(méi)什么區(qū)別,因?yàn)槟阌帽镜胤?wù)器啟動(dòng)時(shí)狂票,這個(gè)路徑取決于你再I(mǎi)DE中的設(shè)置

Image 4.png

Image 5.png

如果路徑是像我上面那樣寫(xiě)候齿,就要按照ws://ip:port/applicationContext/requestMapping格式去寫(xiě),否則就會(huì)報(bào)無(wú)法連接的錯(cuò)誤
如果你的application context是"/", 就按ws://ip:port/requestMapping格式寫(xiě)就OK

我就是在這就出現(xiàn)的問(wèn)題慌盯,因?yàn)槲沂窍胪ㄟ^(guò)tail命令去讀tomcat logs下的catalina.out周霉,所以我打好包,發(fā)到linux服務(wù)器進(jìn)行測(cè)試時(shí)润匙,報(bào)了404錯(cuò)誤诗眨,F(xiàn)irefox 無(wú)法建立到 ws://192.168.80.128:8080/log 服務(wù)器的連接唉匾。
因?yàn)槲掖虻陌莣ebsockettail-1.0.0.war

    <groupId>com.xxg</groupId>
    <artifactId>websockettail</artifactId>
    <version>1.0.0</version>

所以實(shí)際上默認(rèn)的Application Context路徑并不是"/"孕讳, 而是“websockettail-1.0.0”, 對(duì)應(yīng)的ws路徑應(yīng)為ws://192.168.80.128:8080/websockettail-1.0.0/log
改好之后就可以正常輸出了巍膘, 我測(cè)試的命令是"ifconfig"

Image 6.png

這里還是比較容易出錯(cuò)的厂财,一定要注意

  1. LogWebSocketController中的命令改成tail命令
    @OnOpen
    public void onOpen(Session session) {
        try {
            // 執(zhí)行tail -f命令
            process = Runtime.getRuntime().exec("tail -f /opt/XXX/logs/catalina.out -n 500");
            inputStream = process.getInputStream();

            // 一定要啟動(dòng)新的線程,防止InputStream阻塞處理WebSocket的線程
            TailLogThread thread = new TailLogThread(inputStream, session);
            thread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

這三個(gè)地方都改好后再放到Linux服務(wù)器上啟動(dòng)峡懈,就沒(méi)問(wèn)題了璃饱。

下面再說(shuō)一下使用Nginx對(duì)Websocket進(jìn)行反向代理的配置
公司的項(xiàng)目都是走的nginx反向代理,可以通過(guò)改nginx.conf來(lái)實(shí)現(xiàn)

修改Nginx主配置文件

$ vim /usr/local/nginx/conf/nginx.conf

# 在http上下文中增加如下配置肪康,確保Nginx能處理正常http請(qǐng)求荚恶。

http{
  map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
  }

  upstream websocket {
    #ip_hash;
    server localhost:8010;  
    server localhost:8011;
  }

# 以下配置是在server上下文中添加,location指用于websocket連接的path磷支。

  server {
    listen       80;
    server_name localhost;
    access_log /var/log/nginx/yourdomain.log;

    location / {
      proxy_pass http://websocket;
      proxy_read_timeout 300s;

      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
        }
    }
}

最重要的就是在反向代理的配置中增加了如下兩行谒撼,其它的部分和普通的HTTP反向代理沒(méi)有任何差別。

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

這里面的關(guān)鍵部分在于HTTP的請(qǐng)求中多了如下頭部:

Upgrade: websocket
Connection: Upgrade

這兩個(gè)字段表示請(qǐng)求服務(wù)器升級(jí)協(xié)議為WebSocket雾狈。服務(wù)器處理完請(qǐng)求后廓潜,響應(yīng)如下報(bào)文:

狀態(tài)碼為101

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade

配置改好后執(zhí)行
nginx -s reload
就可以正常訪問(wèn)


Image 7.png

參考博客地址:
http://xxgblog.com/2015/11/25/java-websocket-tail/
https://www.hi-linux.com/posts/42176.html

以上代碼可以從github上獲取, 我修改了一些東西善榛,致敬原創(chuàng)者
https://github.com/CarolineHuang5954/websocket-tail-demo.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辩蛋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子移盆,更是在濱河造成了極大的恐慌悼院,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咒循,死亡現(xiàn)場(chǎng)離奇詭異樱蛤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剑鞍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)昨凡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚁署,你說(shuō)我怎么就攤上這事便脊。” “怎么了光戈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵哪痰,是天一觀的道長(zhǎng)遂赠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晌杰,這世上最難降的妖魔是什么跷睦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮肋演,結(jié)果婚禮上抑诸,老公的妹妹穿的比我還像新娘。我一直安慰自己爹殊,他們只是感情好蜕乡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著梗夸,像睡著了一般层玲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上反症,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天辛块,我揣著相機(jī)與錄音,去河邊找鬼铅碍。 笑死润绵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的该酗。 我是一名探鬼主播授药,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呜魄!你這毒婦竟也來(lái)了悔叽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤爵嗅,失蹤者是張志新(化名)和其女友劉穎娇澎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體睹晒,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趟庄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伪很。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戚啥。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锉试,靈堂內(nèi)的尸體忽然破棺而出猫十,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布拖云,位于F島的核電站贷笛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宙项。R本人自食惡果不足惜乏苦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尤筐。 院中可真熱鬧汇荐,春花似錦、人聲如沸叔磷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)改基。三九已至,卻和暖如春咖为,著一層夾襖步出監(jiān)牢的瞬間秕狰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工躁染, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸣哀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓吞彤,卻偏偏與公主長(zhǎng)得像我衬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饰恕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348