Une introduction à ces fonctionnalités fantastiques
Je suis un grand fan de Firebase et j’utilise beaucoup l’émulateur pour le développement local avec notre API de médias sociaux. L’émulateur offre de nombreuses fonctionnalités intéressantes, telles que la simulation de fonctions cloud, Firestore et même pub/sub. Si vous générez des journaux JSON sur la console à l’aide de console.log
la sortie est tolérable, surtout si vous la formatez avec JSON.stringify({...}, null, "\t")
. Cependant, les choses deviennent désordonnées lorsque vous utilisez Firebase conseillé enregistreur. L’enregistreur est le Enregistreur Google Cloudqui vous permet de structurer vos journaux et JSON afin qu’ils puissent être facilement consultés et recherchés dans le tableau de bord Google Cloud.
Alors que la sortie de l’enregistreur Firebase est superbe dans le tableau de bord Google Cloud, les choses ne sont pas si belles dans la sortie de notre terminal :
Que souhaiterions-nous idéalement avec les journaux de l’émulateur Firebase ?
- Formatage des objets JSON lors de l’utilisation du Logger.
- Sortie couleur afin que nous puissions mettre en évidence les erreurs.
- Supprimez les données superflues dont nous ne nous soucions peut-être pas, telles que « fonctions : vous exécutez l’émulateur Functions en mode débogage (
port=9229
). Cela signifie que les fonctions s’exécuteront en séquence plutôt qu’en parallèle.
Étant donné que Firebase ne fournit pas « encore » ces fonctionnalités, construisons les nôtres.
Nous allons enregistrer la sortie de l’émulateur Firebase dans un fichier, surveiller le fichier pour les modifications, traiter les modifications (format, etc.) et envoyer les données traitées à la console.
- Cloner le Référentiel Firebase-Emulator-Logging GitHub. Ceci est une application Node.js. Exécutez le typique
npm install
dans le répertoire cloné. - Démarrez l’émulateur Firebase comme vous le faites normalement et exportez-le dans un fichier. Pour des exemples:
npm run serve > save.txt
. - De retour dans le répertoire cloné, exécutez l’application Node avec
node index.js --file {file location}
. Par exemple:node index.js --file ./save.txt
- Profitez des nouveaux journaux !
Il existe quelques options lors de l’exécution de l’application Node. Vous avez déjà vu le —
fichier, mais vous pouvez également définir la sortie sur silencieux, ce qui signifie que la sortie système qui commence par « fonction » ou « hébergement » est supprimée, et vous pouvez désactiver le joli formatage.
Si vous voulez voir tout le code, rendez-vous sur GitHubou voici le index.js
dossier:
import readline from "readline";
import TailFile from "@logdna/tail-file";
import colorizer from "json-colorizer";const QUIET_STRING = ["functions", "hosting", "storage", "pubsub"];
const quiet = process.argv.indexOf("--quiet");
const prettyOff = process.argv.indexOf("--pretty-off");
const fileIndex = process.argv.indexOf("--file");
if (fileIndex <= -1 || !process.argv[fileIndex + 1]) {
console.error(
"You seem to be missing the --file argument. Please provide a file to tail."
);
process.exit(1);
}
const options = {
pretty: prettyOff <= -1 ? true : false,
colors: { STRING_LITERAL: "white" },
};
async function startTail() {
const tail = new TailFile(process.argv[fileIndex + 1]).on(
"tail_error",
(err) => {
console.error("TailFile had an error!", err);
}
);
try {
await tail.start();
const linesplitter = readline.createInterface({
input: tail,
});
linesplitter.on("line", (line) => {
if (
quiet &&
QUIET_STRING.some((str) =>
new RegExp(`(?<=^...)(.*)${str}`, "gm").test(line)
)
)
return;
let newLine = line;
if (newLine.startsWith(">") && newLine.endsWith("}")) {
const overrideOptions = { ...options };
try {
const json = JSON.parse(newLine.slice(3));
switch (json?.severity) {
case "INFO":
overrideOptions.colors.STRING_KEY = "blue";
overrideOptions.colors.BRACE = "blue";
break;
case "WARNING":
overrideOptions.colors.STRING_KEY = "yellow";
overrideOptions.colors.BRACE = "yellow";
break;
case "ERROR":
overrideOptions.colors.STRING_KEY = "red";
overrideOptions.colors.BRACE = "red";
break;
default:
break;
}
newLine = colorizer(newLine.slice(3), overrideOptions);
} catch (err) {
// ignore
}
}
console.log(newLine);
});
} catch (err) {
console.error("Cannot start. Does the file exist?", err);
}
}
startTail().catch((err) => {
process.nextTick(() => {
throw err;
});
});
Deux packages NPM externes sont utilisés : import TailFile from "@logdna/tail-file";
import colorizer from "json-colorizer";
Le fichier de fin est un package génial qui permet de « suivre » un fichier – chaque fois que quelque chose change, un événement se produit. Le coloriseur JSON est un package qui vous permet de spécifier quels éléments JSON obtiennent de la couleur.