Оптимально правильное ведение журнала Node.js библиотека журналов может дать вам беспрецедентное представление о том, как работает ваше приложение. Правильное ведение журнала эквивалентно наличию мощного телескопа в пространстве со всеми вашими приложениями. Вы хотите иметь возможность видеть, как ваше приложение ведет себя под нагрузкой в рабочей среде? В этом посте мы проанализируем 5 популярных Node.js библиотеки журналов, которые могут легко выполнить эту работу за вас.
Содержание
- Допущения
- Node.js библиотеки журналов для оценки
- Быстрое сравнение Node.js библиотеки ведения журнала
- Вывод
Допущения
- Вы знакомы с тем, как Node.js работает и может запускать узел локально
- Вы можете установить библиотеки npm и обладать базовыми знаниями о package.json и интерфейсе командной строки npm
Мы будем использовать Express.js в качестве примера приложения для просмотра примеров кода запись журнала в консоль для всех Node.js библиотеки журналов в этом посте.
Node.js библиотеки журналов для оценки
Для этого поста мы оценим 5 популярных Node.js библиотеки ведения журнала, доступные в NPM. Все они загружаются более миллиона раз в неделю, так что они чертовски популярны. Давайте начнем!
Winston
Winston — популярная библиотека журналов. Он разработан, чтобы быть простым и обеспечивает универсальное ведение журнала с поддержкой нескольких transports
. Уинстон определяет себя как “Регистратор практически всего”.
С помощью Winston мы можем перенаправлять ваши журналы в другие сервисы, такие как AWS cloud watch, graylog2, logz.io, или даже Логсена сематекста. Мы даже можем добавить промежуточное программное обеспечение Express, чтобы улучшить ведение журнала с помощью Express с Winston.
Ниже приведен пример кода Winston с Express с использованием промежуточного программного обеспечения express-winston.
const winston = require('winston');
const expressWinston = require('express-winston');
const express = require('express');
const app = express();
const port = 3001;
//more options here - https://github.com/bithavoc/express-winston#request-logging
app.use(expressWinston.logger({
transports: [
new winston.transports.Console()
],
format: winston.format.combine(
winston.format.colorize(),
winston.format.json()
),
meta: false,
msg: "HTTP ",
expressFormat: true,
colorize: false,
ignoreRoute: function (req, res) { return false; }
}));
app.get('/', (req, res) => {
res.send('Hello World! - Winston logged');
});
app.get('/api/test', (req, res) => {
res.json({'message': 'Hello winston!'});
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
Он выдаст следующий вывод, когда мы запустим сервер с node winston.js
помощью браузера и нажмем http://localhost:3001/test/api
на него.
Example app listening at http://localhost:3001
{"meta":{},"level":"\u001b[32minfo\u001b[39m","message":"GET /api/test 304 2ms"}
{"meta":{},"level":"\u001b[32minfo\u001b[39m","message":"GET /favicon.ico 404 2ms"}
{"meta":{},"level":"\u001b[32minfo\u001b[39m","message":"GET /favicon.ico 404 1ms"}
Приведенный выше код также доступен в качестве запроса на извлечение.
Bunyan для Node.js ведение журнала
Bunyan — это еще один известный Node.js библиотека журналов. Баньян используется компанией Joyent в производстве. Он определяет себя как простую и быструю библиотеку ведения журнала JSON для Node.js услуги.
Баньян выступает за то, чтобы журналы были в формате JSON. Его функции включают в себя интерфейс командной строки для красивой печати, сериализаторы и поддержку нескольких сред выполнения в дополнение к Node.js например, Webpack и Browserify.
Ниже приведен пример кода Bunyan с Express с использованием регистратора Express Bunyan.
const express = require('express');
const app = express();
const port = 3002;
//more options here - https://github.com/villadora/express-bunyan-logger#usage
app.use(require('express-bunyan-logger')({
name: 'logger',
format: ":remote-address - :user-agent[major] custom logger",
streams: [{
level: 'info',
stream: process.stdout
}]
}));
app.get('/', (req, res) => {
res.send('Hello World! - Bunyan logged');
});
app.get('/api/test', (req, res) => {
res.json({'message': 'Hello bunyan!'});
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
Он покажет вывод, аналогичный следующему, когда мы выполним код с node bunyan.js
помощью браузера и нажмем http://localhost:3002/test/api
на него.
Example app listening at http://localhost:3002
{"name":"logger","hostname":"abcd","pid":32691,"req_id":"0b2d2977-376e-4742-86b0-57feec630188","level":30,"remote-address":"::1","ip":"::1","method":"GET","url":"/api/test","referer":"-","user-agent":{"family":"Chrome","major":"87","minor":"0","patch":"4280","device":{"family":"Other","major":"0","minor":"0","patch":"0"},"os":{"family":"Mac OS X","major":"10","minor":"14","patch":"6"}},"http-version":"1.1","response-time":14.628108,"response-hrtime":[0,14628108],"status-code":304,"req-headers":{"host":"localhost:3002","connection":"keep-alive","sec-ch-ua":"\"Google Chrome\";v=\"87\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"87\"","sec-ch-ua-mobile":"?0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-GB,en-US;q=0.9,en;q=0.8","cookie":"a=b","if-none-match":"W/\"1b-1NBfctHuicMF7VuqeDKGexvbveA\""},"res-headers":{"x-powered-by":"Express","etag":"W/\"1b-1NBfctHuicMF7VuqeDKGexvbveA\""},"req":{"method":"GET","url":"/api/test","headers":{"host":"localhost:3002","connection":"keep-alive","sec-ch-ua":"\"Google Chrome\";v=\"87\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"87\"","sec-ch-ua-mobile":"?0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-GB,en-US;q=0.9,en;q=0.8","cookie":"a=b","if-none-match":"W/\"1b-1NBfctHuicMF7VuqeDKGexvbveA\""},"remoteAddress":"::1","remotePort":63793},"res":{"statusCode":304,"header":"HTTP/1.1 304 Not Modified\r\nX-Powered-By: Express\r\nETag: W/\"1b-1NBfctHuicMF7VuqeDKGexvbveA\"\r\nDate: Tue, 26 Jan 2021 21:11:12 GMT\r\nConnection: keep-alive\r\n\r\n"},"incoming":"<--","msg":"::1 - 87 custom logger","time":"2021-01-26T21:11:12.817Z","v":0}
Журналы Баньяна по умолчанию очень подробны.
Приведенный выше код также доступен в качестве запроса на извлечение.
Pino
Пино является относительно популярным Node.js библиотека ведения журнала, которая помечает себя как “очень низкие накладные расходы Node.js лесоруб”. Он приписывает асинхронное ведение журнала своей быстрой производительности. Pino утверждает, что во многих случаях в своих тестах он более чем в 5 раз быстрее, чем альтернативы.
Другие функции включают в себя дочерние регистраторы и поддержку нескольких веб-платформ. Он имеет несколько основных и общественных модулей, которые помогают сформировать процветающую экосистему. С помощью Pino вы можете отправлять журналы во многие службы, используя соответствующие средства передачи, такие как MySQL, Datadog, AWS cloud watchили log flare.
Ниже приведен пример Pino с Express с использованием регистратора Express Pino.
const express = require('express');
const app = express();
const pino = require('express-pino-logger')();
const port = 3003;
//more options here - https://github.com/pinojs/express-pino-logger#example
app.use(pino)
app.get('/', (req, res) => {
res.send('Hello World! - Pino logged');
});
app.get('/api/test', (req, res) => {
req.log.info('Yo from pino');
res.json({'message': 'Hello Pino!'});
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
Он отправит вывод следующим образом, когда мы запустим сервер node pino.js
и нажмем http://localhost:3003/test/api
на браузер.
Example app listening at http://localhost:3003
{"level":30,"time":1611695678813,"pid":32768,"hostname":"abcd","req":{"id":1,"method":"GET","url":"/api/test","headers":{"host":"localhost:3003","connection":"keep-alive","sec-ch-ua":"\"Google Chrome\";v=\"87\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"87\"","sec-ch-ua-mobile":"?0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-GB,en-US;q=0.9,en;q=0.8","cookie":"_ga=GA1.1.1863215728.1591927460; PPA_ID=gkq1qhp7htr141pkojpmqcqt95; webfx-tree-cookie-persistence=wfxt-4; io=TxK-RQvnHb14VONKAAAC","if-none-match":"W/\"19-JzA5ewGlTSyvFTwS4fIYMkAu78Q\""},"remoteAddress":"::1","remotePort":63824},"msg":"Yo from pino"}
{"level":30,"time":1611695678817,"pid":32768,"hostname":"abcd","req":{"id":1,"method":"GET","url":"/api/test","headers":{"host":"localhost:3003","connection":"keep-alive","sec-ch-ua":"\"Google Chrome\";v=\"87\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"87\"","sec-ch-ua-mobile":"?0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-GB,en-US;q=0.9,en;q=0.8","cookie":"a=b","if-none-match":"W/\"19-JzA5ewGlTSyvFTwS4fIYMkAu78Q\""},"remoteAddress":"::1","remotePort":63824},"res":{"statusCode":304,"headers":{"x-powered-by":"Express","etag":"W/\"19-JzA5ewGlTSyvFTwS4fIYMkAu78Q\""}},"responseTime":4,"msg":"request completed"}
Как и в случае с Баньяном, журналы Pino по умолчанию также многословны. Мы можем использовать pino-pretty CLI, чтобы сделать бревна красивее.
К примеру кода можно получить доступ в виде запроса на извлечение.
Loglevel
Loglevel — это очень популярная библиотека журналов, которую можно использовать как в Node.js и браузер. Уровень журнала определяет себя как “Минимальное легкое простое ведение журнала для JavaScript”. Он также утверждает, что заменяет консоль.войдите в консоль.недостатки журнала.
Уровень лога кажется простым в использовании и очень удобным. Его readme добавляет: “Это надежная библиотека ежедневного ведения журнала”. которая не делает ничего необычного, но имеет основную функциональность, которую вы действительно будете использовать.
Ниже приведен очень простой пример уровня журнала с экспресс-сервером и без промежуточного программного обеспечения.
const express = require('express');
const app = express();
const logger = require('loglevel');
const port = 3004;
//more docs here - https://github.com/pimterry/loglevel#documentation
app.get('/', (req, res) => {
res.send('Hello World! - loglevel logged');
});
app.get('/api/test', (req, res) => {
logger.warn('Loglevel is simple');
res.json({'message': 'Hello loglevel!'});
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
Он покажет вывод следующим образом, когда мы запустим команду выполнить приведенный выше код node loglevel.js
и нажмем http://localhost:3004/test/api
на браузер.
Example app listening at http://localhost:3004
Loglevel is simple
Вывод на уровне журнала очень прост по сравнению с другими библиотеками. Кроме того, мы не использовали какое-либо специальное промежуточное программное обеспечение express для ведения журнала с использованием уровня журнала.
Мы также можем получить доступ к приведенному выше примеру в качестве запроса на вытягивание.
Npmlog
Npmlog — это еще одна очень популярная библиотека ведения журнала, которую использует NPM. Согласно readme NpmLog “Этот регистратор очень прост. Он ведет журнал для npm. Он поддерживает пользовательские уровни и цветной вывод.”
В этом нет ничего необычного Node.js библиотека журналов и последняя версия были опубликованы 4 года назад. Тем не менее, это самая популярная библиотека журналов, перечисленная в этом посте. Единственная библиотека с более чем 10 миллионами загрузок в неделю по состоянию на январь 2021 года.
Ниже приведен краткий пример npmlog в действии с помощью Express js и без промежуточного программного обеспечения.
const express = require('express');
const app = express();
const logger = require('npmlog');
const port = 3005;
//more docs here - https://github.com/npm/npmlog#basic-usage
app.get('/', (req, res) => {
res.send('Hello World! - npmlog logged');
});
app.get('/api/test', (req, res) => {
logger.warn('From Npmlog', 'Npmlog is simple too %j', {'message': 'test'});
res.json({'message': 'Hello npmlog!'});
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
Он покажет вывод, как показано ниже, когда мы запустим сервер Express js node npmlog.js
и нажмем http://localhost:3005/test/api
на браузер.
Example app listening at http://localhost:3005
WARN From Npmlog Npmlog is simple too {"message":"test"}
Как и на уровне журнала, для npmlog вывод был простым, и мы также не использовали промежуточное программное обеспечение Express js.
Приведенный выше код также доступен в качестве запроса на вытягивание.
Быстрое сравнение Node.js библиотеки ведения журнала
Ниже приведено краткое сравнение Node.js библиотеки журналов, которые мы обсуждали до сих пор, все данные собраны на последней неделе января-2021 года:
Функция/Услуга | Загрузки/неделя | Звезды Github | Вилки Github | Первый выпуск |
---|---|---|---|---|
Winston | 5,05 миллиона | 16,7 Тыс. | 1,5 К | 0.1.0 19 января 2011 г. |
Bunyan | 1,23 миллиона | 6,5 К | 513 | 0.1.0 3 февраля 2012 г. |
Pino | 1,28 миллона | 6,6 К | 439 | 0.2.0 6 марта 2016 года |
Loglevel | 9,12 миллиона | 1,9 К | 154 | 0.1.0 со 2 апреля 2013 г. |
npmlog | 10,71 миллиона долларов | 346 | 53 | 0.1.0 6 июня 2012 г. |
Если мы посмотрим на тенденции загрузки, тенденции NPM рисуют картину, как показано ниже:
Несмотря на то, что npmlog имеет только 346 звезд и 53 вилки, по сообщениям, он загружается более 10 миллионов раз в неделю. Что касается звезд GitHub, то у Уинстона в 3 раза больше звезд по сравнению со вторым Баньяном с 513 звездами. Winston также является старейшей библиотекой, созданной 30 декабря 2010 года, а первый релиз состоялся 19 января 2011 года.
Согласно npmcompare, у Npmlog больше всего очков с 25,5 миллионами очков, а у Буяна меньше всего очков с 2,9 миллионами очков.
Вывод
Для оптимального ведения журнала и мониторинга в Node.js Вместо того, чтобы гоняться за цифрами, возможно, лучше всего выбрать библиотеку, которая соответствует вашим потребностям.
Используйте библиотеку, которая наилучшим образом соответствует вашим целям, и используйте ее дополнения или функции, наиболее подходящие для вашего варианта использования.
Также было бы здорово, если бы вы следовали некоторым рекомендациям по ведению журнала, чтобы извлечь максимальную выгоду, поскольку они являются лучшими друзьями инженеров-программистов. Я уже давно проповедую о важности лесозаготовок. Счастливого входа в систему!