在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

Node框架接入ELK的過程小結

Node框架接入ELK的過程小結

更新時間:2025-12-08 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于Node框架接入ELK的過程小結,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

我們都有過上機器查日志的經歷,當集群數量增多的時候,這種原始的操作帶來的低效率不僅給我們定位現網問題帶來極大的挑戰,同時,我們也無法對我們服務框架的各項指標進行有效的量化診斷,更無從談有針對性的優化和改進。這個時候,構建具備信息查找,服務診斷,數據分析等功能的實時日志監控系統尤為重要。

ELK (ELK Stack: ElasticSearch, LogStash, Kibana, Beats) 是一套成熟的日志解決方案,其開源及高性能在各大公司廣泛使用。而我們業務所使用的服務框架,如何接入 ELK 系統呢?

業務背景

我們的業務框架背景:

  • 業務框架是基于 NodeJs 的 WebServer

  • 服務使用 winston 日志模塊將日志本地化

  • 服務產生的日志存儲在各自機器的磁盤上

  • 服務部署在不同地域多臺機器

接入步驟

我們將整個框架接入 ELK 簡單歸納為下面幾個步驟:

  • 日志結構設計:由傳統的純文本日志改成結構化對象并輸出為 JSON.

  • 日志采集:在框架請求生命周期的一些關鍵節點輸出日志

  • ES 索引模版定義:建立 JSON 到 ES 實際存儲的映射

一、日志結構設計

傳統的,我們在做日志輸出的時候,是直接輸出日志的等級(level)和日志的內容字符串(message)。然而我們不僅關注什么時間,發生了什么,可能還需要關注類似的日志發生了多少次,日志的細節與上下文,以及關聯的日志。 因此我們不只是簡單地將我們的日志結構化一下為對象,還要提取出日志關鍵的字段。

1. 將日志抽象為事件

我們將每一條日志的發生都抽像為一個事件。事件包含:

事件元字段

事件發生時間:datetime, timestamp

事件等級:level, 例如: ERROR, INFO, WARNING, DEBUG

事件名稱: event, 例如:client-request

事件發生的相對時間(單位:納秒):reqLife, 此字段為事件相對請求開始發生的時間(間隔)

事件發生的位置: line,代碼位置; server, 服務器的位置

請求元字段

請求唯一ID: reqId, 此字段貫穿整個請求鏈路上發生的所有事件

請求用戶ID: reqUid, 此字段為用戶標識,可以跟蹤用戶的訪問或請求鏈路

數據字段

不同類型的事件,需要輸出的細節不盡相同,我們將這些細節(非元字段)統一放到d -- data,之中。使我們的事件結構更加清晰,同時,也能避免數據字段對元字段造成污染。

e.g. 如 client-init事件,該事件會在每次服務器接收到用戶請求時打印,我們將用戶的 ip, url等事件獨有的統一歸為數據字段放到 d 對象中

舉個完整的例子

{
    "datetime":"2018-11-07 21:38:09.271",
    "timestamp":1541597889271,
    "level":"INFO",
    "event":"client-init",
    "reqId":"rJtT5we6Q",
    "reqLife":5874,
    "reqUid": "999793fc03eda86",
    "d":{
        "url":"/",
        "ip":"9.9.9.9",
        "httpVersion":"1.1",
        "method":"GET",
        "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
        "headers":"*"
    },
    "browser":"{"name":"Chrome","version":"70.0.3538.77","major":"70"}",
    "engine":"{"version":"537.36","name":"WebKit"}",
    "os":"{"name":"Mac OS","version":"10.14.0"}",
    "content":"(Empty)",
    "line":"middlewares/foo.js:14",
    "server":"127.0.0.1"
}

一些字段,如:browser, os, engine為什么在外層 有時候我們希望日志盡量扁平(最大深度為2),以避免 ES 不必要的索引帶來的性能損耗。在實際輸出的時候,我們會將深度大于1的值輸出為字符串。而有時候一些對象字段是我們關注的,所以我們將這些特殊字段放在外層,以保證輸出深度不大于2的原則。

一般的,我們在打印輸出日志的時候,只須關注事件名稱數據字段即可。其他,我們可以在打印日志的方法中,通過訪問上下文統一獲取,計算,輸出。

2. 日志改造輸出

前面我們提到了如何定義一個日志事件, 那么,我們如何基于已有日志方案做升級,同時,兼容舊代碼的日志調用方式。

升級關鍵節點的日志

// 改造前
logger.info('client-init => ' + JSON.stringfiy({
    url,
    ip,
    browser,
    //...
}));

// 改造后
logger.info({
    event: 'client-init',
    url,
    ip,
    browser,
    //...
});

兼容舊的日志調用方式

logger.debug('checkLogin');

因為 winston 的 日志方法本身就支持 string 或者 object 的傳入方式, 所以對于舊的字符串傳入寫法,formatter 接收到的實際上是{ level: 'debug', message: 'checkLogin' }。formatter 是 winston 的日志輸出前調整日志格式的一道工序, 這一點使我們在日志輸出前有機會將這類調用方式輸出的日志,轉為一個純輸出事件 -- 我們稱它們為raw-log事件,而不需要修改調用方式。

改造日志輸出格式

前面提到 winston 輸出日志前,會經過我們預定義的formatter,因此除了兼容邏輯的處理外,我們可以將一些公共邏輯統一放在這里處理。而調用上,我們只關注字段本身即可。

  • 元字段提取及處理

  • 字段長度控制

  • 兼容邏輯處理

如何提取元字段,這里涉及上下文的創建與使用,這里簡單介紹一下 domain 的創建與使用。

//--- middlewares/http-context.js
const domain = require('domain');
const shortid = require('shortid');

module.exports = (req, res, next) => {
    const d = domain.create();
    d.id =  shortid.generate(); // reqId;
    d.req = req;
    
    //...

    res.on('finish', () => process.nextTick(() => {
        d.id = null;
        d.req = null;
        d.exit();
    });

    d.run(() => next());
}

//--- app.js
app.use(require('./middlewares/http-context.js'));

//--- formatter.js
if (process.domain) {
    reqId = process.domain.id;
}

這樣,我們就可以將 reqId 輸出到一次請求中所有的事件, 從而達到關聯事件的目的。

二、日志采集

現在,我們知道怎么輸出一個事件了,那么下一步,我們該考慮兩個問題:

  1. 我們要在哪里輸出事件?

  2. 事件要輸出什么細節?

換句話說,整個請求鏈路中,哪些節點是我們關注的,出現問題,可以通過哪個節點的信息快速定位到問題?除此之外,我們還可以通過哪些節點的數據做統計分析?

結合一般常見的請求鏈路(用戶請求,服務側接收請求,服務請求下游服務器/數據庫(*多次),數據聚合渲染,服務響應),如下方的流程圖

910448972-5bf4c8e5b4c98_articlex.png

那么,我們可以這樣定義我們的事件:

用戶請求

client-init: 打印于框架接收到請求(未解析), 包括:請求地址,請求頭,Http 版本和方法,用戶 IP 和 瀏覽器

client-request: 打印于框架接收到請求(已解析),包括:請求地址,請求頭,Cookie, 請求包體

client-response: 打印于框架返回請求,包括:請求地址,響應碼,響應頭,響應包體

下游依賴

http-start: 打印于請求下游起始:請求地址,請求包體,模塊別名(方便基于名字聚合而且域名)

http-success: 打印于請求返回 200:請求地址,請求包體,響應包體(code & msg & data),耗時

http-error: 打印于請求返回非 200,亦即連接服務器失敗:請求地址,請求包體,響應包體(code & message & stack),耗時。

http-timeout: 打印于請求連接超時:請求地址,請求包體,響應包體(code & msg & stack),耗時。

字段這么多,該怎么選擇? 一言以蔽之,事件輸出的字段原則就是:輸出你關注的,方便檢索的,方便后期聚合的字段。

一些建議

  1. 請求下游的請求體和返回體有固定格式, e.g. 輸入:{ action: 'getUserInfo', payload: {} } 輸出: { code: 0, msg: '', data: {}} 我們可以在事件輸出 action,code 等,以便后期通過 action 檢索某模塊具體某個接口的各項指標和聚合。

一些原則

  1. 保證輸出字段類型一致 由于所有事件都存儲在同一個 ES 索引, 因此,相同字段不管是相同事件還是不同事件,都應該保持一致,例如:code不應該既是數字,又是字符串,這樣可能會產生字段沖突,導致某些記錄(document)無法被沖突字段檢索到。

  2. ES 存儲類型為 keyword, 不應該超過 ES mapping 設定的 ignore_above 中指定的字節數(默認4096個字節)。否則同樣可能會產生無法被檢索的情況

三、ES 索引模版定義

這里引入 ES 的兩個概念,映射(Mapping)與模版(Template)。

首先,ES 基本的存儲類型大概枚舉下,有以下幾種

  • String: keyword & text

  • Numeric: long, integer, double

  • Date: date

  • Boolean: boolean

一般的,我們不需要顯示指定每個事件字段的在ES對應的存儲類型,ES 會自動根據字段第一次出現的document中的值來決定這個字段在這個索引中的存儲類型。但有時候,我們需要顯示指定某些字段的存儲類型,這個時候我們需要定義這個索引的 Mapping, 來告訴 ES 這此字段如何存儲以及如何索引。

e.g.

還記得事件元字段中有一個字段為 timestamp ?實際上,我們輸出的時候,timestamp 的值是一個數字,它表示跟距離 1970/01/01 00:00:00 的毫秒數,而我們期望它在ES的存儲類型為 date 類型方便后期的檢索和可視化, 那么我們創建索引的時候,指定我們的Mapping。

PUT my_logs
{
  "mappings": {
    "_doc": { 
      "properties": { 
        "title":    {
            "type": "date",
            "format": "epoch_millis"
         }, 
      }
    }
  }
}

但一般的,我們可能會按日期自動生成我們的日志索引,假定我們的索引名稱格式為 my_logs_yyyyMMdd (e.g. my_logs_20181030)。那么我們需要定義一個模板(Template),這個模板會在(匹配的)索引創建時自動應用預設好的 Mapping。

PUT _template/my_logs_template
{
  "index_patterns": "my_logs*",
  "mappings": {
    "_doc": { 
      "properties": { 
        "title":    {
            "type": "date",
            "format": "epoch_millis"
         }, 
      }
    }
  }
}
提示:將所有日期產生的日志都存在一張索引中,不僅帶來不必要的性能開銷,也不利于定期刪除比較久遠的日志。

小結

至此,日志改造及接入的準備工作都已經完成了,我們只須在機器上安裝 FileBeat -- 一個輕量級的文件日志Agent, 它負責將日志文件中的日志傳輸到 ELK。接下來,我們便可使用 Kibana 快速的檢索我們的日志。

以上就是Node框架接入ELK的過程小結的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 亚洲精品天堂成人片av在线播放 | 亚洲熟妇av一区二区三区| 在线无限看免费粉色视频| 欧美国产日韩在线播放| 国产成人av影视| 手机在线成人免费视频| 国产区二区三区| 久久黄色片网站| 国产又大又长又粗又黄| 熟妇熟女乱妇乱女网站| 欧美a级免费视频| koreanbj精品视频一区| 欧美一级片中文字幕| 成人精品视频一区二区| 污污视频网站在线| 大桥未久一区二区三区| 欧美乱做爰xxxⅹ久久久| 国产午夜大地久久| 欧美婷婷精品激情| 国产成年人在线观看| 久操手机在线视频| 任你操这里只有精品| 99九九99九九九99九他书对| 樱花草www在线| 国产精品网站免费| 91小视频在线播放| 玩弄中年熟妇正在播放| 亚洲a级黄色片| 国产成人无码a区在线观看视频| 自拍偷拍 国产| 成年人视频大全| 黄色三级视频在线| 久久国产午夜精品理论片最新版本| 国产成人久久婷婷精品流白浆| 日韩精品视频网址| 粗暴91大变态调教| 免费看日b视频| 亚洲xxxx2d动漫1| 蜜臀av无码一区二区三区| jizz欧美性11| 久久人妻精品白浆国产| 日韩人妻一区二区三区蜜桃视频| 久久综合久久色| 每日在线观看av| 4444在线观看| 三级黄色片免费观看| 亚洲成人福利在线观看| 欧美视频在线免费播放| 无码毛片aaa在线| 中文字幕国产高清| 亚洲视频第二页| 无码无遮挡又大又爽又黄的视频| 日本精品久久久久久久久久| 亚洲天堂av一区二区三区| 国产熟人av一二三区| 霍思燕三级露全乳照| 欧美日韩中文字幕在线播放| 亚洲精品视频三区| 欧美美女一级片| 九九热免费精品视频| 国产视频在线视频| av丝袜天堂网| 在线观看免费视频高清游戏推荐| 老司机午夜av| 91 在线视频观看| 久久久精品高清| 亚洲综合20p| 欧美国产在线一区| 91传媒免费视频| 成年人深夜视频| 午夜免费福利小电影| 国产真人做爰毛片视频直播| 青草青青在线视频| 国产视频九色蝌蚪| 欧美伦理片在线看| 亚洲精品mv在线观看| 咪咪色在线视频| 337p亚洲精品色噜噜狠狠p| 国产九色porny| 国产又黄又猛视频| 九九热精品国产| 国产日韩亚洲欧美在线| 亚洲熟妇av一区二区三区| 日韩中文字幕组| 欧洲在线免费视频| 人人妻人人做人人爽| 日韩在线第三页| 激情五月五月婷婷| 免费毛片小视频| 在线观看日本www| 日韩xxxx视频| 女人高潮一级片| 日本欧美黄色片| 五月婷婷激情久久| 免费拍拍拍网站| 欧美一级视频在线| 欧美黑人经典片免费观看| 天天干天天综合| 亚洲熟妇无码一区二区三区导航| 91日韩视频在线观看| www国产免费| 91精品999| 日本www高清视频| 久久久国产精华液999999 | 亚洲 欧美 日韩 国产综合 在线| 天天影视综合色| 三上悠亚久久精品| 91免费视频黄| 日本中文字幕精品—区二区| 欧美一级视频免费看| 亚洲在线观看网站| 我看黄色一级片| 女性隐私黄www网站视频| 天堂а√在线中文在线| 91亚洲精品久久久蜜桃借种| 97超碰青青草| 久操网在线观看| 国产a级片免费看| 污视频网址在线观看| 国产激情在线观看视频| 国产精品又粗又长| 精品人妻大屁股白浆无码| 久久久国产精华液999999| wwwwww.色| 青青草精品视频在线观看| 哪个网站能看毛片| 国产黄色一级网站| 日本在线观看a| 妓院一钑片免看黄大片| 精品久久久久久久免费人妻| 日韩网址在线观看| 日日摸天天爽天天爽视频| 国产精品欧美激情在线观看| 欧美黄色免费影院| 欧美aⅴ在线观看| 日韩中文字幕二区| 国产九九在线视频| 日韩av一卡二卡三卡| 亚欧美一区二区三区| 2021狠狠干| 久艹在线免费观看| a√天堂在线观看| 久久综合伊人77777麻豆最新章节| 成人3d动漫一区二区三区| 五月婷婷六月丁香激情| 超碰在线资源站| 日本阿v视频在线观看| 欧美精品一区免费| 中文字幕久久av| 久久福利一区二区| wwwxxx黄色片| 香蕉视频xxxx| 成年人看的毛片| 国产免费又粗又猛又爽| aaaaaaaa毛片| 国产青青在线视频| 国产成人在线综合| 分分操这里只有精品| 中文字幕在线观看第三页| 91成人在线视频观看| 国产亚洲欧美在线视频| 午夜视频在线网站| 欧美日韩性生活片| 一级黄色片在线免费观看| 国产资源在线视频| 艳母动漫在线观看| 亚洲激情在线观看视频| 日本精品福利视频| 美女网站色免费| 黄色网页免费在线观看| 亚洲精品乱码久久久久久动漫| 亚欧无线一线二线三线区别| 亚洲一区二区偷拍| 日韩一级理论片| 尤物av无码色av无码| 爽爽爽在线观看| 欧美伦理片在线看| 99热在线这里只有精品| 路边理发店露脸熟妇泻火| 国产精品v日韩精品v在线观看| 久久亚洲中文字幕无码| 麻豆一区二区三区在线观看| 波多野结衣xxxx| 成年人在线观看视频免费| 69堂免费视频| 久艹在线免费观看| 免费成人深夜夜行网站视频| 一起操在线视频| 久热精品在线观看视频| 日本xxxxxxx免费视频| 人妻精品无码一区二区三区| 阿v天堂2018| 福利在线一区二区| 亚洲综合av在线播放| 99视频在线免费| 91成人在线观看喷潮教学| 亚洲高清免费在线观看| 黑鬼大战白妞高潮喷白浆| 337p粉嫩大胆噜噜噜鲁| 国产九九九九九|