เรื่องมีอยู่ว่า logging เป็นระบบเดียวที่จะทำให้รู้ว่าแอปพลิเคชันยังสามารถทำงานได้ดีอยู่หรือไม่ โดยถ้าพูดถึง log แล้วไม่ว่าแอปพลิเคชันจะทำงานแบบออฟไลน์หรือออนไลน์ก็ควรจะต้องมีระบบ logging เพื่อให้รู้สิ่งต่างๆ ที่เกิดขึ้นในแอปพลิเคชัน โดยมีข้อมูลใน log ดังนี้

  • วัน เวลา
  • แหล่งที่มา
  • การเข้าใช้งาน
  • สถานะ
  • อื่นๆ

ยกตัวอย่าง logging express

โดย express ก็เป็นหนึ่งใน framework ของฝั่ง nodejs ที่เอาไว้ทำ api อาจจะหาอ่านเพิ่มเติมได้ และไลบารีสำหรับจัดการ log ก็มีเยอะมาก แต่จะขอยกตัวอย่างคือ morgan โดยสามารถใช้งานด้วยการ use ได้ง่ายๆ เลย

const express = require('express')
const morgan = require('morgan')
 
const app = express()
 
app.use(morgan('combined'))
 
app.get('/', function (req, res) {
  res.send('hello, world!')
})

รูปแบบการแสดงผลของ log จะแบ่งได้ดังนี้

combined

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

//example
::1 - - [03/Sep/2022:08:42:22 +0000] "GET / HTTP/1.1" 404 57 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"

common

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

//example
::1 - - [03/Sep/2022:08:45:09 +0000] "GET / HTTP/1.1" 404 57

dev

:method :url :status :response-time ms - :res[content-length]

//example
GET / 404 3.751 ms - 57

short

:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms

//example
::1 - GET / HTTP/1.1 404 57 - 3.851 ms

tiny

:method :url :status :res[content-length] - :response-time ms

//example
GET / 404 57 - 3.338 ms

เพียงเท่านี้เราก็สามารถจัดการ log ของระบบได้แล้ว แต่เดี่ยวก่อนระบบ log เป็นสิ่งเดียวที่พัฒนาอย่างเราต้องดูวันละหลายๆ ชั่วโมง ถ้าให้ดูที่มีสีเดียวไปตลอดคงไม่ดีกับดวงตาแน่นอนจึงจำเป็นเพิ่มอีก 3 ไลบารี คือ

  • chalk version 4.1.2 ทำสี สไตล์ของข้อความ
  • moment ตั้งค่าเวลาตาม timezone ต่างๆ
  • figlet สร้างข้อความแบบ ASCII

โดยใช้การ Custom ดังนี้

const express = require('express')
const morgan = require('morgan')
const chalk = require('chalk')
const moment = require('moment-timezone')
 
const app = express()
 
app.use(morgan(function (tokens, req, res) {
    return [
        chalk.hex('#3498DB').bold([`${moment(tokens.date(req, res)).tz('Asia/Bangkok').format('YYYY/MM/DD HH:mm:ss')}]`),
        chalk.hex('#E59866').bold(tokens['remote-addr'](req, res)),
        chalk.hex('#ff4757').bold('- -'),
        chalk.hex('#D4AC0D').bold(tokens.method(req, res)),
        chalk.hex('#3498DB').bold(tokens.url(req, res)),
        chalk.hex(tokens.status(req, res) === '200' ? '#16A085' : '#CB4335').bold(tokens.status(req, res)),
        tokens.res(req, res, 'content-length'),
        tokens['user-agent'](req, res),
        chalk.hex('#ff4757').bold('- -'),
        chalk.hex('#16A085').bold(tokens['response-time'](req, res)),
        chalk.hex('#16A085').bold('ms')
    ].join(' ')
}))
 
app.get('/', function (req, res) {
  res.send('hello, world!')
})

เพียงเท่านี้ log ของระบบก็น่าใช้งานขึ้นเลยครับ