DevGang
Авторизоваться

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 был составлен с целью облегчить вам поиск той, которая соответствует вашим потребностям. Если вы используете одну из этих библиотек, вы можете быть уверены, что сможете эффективно отслеживать работоспособность своих приложений, устранять неполадки и отлаживать проблемы, а также сохранять важную информацию для последующего использования.

#JavaScript #NodeJS
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу