7 лучших библиотек ведения журналов Node.js для ваших следующих проектов
Когда вы разрабатываете готовое к работе приложение, ведение журнала - одна из самых важных вещей, которые вам нужны. Это помогает вам отслеживать поток выполнения и получать представление о том, почему определенные вещи происходят в вашем приложении. Если вы следите за своими журналами, вы можете легко увидеть, есть ли какие-либо проблемы или аномалии, происходящие в вашем приложении.
Чтобы помочь вам отслеживать и отлаживать проблемы в вашем Node.js приложения, мы составили список лучших библиотек ведения журнала для Node.js приложения. Они также помогут вам выявить проблемы до того, как они повлияют на ваших пользователей; это позволит вам устранить их до того, как они станут серьезными проблемами.
Winston
Winston — популярная библиотека ведения журналов. Он разработан, чтобы быть простым и обеспечивает универсальное ведение журнала с поддержкой нескольких транспортов. Winston позиционирует себя как «регистратор почти всего».
С помощью Winston мы можем направлять ваши журналы в другие сервисы, такие как AWS cloudwatch, graylog2, logz.io , или даже Sematext Logsene. Мы даже можем добавить промежуточное программное обеспечение 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;
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}`);
});
Это даст следующий результат, когда мы запустим сервер с узлом winston.js и нажмем http://localhost:3001/test/api в браузере:
Пример приложения, прослушивающего на 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
Bunyan — еще одна популярная и быстрая библиотека ведения журналов JSON Node.js. Как и Winston, он также поддерживает вход в несколько вариантов транспорта. Другие функции включают в себя CLI для аккуратной печати журналов, фильтр журналов, сериализаторы для рендеринга объектов, систему отслеживания и возможность поддержки нескольких сред выполнения, таких как NW.js и WebPack. Bunyan применяет формат JSON для журналов.
Установите Bunyan с помощью npm.
npm install bunyan
После установки теперь вы можете приступить к созданию экземпляра регистратора, прежде чем вызывать методы, соответствующие каждой серьезности журнала.
const bunyan = require('bunyan');
const log = bunyan.createLogger({
name: 'myapp',
streams: [
{
level: 'info',
stream: process.stdout
},
{
level: 'error',
path: './myapp-error.log'
}
]
});
log.info("This is log of level info");
log.error("This is a log of error level");
Журналы с уровнем серьезности ошибки журнала и меньше вы можете записывать в файл с именем myapp-error.log, а журналы с уровнем информации журнала и меньше вы можете записывать в process.stdout. Журналы форматируются в JSON.
{"name":"myapp","hostname":"DESKTOP-T8C4TF4","pid":19164,"level":30,"msg":"This is log of level info","time":"2022-05-28T19:38:46.486Z","v":0}
{"name":"myapp","hostname":"DESKTOP-T8C4TF4","pid":19164,"level":50,"msg":"This is a log of error level","time":"2022-05-28T19:38:46.487Z","v":0}
Если вы используете Express, express-bunyan-logger - это промежуточное программное обеспечение на базе bunyan, которое вы можете включить для ведения журнала в своих приложениях Express.
const express = require('express');
const app = express();
const port = 8080;
app.use(require('express-bunyan-logger')({
name: 'logger',
format: ":remote-address - :user-agent[major] custom logger",
streams: [{
level: 'info',
stream: process.stdout
},
{
level: 'error',
path: './newapp-error.log'
}
]
}));
app.get('/', (req, res) => {
res.send('Express application has been logged !');
});
app.get('/newpage/', (req, res) => {
res.json({'message': 'Hello Developer!'});
});
app.listen(port, () => {
console.log(`The application is listening at http://localhost:${port}`);
});
Когда мы выполняем приведенный выше код и нажимаем на конечную точку localhost:8080, журналы с уровнем серьезности ошибки или меньше и журналы с уровнем серьезности info или меньше записываются в newapp-error.log и консоль соответственно. В обоих случаях журналы форматируются в формате JSON.
{"name":"logger","hostname":"Thomas","pid":15124,"req_id":"83ff8181-89d2-4bd5-9db3-a3121ee7a194","level":30,"remote-address":"::1","ip":"::1","method":"GET","url":"/","referer":"-","user-agent":{"family":"Chrome","major":"99","minor":"0","patch":"4844","device":{"family":"Other","major":"0","minor":"0","patch":"0"},"os":{"family":"Windows","major":"10","minor":"0","patch":"0"}},"http-version":"1.1","response-time":747.4553,"response-hrtime":[0,747455300],"status-code":304,"req-headers":{"host":"localhost:8080","connection":"keep-alive","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 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-gpc":"1","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"io=aQJ9Q4pzOENJkdftAAAC; connect.sid=s%3AvyrJ3mrWR2NERi4Fpi-E3xyYBDbW1m-O.uQdVPjtzJEKeN9XA29f4FvKG2icEnRI0MAdehMLy7r0","if-none-match":"W/\"20-HIBUXsVCk/nPIIFJblENJC3SnAg\""},"res-headers":{"x-powered-by":"Express","etag":"W/\"20-HIBUXsVCk/nPIIFJblENJC3SnAg\""},"req":{"method":"GET","url":"/","headers":{"host":"localhost:8080","connection":"keep-alive","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 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-gpc":"1","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"io=aQJ9Q4pzOENJkdftAAAC; connect.sid=s%3AvyrJ3mrWR2NERi4Fpi-E3xyYBDbW1m-O.uQdVPjtzJEKeN9XA29f4FvKG2icEnRI0MAdehMLy7r0","if-none-match":"W/\"20-HIBUXsVCk/nPIIFJblENJC3SnAg\""},"remoteAddress":"::1","remotePort":61169},"res":{"statusCode":304,"header":"HTTP/1.1 304 Not Modified\r\nX-Powered-By: Express\r\nETag: W/\"20-HIBUXsVCk/nPIIFJblENJC3SnAg\"\r\nDate: Sat, 10 Sep 2022 15:26:34 GMT\r\nConnection: keep-alive\r\nKeep-Alive: timeout=5\r\n\r\n"},"incoming":"<--","msg":"::1 - 99 custom logger","time":"2022-09-10T15:26:35.216Z","v":0}
(node:15124) [DEP0066] DeprecationWarning: OutgoingMessage.prototype._headers is deprecated
(Use `node --trace-deprecation ...` to show where the warning was created)
Pino
Pino также является популярной альтернативой библиотеке ведения журналов Node.js для разработчиков. Есть утверждения, что он в 5 раз быстрее, чем другие библиотеки ведения журналов Node.js, помимо предоставления стандартных функций, таких как возможность выбора носителя для хранения, уровней журнала и возможностей форматирования. Pino также отличается высокой расширяемостью, гибкостью и простотой интеграции с платформами Node.js, такими как Express, Fastify и Restify. Библиотека представляет собой библиотеку ведения журналов Node.js с низкими накладными расходами и поддерживает асинхронное ведение журналов, несмотря на свою скорость. Pino также дает вам возможность создавать дочерние регистраторы.
Чтобы установить Pino, используйте приведенную ниже команду.
npm install pino
const pino = require('pino');
const logger = pino({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
});
logger.info('Hello, Developer!');
const child = logger.child({ a: 'property' })
child.info('Hello Developer!')
Журналы:
{"level":30,"time":1653773121769,"pid":8964,"hostname":"DESKTOP-THOMAS","msg":"Hello, Developer!"}
{"level":30,"time":1653773121770,"pid":8964,"hostname":"DESKTOP-THOMAS","a":"property","msg":"Hello Developer!"}
В качестве альтернативы вы могли бы создать этот экземпляр ведения журнала в отдельном файле, экспортировать его и использовать во всем вашем проекте. Как уже упоминалось, Pino также легко настраивается Node.js библиотека ведения журнала, особенно при работе с другими фреймворками. Например, используя регистратор express-pino, вы также можете зарегистрировать свое приложение express. Чтобы установить промежуточное программное обеспечение, мы используем эту команду.
npm install express-pino-logger --save
Вот простой веб-сервер Express с двумя конечными точками, иллюстрирующий, как мы можем использовать промежуточное программное обеспечение express-pino-logger. Поскольку журналы Pino очень подробны, вы также можете использовать модуль pino-pretty для форматирования журналов. Для установки модуля используйте команду, показанную ниже.
'use strict'
const express = require('express');
const app = express();
const pino = require('express-pino-logger')();
const PORT = process.env.PORT || 8080;
app.use(pino)
app.get('/', (req, res) => {
res.send('Your express app has been logged');
});
app.get('/newpage/', (req, res) => {
req.log.info();
res.json({'message': 'Hello Dev!'});
});
app.listen(PORT, () => {
console.log(`The application is listening at http://localhost:${PORT}`);
});
Журналы:
{"level":30,"time":1662818930367,"pid":12764,"hostname":"Thomas","req":{"id":1,"method":"GET","url":"/",host":"localhost:8080","connection":"keep-alive","upgrade-insecure-requests":"1","user-agent":"Mozilla/5guage":"en-US,en;q=0.9","cookie":"io=aQJ9Q4pzOENJkdftAAAC; connect.sid=s%3AvyrJ3mrWR2NERi4Fpi-E3xyYBDbW1m-O.uQdVPjtzJEKeN9XA29f4FvKG2icEnRI0MAdehMLy7r0"},"remoteAddress":"::1","remotePort":61303},"res":{"statusCode":200,"headers":{"x-powered-by":"Express","content-type":"text/html; charset=utf-8","content-length":"32","etag":"W/\"20-HIBUXsVCk/nPIIFJblENJC3SnAg\""}},"responseTime":18,"msg":"request completed"}
{"level":30,"time":1662818936220,"pid":12764,"hostname":"Thomas","req":{"id":2,"method":"GET","url":"/favicon.ico","query":{},"params":{},"headers":{"host":"localhost:8080","connection":"keep-alive","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36","accept":"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8","sec-gpc":"1","sec-fetch-site":"same-origin","sec-fetch-mode":"no-cors","sec-fetch-dest":"image","referer":"http://localhost:8080/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"io=aQJ9Q4pzOENJkdftAAAC; connect.sid=s%3AvyrJ3mrWR2NERi4Fpi-E3xyYBDbW1m-O.uQdVPjtzJEKeN9XA29f4FvKG2icEnRI0MAdehMLy7r0"},"remoteAddress":"::1","remotePort":61315},"res":{"statusCode":404,"headers":{"x-powered-by":"Express","content-security-policy":"default-src 'none'","x-content-type-options":"nosniff","content-type":"text/html; charset=utf-8","content-length":150}},"responseTime":3,"msg":"request completed"}
LogLevel
Относительно популярная, простая, «минимальная и легковесная» библиотека ведения журналов Node.js, которая работает как в браузере, так и для Node.js. Согласно документации, библиотеки ведения журналов LogLevel Node.js стремятся заменить консольные методы дополнительными функциями, такими как «возможность отключить ведение журнала ошибок в рабочей среде и фильтровать журналы по их серьезности». LogLevel — это библиотека ведения журнала Node.js, которая не имеет зависимостей и может продолжать ведение журнала даже в браузерах, не поддерживающих объект консоли. Как и другие библиотеки журналов Node.js, LogLevel также является расширяемым и предлагает возможности перенаправления журналов, форматирования и фильтрации. Для разработчиков, которые разрабатывают на TypeScript, в LogLevel уже включены определения типов, что делает его еще более удобным в использовании.
Ниже приведен пример использования библиотеки ведения журнала LogLevel в соответствии со спецификацией модуля CommonJS, в частности, на стороне сервера с Node.js. Если вы используете npm, вы можете установить LogLevel с помощью приведенной ниже команды.
npm install loglevel
const log = require('loglevel');
log.warn("This is a warning !");
log.error("This is an error !");
Выполнение приведенного выше кода с помощью node index.js должен вернуть следующий вывод в консоль.
This is a warning!
This is an error !
Вы также можете использовать библиотеку ведения журналов LogLevel Node js для ведения журналов с другими платформами Node js, например, в express.js без промежуточного программного обеспечения. Вот простой веб-сервер с одной конечной точкой.
const express = require('express');
const app = express();
const logger = require('loglevel');
const port = 8080;
app.get('/', (req, res) => {
logger.warn('This is a warning');
res.json({'message': 'Hello Developer !'});
logger.error('This is an error');
});
app.listen(port, () => {
console.log(`The application is listening at http://localhost:${port}`);
});
Tracer
Tracer называет себя настраиваемой и мощной библиотекой ведения журнала для Nodejs. С помощью Tracer вы можете печатать простые журналы, цветные журналы и даже устанавливать уровни вывода. Вы можете настроить его, напечатав временную метку, имя файла, номер строки и даже стек вызовов. Список огромен.
Вы можете загрузить его, используя приведенную ниже команду NPM:
npm i tracer
var logger = require('tracer').console();
logger.log('hello');
logger.trace('hello', 'world');
logger.debug('hello %s', 'world', 123);
logger.info('hello %s %d', 'world', 123, {foo:'bar'});
logger.warn('hello %s %d %j', 'world', 123, {foo:'bar'});
logger.error('hello %s %d %j', 'world', 123, {foo:'bar'}, [1, 2, 3, 4], Object);
Журналы:
2022-09-10T13:59:30+0000 <log> tracer.js:3 (Object.<anonymous>) hello
2022-09-10T13:59:30+0000 <trace> tracer.js:4 (Object.<anonymous>) hello world
2022-09-10T13:59:30+0000 <debug> tracer.js:5 (Object.<anonymous>) hello world 123
2022-09-10T13:59:30+0000 <info> tracer.js:6 (Object.<anonymous>) hello world 123 { foo: 'bar' }
2022-09-10T13:59:30+0000 <warn> tracer.js:7 (Object.<anonymous>) hello world 123 {"foo":"bar"}
2022-09-10T13:59:30+0000 <error> tracer.js:8 (Object.<anonymous>) hello world 123 {"foo":"bar"} [ 1, 2, 3, 4 ] function Object() { [native code] }
Signale
Signale состоит из 19 регистраторов для приложений Javascript. Он поддерживает TypeScript и ведение журнала с заданной областью. Он состоит из таймеров, которые помогают регистрировать отметку времени, данные и имя файла. Помимо 19 регистраторов, таких как await
, complete
, fatal
, fav
, info
и т. д., можно создавать собственные журналы.
Пользовательские журналы создаются путем определения объекта JSON и полей с данными регистратора. Также можно создавать интерактивные регистраторы. Когда для интерактивного регистратора установлено значение true
, новые значения из интерактивных регистраторов переопределяют старые.
Morgan
Morgan — это инструмент ведения журнала (промежуточное ПО), который можно использовать на HTTP-серверах, реализованных с использованием Express и Node.js. Его можно использовать для регистрации запросов, ошибок и многого другого в консоли.
Чтобы установить промежуточное ПО, используйте эту команду:
npm i morgan
Использование Morgan с express в режиме разработки:
const express = require('express');
const logger = require('morgan');
const port = 3000;
const app = express();
app.use(logger('dev'));
app.get('/', (req, res) => {
res.send('<h1>Front Page</h1>');
});
app.listen(port, () => {
console.log(`Started at ${port}`);
});
Журналы:
GET / 200 9.428 ms - 19
GET /favicon.ico 404 4.822 ms - 150
Заключение
Этот список лучших библиотек ведения журналов для приложений Node.js был составлен с целью облегчить вам поиск той, которая соответствует вашим потребностям. Если вы используете одну из этих библиотек, вы можете быть уверены, что сможете эффективно отслеживать работоспособность своих приложений, устранять неполадки и отлаживать проблемы, а также сохранять важную информацию для последующего использования.