Day 25: ELK持续监控与Dockerize

今天来讲述CI/CD的最後一个流程,Monitor。将App部署上机器後,我们仍然必须持续监控他的状态、流量、使用情形甚至是出错的情境。大多的时候,程序会将这些使用情形写成log档,如果你对Ubuntu系统比较熟悉,你一定知道要常常查看/var/log/资料夹内的资料来帮助debug。

一旦系统变得过於大型,我们又该怎麽能方便的使用log档呢? ELK正是为了此需求而诞生,ELK由三项东西组成(其实应该说4项):

  • beats : 负责采集Log档
  • Logstash : 负责分析Log档(也可采集)
  • ElasticSearch : 保存Log档
  • Kibana : 视觉化呈现Log档

基本流程如下,Beats采集Log文件传送给Logstash,Logstash清理完成後交由Elastic保存起来,最後给予kibana呈现。
https://ithelp.ithome.com.tw/upload/images/20210927/20119044SEkUGyATNo.png

我之前写过关於ELK相关的安装与介绍,为了配合我们的主题:所有东西都要用container包住,今天会来讲解怎麽用docker-compose安装ELK。并且稍微讲一下Node.js的Log系统morgan做为范例。

Morgan

Morgan常用於Node.js的Log保存,官方文件,写起来也很方便,如下是morgan应用在express上,详细程序参考:

var express = require('express')
var router = express.Router();
var fs = require('fs')
var morgan = require('morgan')
const DBconnect = require("../DBconnect");
var app = express()

// create a write stream (in append mode)
var accessLogStream = fs.createWriteStream(path.join(__dirname,'logs', 'access.log'), { flags: 'a' })
 
// setup the logger (common模式)
app.use(morgan('common', { stream: accessLogStream }))

// Get Fail on Purpose
router.get("/Fail",function(req,res){
  res.status(404).send("Fail !!")
})

// Get Data
router.get('/company',function(req,res){
  const sql = "SELECT * FROM COMPANY";
  DBconnect.query(sql)
    .then(data=>{
      console.log(data)
      res.send(data)
    })
})

在morgan common模式下log会长的如下:

:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length]

输出如图:
https://ithelp.ithome.com.tw/upload/images/20210927/20119044tnDLaJphl1.png

建立ELK

接着我们来用Docker-compose建立ELK吧,这里使用docker-elk Github

  • git clone https://github.com/deviantony/docker-elk.git
  • cd docker-elk && docker-compose up

等等继续写


<<:  DAY27 MongoDB Time Series Collection

>>:  Day11:Disconnect Chat(关闭连线频道)

[Day 27]-【STM32系列】UART/USART RX 资料接收篇(下)

昨日[Day 26]-【STM32系列】UART/USART TX 资料传送篇(上)我们体验了UAR...

可视化编程游戏引擎

可视化编程游戏引擎 可视化编程是指可以把程序代码视觉化 不需要写程序代码就可以编写程序逻辑,降低了...

DAY 24 优化检视团购讯息

前面的检视团购讯息,检视团购讯息用文字不好检视 这边计画用matplotlib的pyplot将资讯输...

Day 17 | Flutter的常用 widgets - Container、Row、Column

StatefulWidget 的build 回到昨天 StatefulWidget 的 build ...

Day 04:程序语言

写 Android 会遇到的语言 Kotlin 用途: 这是写 Android 的主要语言,请务必熟...