Приведите в порядок и уберите шум

Я большой поклонник Firebase и широко использую эмулятор для локальной разработки с нашим API для социальных сетей.

В эмуляторе есть много замечательных функций, таких как имитация облачных функций, Firestore и даже pub/sub. Если вы выводите журналы JSON на консоль с помощью console.log, вывод будет приемлемым, особенно если вы отформатируете его с помощью JSON.stringify({...}, null, "\t").

Однако все становится запутанным, когда вы используете рекомендуемый логгер Firebase. Logger — это Google Cloud Logger, который позволяет вам структурировать ваши журналы и JSON, чтобы их можно было легко просматривать и искать в Google Cloud Dashboard.

В то время как выходные данные регистратора Firebase отлично выглядят в Google Cloud Dashboard, в выходных данных нашего терминала все выглядит не так хорошо:

Улучшение журналов эмулятора Firebase

Что нам в идеале нужно от журналов эмулятора Firebase?

  • Форматирование объектов JSON при использовании Logger.
  • Цветной вывод, чтобы мы могли выделить ошибки.
  • Удалите посторонние данные, которые нам могут быть безразличны, такие как «функции: вы запускаете эмулятор функций в режиме отладки (port=9229). Это означает, что функции будут выполняться последовательно, а не параллельно».

Поскольку Firebase «пока» не предоставляет эти возможности, давайте создадим свои собственные.

Мы будем сохранять вывод эмулятора Firebase в файл, отслеживать изменения в файле, обрабатывать изменения (формат и т. д.) и выводить обработанные данные в консоль.

  1. Клонируйте репозиторий Firebase-Emulator-Logging GitHub. Это приложение Node.js. Запустите типичный npm install в клонированном каталоге.
  2. Запустите эмулятор Firebase, как обычно, и выведите в файл. Например: firebase emulators:start > save.txt или npm run serve > save.txt.
  3. Вернувшись в клонированный каталог, запустите приложение Node с помощью node index.js --file {file location}. Например: node index.js --file ./save.txt
  4. Наслаждайтесь новыми журналами!

Расширенные параметры журналов

Есть несколько вариантов запуска приложения Node. Вы уже видели файл —, но вы также можете настроить вывод на тихий, что означает, что системный вывод, начинающийся с «функция» или «хостинг», подавляется, и вы можете отключить красивое форматирование.

За кулисами

Если вы хотите увидеть весь код, отправляйтесь на GitHub, или вот файл index.js:

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;
  });
});

Используются два внешних пакета NPM:

  • import TailFile from "@logdna/tail-file"; — Хвостовой файл — отличный пакет, который позволяет «хвостить» файл — всякий раз, когда что-то меняется, происходит событие.
  • import colorizer from "json-colorizer"; — Раскрашиватель JSON — это пакет, который позволяет указать, какие элементы JSON получают тот или иной цвет.