Objectives

1. Add Logging with Winston

Install in each Express-based service:

1
npm install winston

Then configure a simple logger (src/utils/logger.js):

1
2
3
4
5
6
7
8
9
10
11
12
13
const { createLogger, format, transports } = require('winston');

const logger = createLogger({
  format: format.combine(
    format.timestamp(),
    format.printf(({ timestamp, level, message }) => {
      return `${timestamp} [${level.toUpperCase()}] ${message}`;
    })
  ),
  transports: [new transports.Console()]
});

module.exports = logger;

Use in your controllers or middlewares:

1
2
3
const logger = require('../utils/logger');
logger.info('Product retrieved');
logger.error('Something went wrong');

2. Add Health Check Endpoints

Add this in every service:

1
2
3
router.get('/health', (req, res) => {
  res.status(200).json({ status: 'UP' });
});

Monitor /health with tools like Prometheus, or just test via curl.

3. Setup Basic CI/CD with GitHub Actions

Create a file:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
name: Docker CI/CD

on:
  push:
    branches:
      - main

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Node
        uses: actions/setup-node@v4
        with:
          node-version: 18

      - name: Install dependencies
        run: npm install
        working-directory: ./user-service

      - name: Run tests
        run: npm test
        working-directory: ./user-service

  build-docker:
    runs-on: ubuntu-latest
    needs: build-and-test

    steps:
      - uses: actions/checkout@v3

      - name: Log in to Docker Hub
        run: echo "$" | docker login -u "$" --password-stdin

      - name: Build & Push Docker Image
        run: |
          docker build -t yourusername/user-service ./user-service
          docker push yourusername/user-service

4. Use Environment Variables for Logging Level

In .env:

LOG_LEVEL=info

In logger config:

1
level: process.env.LOG_LEVEL || 'info',