Skip to content

Les étapes de la démonstration

Pour la réalisation de cette démonstration, nous allons suivre les étapes suivantes :

  1. Créer une application Node.js qui va émettre des logs sur la sortie stdout et stderr,
  2. Créer un serveur pour recevoir nos logs et les afficher dans la console (on peut aussi les stocker dans une base de données),
  3. Créer un script node.js executable qui va wrapper notre application et la lancer en arrière-plan via la fonction spawn Node.js

Voici les différents fichiers de la démo :

js
import {setInterval} from 'node:timers'

let AUTO_INC = 0

setInterval(() => {
  if (AUTO_INC % 10) {
    console.log(`Hello World from ${AUTO_INC++}`)
  } else {
    console.error(`Error World from ${AUTO_INC++}`)
  }
}, 500)

console.log('Starting interval...')
js
import http from 'node:http'
import jsonBody from 'body/json.js'
import {promisify} from 'node:util'

const getBody = promisify(jsonBody)

// Create a local server to receive data from
const server = http.createServer()

// Listen to the request event
server.on('request', async (request, response) => {
  if (request.method === 'POST') {
    const body = await getBody(request, response, {})

    if (body.level) {
      console.log(`[${body.level.toUpperCase()}] -`, JSON.stringify({
        time: Date.now(),
        headers: request.headers,
        content: body
      }))
    }

    response.writeHead(201, {'content-type': 'application/json'})
    response.end(JSON.stringify({status: 'Created'}))
    return
  }

  response.writeHead(404, {'content-type': 'application/json'})
  response.end(JSON.stringify({status: 'Created'}))
})

server.listen(8000, () => {
  console.log('Server listening on port 8000')
})
js
#!/usr/bin/env node
import {spawn} from 'child_process'
import log from 'fancylog'
import {LogForwarder} from './utils/forwarder.js'

const [, , script, , url, ...args] = process.argv

const child = spawn('node', [script, args])

const logForwarder = new LogForwarder({
  url,
  pid: child.pid
})

child.stdout.on('data', data => {
  const content = data.toString().trim()

  if (content) {
    logForwarder.info(content)
  }
})

child.stderr.on('data', data => {
  const content = data.toString().trim()

  if (content) {
    logForwarder.error(content)
  }
})

child.on('exit', (code) => {
  if (code !== 0) {
    log.error(`Process exited with code ${code}`)
  }
})

Voir le code complet

Usage

sh
cd packages/spawn
yarn start:client:forward
yarn start:server

Note

Cette démonstration tente d'utiliser au maximum les API Node.js et ne nécessite pas de dépendances externes. Vous verrez que le code est assez simple et facile à comprendre, mais qu'il manque de fonctionnalités pour être utilisé en production.