Les étapes de la démonstration
Pour la réalisation de cette démonstration, nous allons suivre les étapes suivantes :
- Créer une application Node.js qui va émettre des logs sur la sortie
stdout
etstderr
, - 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),
- 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.