Чи складно вам розібратися з кодом? Чи потрібне вам рішення для ведення журналів, яке полегшить налагодження? Продовжуйте читати, щоб дізнатися більше.
Розробка програмного забезпечення складається з декількох етапів: визначення вимог, аналіз, написання коду, тестування та супровід. З усіх цих етапів, фаза написання коду/розробки є найтривалішою та найскладнішою. Інженери з програмного забезпечення стикаються з синтаксичними, логічними помилками та помилками виконання. Синтаксичні помилки виявляються під час компіляції, оскільки код не відповідає правилам мови програмування.
Натомість, логічні помилки та помилки під час виконання не можуть бути ідентифіковані в інтегрованому середовищі розробки (IDE) і їх часто важко відстежити та виправити. Усунення недоліків є трудомістким процесом і вимагає значного часу для налагодження.
Налагодження – це процес, за допомогою якого намагаються зрозуміти, чому написаний код працює не так, як треба. Легко вирішити проблему, коли відомо про помилку та точні рядки коду, де вона виникла. Отже, ведення журналів є дуже важливим для налагодження коду.
Що таке ведення журналів?
Ведення журналів – це метод, за якого повідомлення фіксуються під час роботи програми. Потрібно реєструвати лише ті повідомлення, які можуть допомогти в процесі налагодження. Тому важливо знати, коли додавати оператори журналювання до коду. Крім того, не менш важливо розрізняти оператори журналів. Існують різні рівні ведення журналів, такі як інформація, попередження, помилка, налагодження та докладний. Вирази помилок і попереджень використовуються для обробки винятків.
Дані, які повертаються з функцій, результати після обробки масивів, дані, отримані з API, і т. д. – ось деякі приклади даних, які можна записувати за допомогою інформаційних операторів. Для детального опису помилок використовуються журнали налагодження та докладні журнали.
Журнал налагодження містить інформацію про трасування стека, параметри вводу-виводу і т. д. “Докладний” журнал не такий детальний, як журнал “налагодження”, але містить список всіх подій, які відбулися. Журнали записуються до консолі, файлів та вихідного потоку. Для структурованого та форматованого журналювання можна використовувати інструменти керування журналами.
Ведення журналів у Node.js
Node.js – це середовище виконання JavaScript. Програми Node.js асинхронні та неблокуючі, і використовуються у системах з інтенсивним об’ємом даних та системах реального часу. Найкращий спосіб дізнатися більше про Node.js – вивчити навчальні посібники та документацію про Node.js. Ведення журналів є необхідним для покращення продуктивності, виявлення несправностей та відстеження помилок. Ведення журналу в Node.js можна здійснити за допомогою вбудованої функції console.log. Крім того, функція налагодження пов’язана з декількома пакетами і може ефективно використовуватися.
Проміжне програмне забезпечення використовується для керування запитами та відповідями. Проміжне програмне забезпечення може бути програмою або будь-якою іншою структурою JavaScript. Запис у проміжне програмне забезпечення можна здійснити через програми та маршрутизатори. Будь-який реєстратор Node.js повинен використовувати команду npm або yarn install для встановлення реєстраторів.
Npm означає “Node Package Manager”, а YARN – “Yet Another Resource Negotiator”. Однак Yarn є кращим за npm, оскільки він працює швидше та встановлює пакети паралельно.
Деякі з найкращих реєстраторів Node.js перераховані нижче:
Pino
Pino – це бібліотека, яка є однією з найкращих для реєстрації в програмах Node.js. Це відкритий вихідний код, надзвичайно швидкий і реєструє повідомлення у зручному для читання форматі JSON. Деякі з рівнів журналу Pino: налагодження, попередження, помилки та інформаційні повідомлення. Екземпляр реєстратора Pino можна імпортувати до проекту, а оператори console.log потрібно замінити на оператори logger.info.
Скористайтеся наступною командою для встановлення Pino:
$ npm install pino
Створені журнали є структурованими та у форматі JSON, показуючи номер рядка журналу, тип журналу, час його створення тощо. Pino створює мінімальне навантаження на журнал в програмі та є надзвичайно гнучким при обробці журналів.
Pino можна інтегрувати з такими веб-фреймворками, як Hapi, Restify, Express тощо. Журнали, створені Pino, також можна зберігати у файлах. Він використовує робочі потоки для роботи і є сумісним з TypeScript.
Winston
Winston підтримує ведення журналів для різних веб-фреймворків, головним чином зосереджуючись на гнучкості та розширюваності. Він підтримує декілька видів транспортування та може зберігати журнали в різних місцях у файловій системі. Транспорти – це місця, де зберігаються повідомлення журналу.
Окрім деяких вбудованих транспортів, таких як Http, Console, File та Stream, він підтримує інші транспорти, такі як Cloud watch та MongoDB. Він веде журналювання на різних рівнях і форматах. Рівні журналювання показують серйозність проблеми.
Нижче показані різні рівні реєстрації:
{ error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6 }
Формат виводу журналу також можна налаштовувати, фільтрувати та комбінувати. Журнали містять інформацію про часову мітку, мітки, пов’язані з журналом, мілісекунди, що минули від попереднього журналу, тощо.
Winston також обробляє винятки та неперехоплені обіцянки. Він надає додаткові функції, такі як файли під час виконання запитів, потокові журнали тощо. Спочатку потрібно встановити Winston. Потім для зберігання журналу створюється конфігураційний об’єкт Winston разом із транспортом. Об’єкт журналу створюється за допомогою функції createLogger(), і йому передається повідомлення журналу.
Node-Bunyan
Bunyan використовується для швидкого ведення журналів у node.js у форматі JSON. Він також надає інструмент CLI (інтерфейс командного рядка) для перегляду журналів. Він легкий і підтримує різні середовища виконання, такі як Node.js, Browserify, WebPack і NW.js. Формат JSON журналів додатково покращується за допомогою функції гарного друку. Журнали мають різні рівні, такі як фатальний, помилка, попередження, інформація, налагодження та трасування; кожен пов’язаний із числовим значенням.
Усі рівні, що перевищують рівень, встановлений для екземпляра, записуються. Потік Bunyan – це місце, куди записуються результати. Підкомпоненти програми можна записувати за допомогою функції log.child(). Усі дочірні реєстратори прив’язані до конкретної батьківської програми. Типом потоку може бути файл, файл що обертається, необроблені дані і т. д. Зразок коду для визначення потоку показано нижче:
var bunyan = require('bunyan'); var log = bunyan.createLogger({ name: "foo", streams: [ { stream: process.stderr, level: "debug" }, ... ] });
Bunyan також підтримує журнал DTrace. Зонди, що беруть участь у веденні журналу DTrace, включають log-trace, log-warn, log-error, log-info, log-debug та log-fatal. Bunyan використовує серіалізатори для створення журналів у форматі JSON. Функції серіалізатора не створюють винятків і є захисними.
Loglevel
Loglevel використовується для реєстрації в програмах Javascript. Це також один із найкращих реєстраторів Node.js, оскільки він легкий і простий. Він реєструє заданий рівень та використовує один файл без залежностей для журналювання. Рівень журналу за замовчуванням – “попередження”. Вихідні дані журналу добре відформатовані разом з номерами рядків. Деякі методи, що використовуються для ведення журналів: trace, debug, warn, error та info.
Вони стійкі до збоїв у будь-якому середовищі. getLogger() – це метод, який використовується для отримання об’єкта журналу. Його також можна комбінувати з іншими плагінами, щоб розширити його функціонал. Деякі з плагінів включають loglevel-plugin-prefix, loglevel-plugin-remote, ServerSend та DEBUG. Плагін для додавання префіксних повідомлень до журналу показано нижче:
var originalFactory = log.methodFactory; log.methodFactory = function (methodName, logLevel, loggerName) { var rawMethod = originalFactory(methodName, logLevel, loggerName); return function (message) { rawMethod("Newsflash: " + message); }; }; log.setLevel(log.getLevel()); // Be sure to call setLevel method in order to apply plugin
Збірки запускаються за допомогою команди npm run dist, а тести можна запускати за допомогою команди npm test. Рівень журналу підтримує пакети Webjar, Bower та Atmosphere. Щоразу, коли додаються нові функції, випускається нова версія Loglevel.
Signale
Signale складається з 19 реєстраторів для програм Javascript. Він підтримує TypeScript та ведення журналів у межах. Він складається з таймерів, які допомагають реєструвати часову мітку, дані та назву файлу. Окрім 19 реєстраторів, таких як очікування, завершення, фатальний, улюблений, інформація тощо, можна створювати власні журнали.
Спеціальні журнали створюються шляхом визначення об’єкта JSON та полів з даними реєстратора. Також можна створювати інтерактивні журнали. Якщо для інтерактивного журналу встановлено значення true, нові значення з інтерактивних журналів замінюють старі.
Найкраща частина Signale – це здатність фільтрувати секретну або конфіденційну інформацію. Декілька секретів зберігаються в масиві. addSecrets() та clearSecrets() – це функції, що використовуються для додавання та очищення секретів з масиву. Boostnote, Docz, Shower, Taskbook та Vant використовують Signale для ведення журналів. Синтаксис для виклику API із Signale виглядає так:
signale.<logger>(message[,message]|messageObj|errorObj)
На момент написання статті кількість завантажень Signale перевищила 1 мільйон.
Tracer
Tracer використовується для створення детальних повідомлень журналу. Повідомлення журналу складаються з позначок часу, імен файлів, номерів рядків та імен методів. Допоміжні пакети можна встановити для налаштування формату журналу вихідних даних. Допоміжні пакети можна встановити за допомогою наступної команди.
npm install -dev tracer
Tracer підтримує файловий, потоковий та MongoDB транспорт. Він підтримує кольорову консоль та умови фільтра в журналі. Спочатку трасувальник потрібно встановити за допомогою npm install. По-друге, необхідно створити об’єкт журналу та вибрати тип консолі. Потім різні рівні або типи журналу можна вказати над об’єктом для подальшого ведення журналу.
Настроювані фільтри можна створити, визначивши синхронні функції з бізнес-логікою, наявною в тілі функції. Мікрошаблони, такі як tinytim, також можна використовувати для системного ведення журналів.
Cabin.js
Cabin використовується для ведення журналів програм node.js на стороні сервера та клієнта. Він використовується там, де потрібно маскувати конфіденційну та критичну інформацію. Це включає номери кредитних карток, заголовки BasicAuth, солі, паролі, маркери CSRF та номери банківських рахунків. Наведений нижче фрагмент коду показує ведення журналів за допомогою Cabin.js.
const Cabin = require('cabin'); const cabin = new Cabin(); cabin.info('hello world'); cabin.error(new Error('oops!'));
Він складається з понад 1600 імен полів. Він також відповідає принципу Bring Your Own Logger (BYOL). Це робить його сумісним з різними іншими реєстраторами, такими як Axe, Pino, Bunyan, Winston тощо. Це зменшує витрати на зберігання на дисках завдяки автоматичному потоку та буферам Cabin. Він сумісний з різними платформами і його легко налагоджувати.
Ведення журналів на стороні сервера вимагає використання проміжного програмного забезпечення для маршрутизації та автоматичного ведення журналів вихідних даних. Для ведення журналів на стороні браузера потрібні запити XHR та сценарії. Він використовує Axe, який показує метадані, тобто дані про дані, трасування стека та інші помилки. SHOW_STACK і SHOW_META – це логічні змінні зі значенням true або false, щоб показати або приховати трасування стека та метадані.
Npmlog
Npmlog – це базовий тип реєстратора, який використовується npm. Деякі з методів ведення журналів, що використовуються: рівень, запис, maxRecordSize, prefixStyle, заголовок та потік. Він також підтримує кольорове ведення журналів. Різні рівні реєстрації: безглузді, докладні, інформація, попередження, http та помилки. Зразок фрагмента коду для використання журналу npm показано нижче.
var log = require('npmlog') // additional stuff ---------------------------+ // message ----------+ | // prefix ----+ | | // level -+ | | | // v v v v log.info('fyi', 'I have a kitty cat: %j', myKittyCat)
Усі повідомлення пригнічуються, якщо як рівень журналу вказано “Infinity”. Якщо як рівень журналу вказано “-Infinity”, для перегляду журналів потрібно ввімкнути опцію перегляду повідомлень журналу.
Для протоколювання використовуються події та об’єкти повідомлень. Повідомлення з префіксом видаються, коли використовуються події з префіксом. Об’єкти стилю використовуються для форматування журналів, як-от додавання кольору до тексту та фону, стиль шрифту, як-от жирний, курсив, підкреслення тощо. Деякі пакети журналів npm – це brolog, npmlogger, npmdate log тощо.
Roarr
Roarr – це реєстратор для Node.js, який не потребує ініціалізації та створює структуровані дані. Він має CLI та змінні середовища. Він сумісний з браузером. Його можна інтегрувати з Fastify, Fastify, Elastic Search тощо. Він може розрізняти код програми та код залежності. Кожне повідомлення журналу складається з контексту, повідомлення, послідовності, часу та версії. Різні рівні журналу включають трасування, налагодження, інформацію, попередження, помилку та фатальний. Зразок фрагмента коду про те, як ведеться журнал у Roarr, такий:
import { ROARR, } from 'roarr'; ROARR.write = (message) => { console.log(JSON.parse(message)); };
Також можна виконати серіалізацію помилок, тобто екземпляр з помилкою можна записувати разом із контекстом об’єкта. Деякі зі змінних середовища, які є специфічними для Node.js та Roarr, це ROARR_LOG та ROARR_STREAM. “Adopt” – це функція, яка використовується з node.js для передачі властивостей контексту на різні рівні. Дочірні функції також можна використовувати з проміжним програмним забезпеченням під час ведення журналів.
Підсумкові слова
Ведення журналів – це метод відстеження різноманітних дій та подій під час виконання програми. Ведення журналів відіграє важливу роль у налагодженні коду. Це також допомагає підвищити читабельність коду. Node.js – це середовище виконання Javascript з відкритим кодом. Одними з найкращих реєстраторів Node.js є Pino, Winston, Bunyan, Signale, Tracer, Npmlog тощо. Кожен тип реєстратора має власні функції, такі як профілювання, фільтрування, потокове передавання та транспортування.
Деякі реєстратори підтримують кольорові консолі, а деякі підходять для обробки конфіденційної інформації. Детальні та відформатовані журнали найбільше допомагають розробникам, коли вони намагаються виправити помилки у своєму коді. Формат JSON зазвичай є кращим для ведення журналів, оскільки він записує дані у формі пар ключ-значення, що робить його зручним для користувача.
Логери також можуть бути інтегровані з іншими програмами та сумісні з кількома браузерами. Завжди доцільно ознайомитися з потребами та програмами, які ви створюєте, перш ніж вибрати тип реєстратора, який ви хочете використовувати.
Ви також можете подивитися, як інсталювати Node.js та NPM на Windows та macOS.