Security News
vlt Debuts New JavaScript Package Manager and Serverless Registry at NodeConf EU
vlt introduced its new package manager and a serverless registry this week, innovating in a space where npm has stagnated.
@tinkoff/logger
Advanced tools
Библиотека логгирования
Устанавливаем npm модуль
npm i --save @tinkoff/logger
или
yarn add @tinkoff/logger
import logger from '@tinkoff/logger'; // импорт логгера
const log = logger('my-component'); // создаем новый логер с идентификатором my-component. Этот индетификатор будет добавлен к каждому логу в поле name. Стоит задавать уникальные индетификаторы, так как можно будет проще найти логи
// мы можем логировать данные с разным уровнем, чем ниже уровень, тем критичней лог.
log.trace('trace');
log.debug('debug');
log.info({ event: 'client-visited', message: 'client visited tinkoff.ru' });
log.warn('warn');
log.error({ event: 'form-send-error', error: new Error('form') });
log.fatal('fatal error');
Про уровни логгирования и что они обозначают можно почитать статью.
Для правильного логгирования на клиенте и на сервере, предпочтительно использовать следующий формат:
interface Log {
event?: string; // уникальный индетификатор события, который можно будет просто найти в системе учетов логов
message?: string; // описание лога
error?: Error; // ошибка, если она есть
[key]: any; // любые другие данные
}
message
logger.info('hello logger'); // идентично logger.info({ message: 'hello logger' });
logger.warn({
message: 'be warn',
event: 'my-warning', // event - стандартный ключ для обозначения конкретного события
...obj1,
...obj2,
a: 1,
b: 2,
});
error
, либо явно передаем в логгер первым аргументомlogger.error({
error: new Error('message'),
});
logger.error(new Error('message'));
logger.error(new Error('typeError'), 'custom error message'); // специальный формат для переопределения текста ошибки
logger.debug(
{
event: 'watch',
data: 'some data',
},
'arg2',
'arg3'
);
Данный формат прежде всего нужен для удобной работы с логами во внешних системах вроде kibana, splunk. Поэтому желательно его придерживаться, иначе возможны сложности с поиском и анализом логов.
С помощью метода инстанса логгера .child
можно создавать дочерние логгеры для данного инстанса, которые будут наследовать конфигурацию родительского логгера и могут эту конфигурацию переопределять.
const log = logger({ name: 'test' });
const childLog = log.child('child'); // т.к. логгер дочерний то его итоговое имя будет 'test.child'
const childLogWithDefaults = log.child({
name: 'withDefaults',
defaults: {
// defaults позволяет задать объект все свойства которого будут вмержены в объекты логов залогированных данным логгером
child: true,
},
});
const childLogWithOverrides = log.child({
name: 'override',
reporters: [], // позволяет переопределить настройки родительского логгера
filters: [],
extensions: [],
});
Библиотека дает возможность установить уровень логгирования, отображать или скрывать логи различных экземпляров логгера, и очищать все настройки.
По умолчанию, уровень логгирования выставлен как error
для всех логгеров.
Добавление отображения уникального логгера с уровнем выше error
, например logger.enable('info', 'my-logger')
, переопределяет уровень логгирования только для my-logger
.
Нельзя сделать уровень логгирования для определенного логгера ниже, чем общий уровень, например при установленном по умолчанию уровне error
запись logger.enable('fatal', 'my-logger')
ничего не изменит в отображаемых логах.
Каждое добавление уникальных настроек отображения для нового логгера не влияет на предыдущие, например отдельные вызовы методов logger.enable('info', 'my-logger')
и logger.enable('trace', 'yet-another-logger')
будут работать независимо друг от друга.
Для настройки отображения логов на сервере используются переменные окружения LOG_LEVEL
и LOG_ENABLE
(параметры можно задавать вместе, тогда сначала проверяется LOG_LEVEL настройка, потом LOG_ENABLE):
LOG_LEVEL=info
, то будут отображаться все логи уровней info, warn, error, fatal${name}
| ${level}:${name}
- позволяет включить отображение всех логов по определенному имени логгера или по определенному имени и уровню. Несколько вхождений передаются через запятую. Примеры:
LOG_ENABLE=server
, то будут отображены логи всех уровней с именем server
LOG_ENABLE=trace:server*
, то будут отображены только логи для server
с уровнем trace
LOG_ENABLE=info:server,client,trace:shared
, то будут включены логи для заданных логгеров по правилам вышеВ браузере настройки сохраняются в localStorage, поэтому для отображения всех клиентских логов с новыми настройками, надо дополнительно перезагрузить страницу, либо очистить localStorage. Для удобной настройки параметров отображения в window
добавляется объект logger
через который можно настраивать отображение логов в браузере.
logger === window.logger;
logger.setLevel('warn'); // отображать логи уровня warn и выше
logger.enable('info', 'test'); // также отображать вывод логгера test уровня info
logger.enable('my-logger'); // включить полное отображение логгера my-logger
logger.enable('perf*'); // включить все логи имя которых начинается с perf
logger.disable('my-logger'); // отключить логгирование для заданного пространства имен
logger.clear(); // очистить все настройки (отключение отображения логов)
import { logger } from '@tinkoff/logger';
const log = logger({ name: 'my-logger' }); // задание name обязательно для идентификации логгера
const log = logger('my-logger'); // краткая запись, аналогичная предыдущей строке
const log = logger({
name: 'remote-logger',
defaults: {
remote: true,
},
});
Параметры:
name[='log']
- имя нового логгера@tinkoff/logger
можно расширять различными действиями:
Фильтры позволяют отключать логгирование орпеделенных логов в зависимости от условий
import { logger } from '@tinkoff/logger';
interface Filter {
filter(logObj: LogObj): boolean;
}
logger.addFilter(filter as Filter); // добавить фильтр вдобавок к заданными по умолчанию и добавленным ранее
logger.setFilters([filter1, filter2]); // заменить текущие фильтры на переданные (что также позволит переделать поведение по умолчанию)
Расширения позволяют расширять или переопределять объект лога перед его логгированием
import { logger } from '@tinkoff/logger';
interface Extension {
extend(logObj: LogObj): LogObj;
}
logger.addExtension(extension as Extension); // добавить расширение вдобавок к заданными по умолчанию и добавленным ранее
logger.setExtensions([extension1, extension2]); // заменить текущие расшиерния на переданные (что также позволит переделать поведение по умолчанию)
Репортеры позволяют настраивать вид отображения логов (json, красочные логи для браузера, отправка логов на апи).
По умолчанию подключены репортеры для отображения логов в консоли на основании настроек отображения .
Такие репортеры зависят от настроек уровня и включенных логгеров, т.е. такие репортеры не вызываются если уровень текущего лога ниже настроек или для данного имени логи не включены.
import { logger } from '@tinkoff/logger';
interface Reporter {
log(logObj: LogObj): void;
}
logger.addReporter(reporter as Reporter); // добавить репортер вдобавок к заданными по умолчанию и добавленным ранее
logger.setReporters([reporter1, reporter2]); // заменить текущие репортеры на переданные (что также позволит переделать поведение по умолчанию)
Тоже самое что и обычные репортеры, но вызываются безусловно для всех логов и до всей остальной логики с фильтрами и расширениями.
import { logger } from '@tinkoff/logger';
interface Reporter {
log(logObj: LogObj): void;
}
logger.addBeforeReporter(reporter as Reporter); // добавить репортер вдобавок к заданными по умолчанию и добавленным ранее
logger.setBeforeReporters([reporter1, reporter2]); // заменить текущие репортеры на переданные (что также позволит переделать поведение по умолчанию)
Стандартный логгер для отображения логов в браузере.
Стандартный логгер для отображения логов в консоли на сервере, цветной и с удобным форматированием.
Используется по умолчанию в дев режиме или если задана process.env.DEBUG_PLAIN
.
Репортер для отображения логов в консоли на сервере, минималистичный.
Отображение логов в виде json.
Репортер для отправки логов на апи.
import { logger, RemoteReporter } from '@tinkoff/logger';
const remote = new RemoteReporter({
requestCount: 1, // кол-во запросов которые могут быть отправлено параллельно
emitLevels: { error: true, fatal: true }, // уровни которые будут по умолчанию логгироваться на апи
async makeRequest(logObj) {
// функция которая принимает текущий лог и отправляет запрос на апи
return await request();
},
});
logger.addReporter(remote);
const log = logger({ name: 'test-remote' }); // настройки для remote будут использованы из настроек RemoteReporter
log.error('error'); // лог также отправится на апи
log.info('test'); // не отправится на апи т.к. уровень не error и не fatal
const remoteLog = logger({ name: 'remote-for-all', remote: true }); // remote перебивает настройки RemoteReporter и отправляет логи в любом случае
remoteLog.info('test'); // отправится на апи
remoteLog.debug('test'); // отправится
const traceLog = logger({ name: 'log-trace', emitLevels: { trace: true } }); // переписать настройки RemoteReporter
traceLog.trace('test'); // отправится на апи
traceLog.error('test'); // не отправится
Репортер для поддержки формата логов sage. Расширяет функционал JSONReporter:
@timestamp
;level
записывает строковое представление уровня логирования, числовое значение сохраняет в поле levelNumber
;message
массивом содержащим исходный message
и записывает в него все строковые и числовые значения из массива args
;args
выносит в поля лога arrays
и objects
; Это решает основную массу проблем при индексации логов в sage.env,system,inst
if it is supplied on reporter creationFAQs
Logging library
The npm package @tinkoff/logger receives a total of 66 weekly downloads. As such, @tinkoff/logger popularity was classified as not popular.
We found that @tinkoff/logger demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
vlt introduced its new package manager and a serverless registry this week, innovating in a space where npm has stagnated.
Security News
Research
The Socket Research Team uncovered a malicious Python package typosquatting the popular 'fabric' SSH library, silently exfiltrating AWS credentials from unsuspecting developers.
Security News
At its inaugural meeting, the JSR Working Group outlined plans for an open governance model and a roadmap to enhance JavaScript package management.