Регистратор практически всего.
Дополнительную информацию см. в Руководстве по обновлению. Сообщения об ошибках и пиар приветствуются!
[email protected]
? Обратите внимание, что приведенная ниже документация предназначена для winston@3
. Прочтите документацию [email protected]
.
winston
спроектирован как простая и универсальная библиотека журналирования с поддержкой нескольких транспортов. Транспорт — это, по сути, устройство хранения ваших журналов. Каждый регистратор winston
может иметь несколько транспортов (см.: Транспорты), настроенных на разных уровнях (см.: Уровни ведения журнала). Например, может потребоваться, чтобы журналы ошибок хранились в постоянном удаленном месте (например, в базе данных), но все журналы выводились на консоль или в локальный файл.
winston
стремится отделить части процесса ведения журнала, чтобы сделать его более гибким и расширяемым. Внимание уделяется поддержке гибкости форматирования журналов (см. «Форматы») и уровням (см. «Использование пользовательских уровней ведения журнала») и обеспечению того, чтобы эти API были отделены от реализации ведения журнала транспорта (т. е. того, как журналы хранятся/индексируются, см. «Добавление пользовательских журналов»). Transports) в API, который они предоставили программисту.
ТЛ;ДР? Ознакомьтесь с примером быстрого запуска в ./examples/
. В ./examples/*.js
есть ряд других примеров. Не видите пример, который, по вашему мнению, должен быть там? Отправьте запрос на добавление, чтобы добавить его!
Рекомендуемый способ использования winston
— создать собственный регистратор. Самый простой способ сделать это — использовать winston.createLogger
:
const winston = require('winston');const logger = winston.createLogger({level: 'info', format: winston.format.json(), defaultMeta: {service: 'user-service' }, Transports: [ / // - Записать все журналы с уровнем важности `error` или выше в `error.log` // (т.е. ошибка, фатальная, но не другие уровни) // new winston.transports.File({ имя файла: 'error.log', уровень: 'error' }), // // - Записывать все журналы с уровнем важности `info` или выше в `combined.log` // (т. е. фатальные, ошибки, предупреждения, и информация, но не трассировка) // new winston.transports.File({ filename: 'combined.log' }), ],});//// Если мы не в производстве, войдите в `консоль` в формате:// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `//if (process.env.NODE_ENV !== 'production') { logger.add(new winston. Transports.Console({ format: winston.format.simple(), }));}
Вы также можете войти напрямую через регистратор по умолчанию, предоставляемый require('winston')
, но он просто предназначен для использования в качестве удобного общего регистратора для использования во всем вашем приложении, если вы того пожелаете. Обратите внимание, что регистратор по умолчанию не имеет никаких транспортов по умолчанию. Вам необходимо добавить транспорты самостоятельно, и если оставить регистратор по умолчанию без каких-либо транспортов, это может привести к проблемам с высоким использованием памяти.
Мотивация
Быстрый старт
Использование
Оглавление
Ведение журнала
Создание своего логгера
Потоки, objectMode
и info
объекты
Форматы
Объединение форматов
Строковая интерполяция
Фильтрация info
объектов
Создание пользовательских форматов
Уровни журналирования
Использование уровней журналирования
Использование пользовательских уровней ведения журнала
Транспорты
Несколько перевозок одного типа
Добавление пользовательских транспортов
Распространенные варианты транспорта
Исключения
Обработка неперехваченных исключений с помощью Winston
Выйти или не выйти
Отказы
Обработка неперехваченных отклонений обещаний с помощью Winston
Профилирование
Потоковая передача журналов
Запрос журналов
Дальнейшее чтение
Использование регистратора по умолчанию
Ожидание записи журналов в winston
Работа с несколькими регистраторами в winston
Сообщения консоли маршрутизации передаются на консоль вместо stdout и stderr
Установка
Запуск тестов
Уровни ведения журнала в winston
соответствуют порядку серьезности, указанному в RFC5424: предполагается, что серьезность всех уровней нумеруется по возрастанию от наиболее важного к наименее важному.
const уровни = {ошибка: 0, предупреждение: 1, информация: 2, http: 3, подробный: 4, отладка: 5, глупо: 6};
Вы начинаете с создания регистратора, используя winston.createLogger
:
const logger = winston.createLogger({transports: [new winston.transports.Console(), new winston.transports.File({имя файла: 'combined.log' }) ]});
Регистратор принимает следующие параметры:
Имя | По умолчанию | Описание |
---|---|---|
level | 'info' | Регистрируйтесь только в том случае, если info.level меньше или равен этому уровню. |
levels | winston.config.npm.levels | Уровни (и цвета), представляющие приоритеты журналов |
format | winston.format.json | Форматирование info сообщений (см.: Форматы) |
transports | [] (Нет транспорта) | Набор целей регистрации для info сообщений |
exitOnError | true | Если false, обработанные исключения не будут вызывать process.exit |
silent | false | Если это правда, все журналы подавляются. |
Уровни, предоставленные для createLogger
будут определены как удобные методы возвращаемого logger
.
//// Ведение журнала//logger.log({ level: 'info', message: 'Привет, распределенные файлы журналов!'});logger.info('Еще раз здравствуйте, распределенные журналы');
Вы можете добавлять или удалять транспорты из logger
, как только он будет предоставлен вам из winston.createLogger
:
const files = new winston.transports.File({ filename: 'combined.log' });const console = new winston.transports.Console();logger .clear() // Удалить все транспорты .add(console) // Добавить консольный транспорт .add(files) // Добавить файловый транспорт .remove(console); // Удалить консольный транспорт
Вы также можете полностью перенастроить экземпляр winston.Logger
используя метод configure
:
const logger = winston.createLogger({ level: 'info', Transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'combined.log' }) ]});/// / Заменяет предыдущие транспорты на // новые конфигурации.//const DailyRotateFile = require('winston-daily-rotate-file');logger.configure({level: 'verbose', Transports: [new DailyRotateFile(opts) ]});
Вы можете создавать дочерние регистраторы из существующих для передачи переопределенных метаданных:
const logger = winston.createLogger({transports: [new winston.transports.Console(), ]});const childLogger = logger.child({requestId: '451' });
.child
, скорее всего, будет содержать ошибку, если вы также расширяете классLogger
из-за некоторых деталей реализации, из-за которыхthis
ключевое слово указывает на неожиданные вещи. Используйте с осторожностью.
objectMode
и info
объекты В winston
экземпляры Logger
и Transport
рассматриваются как потоки objectMode
, которые принимают info
объект.
Параметр info
, предоставленный в данном формате, представляет собой одно сообщение журнала. Сам объект изменчив. Каждая info
должна иметь как минимум свойства level
и message
:
const info = { level: 'info', // Уровень сообщения журнала: 'Эй! Записать что-нибудь? // Записывается описательное сообщение.};
Свойства помимо уровня и сообщения считаются " meta
". то есть:
const {уровень, сообщение, ... мета} = информация;
Некоторые форматы в самой logform
добавляют дополнительные свойства:
Свойство | Формат добавлен | Описание |
---|---|---|
splat | splat() | Знак интерполяции строк для сообщений в стиле %d %s . |
timestamp | timestamp() | временная метка получения сообщения. |
label | label() | Пользовательская метка, связанная с каждым сообщением. |
ms | ms() | Количество миллисекунд с момента предыдущего сообщения журнала. |
Как потребитель вы можете добавлять любые свойства по своему усмотрению — внутреннее состояние поддерживается свойствами Symbol
:
Symbol.for('level')
(ТОЛЬКО ДЛЯ ЧТЕНИЯ) : равен свойству level
. Рассматривается как неизменяемый во всем коде.
Symbol.for('message'):
полное строковое сообщение, заданное «завершением форматов»:
json
logstash
printf
prettyPrint
simple
Symbol.for('splat')
: дополнительные аргументы интерполяции строк. Используется исключительно форматом splat()
.
Эти символы хранятся в другом пакете: triple-beam
, чтобы все потребители logform
могли иметь одну и ту же ссылку на символ. то есть:
const { LEVEL, MESSAGE, SPLAT } = require('triple-beam');console.log(LEVEL === Symbol.for('level'));// trueconsole.log(MESSAGE === Symbol.for( 'message'));// trueconsole.log(SPLAT === Symbol.for('splat'));// true
ПРИМЕЧАНИЕ. любое свойство
{ message }
в предоставленномmeta
объекте будет автоматически объединено с любым уже предоставленнымmsg
: например, ниже будет объединено слово «world» с «hello»:logger.log('error', 'hello', { message: 'world' }); logger.info('hello', { message: 'world' });
Доступ к форматам в winston
можно получить из winston.format
. Они реализованы в виде logform
, отдельного модуля от winston
. Это обеспечивает гибкость при написании собственных транспортов на случай, если вы захотите включить в свой транспорт формат по умолчанию.
В современных версиях строк шаблонов node
очень эффективны и являются рекомендуемым способом форматирования для большинства конечных пользователей. Если вы хотите отформатировать свои журналы по индивидуальному заказу, вам подойдет winston.format.printf
:
const { createLogger, format, Transports } = require('winston');const { join, timestamp, label, printf } = format;const myFormat = printf(({ level, message, label, timestamp }) => { return ` ${timestamp} [${label}] ${level}: ${message}`;});const logger = createLogger({ format: join( label({ label: 'right мяу!' }), timestamp(), myFormat ), транспорты: [new Transports.Console()]});
Чтобы узнать, какие встроенные форматы доступны, и узнать больше о создании собственных форматов журналов, см. logform
.
Любое количество форматов можно объединить в один с помощью format.combine
. Поскольку format.combine
не принимает opts
, для удобства он возвращает заранее созданный экземпляр объединенного формата.
const { createLogger, format, Transports } = require('winston');const { join, timestamp, label, PrettyPrint } = format;const logger = createLogger({ format: join( label({ label: 'right meow!' } ), timestamp(), PrettyPrint() ), Transports: [new Transports.Console()]})logger.log({ level: 'info', message: 'Во сколько тестирование at?'});// Outputs:// { level: 'info',// message: 'Во сколько будет тестирование?',// label: 'right meow!',// timestamp: '2017- 09-30T03:57:26.875Z' }
Метод log
обеспечивает интерполяцию строк с использованием util.format. Его необходимо включить с помощью format.splat()
.
Ниже приведен пример, который определяет формат со строковой интерполяцией сообщений с помощью format.splat
, а затем сериализует все info
сообщение с помощью format.simple
.
const { createLogger, format, Transports } = require('winston');const logger = createLogger({ format: format.combine( format.splat(), format.simple() ), транспорты: [new Transports.Console() ]});// info: тестовое сообщение my string {}logger.log('info', 'test message %s', 'my string');// info: тестовое сообщение 123 {}logger.log('info', 'тестовое сообщение %d', 123);// информация: тестовое сообщение первая секунда {number: 123}logger.log('info', 'тестовое сообщение %s, %s' , 'первый', 'второй', {номер: 123 });
info
объектов Если вы хотите полностью отфильтровать данный info
объект при регистрации, просто верните значение false.
const { createLogger, format, Transports } = require('winston');// Игнорировать сообщения журнала, если они имеют {private: true }const ignorePrivate = format((info, opts) => { if (info.private) { return false; } вернуть информацию;});const logger = createLogger({ format: format.combine( ignorePrivate(), format.json() ), транспорты: [новый Transports.Console()]});// Выводы: {"level":"error","message":"Общедоступная ошибка для публикации"}logger.log({ level: 'error', message: 'Общедоступная ошибка для Share'});// Сообщения с {private: true } не будут записываться при logged.logger.log({ Private: true, level: 'error', message: 'Это суперсекретно - спрячьте.'}) ;
Использование format.combine
будет учитывать любые возвращаемые ложные значения и останавливать оценку более поздних форматов в серии. Например:
const { format } = require('winston');const { join, timestamp, label } = format;const willNeverThrow = format.combine( format(info => { return false })(), // Игнорирует все format(info => { throw new Error('Никогда не достигнуто') })());
Форматы — это прототипные объекты (т.е. экземпляры классов), которые определяют один метод: transform(info, opts)
и возвращают измененную info
:
info
: объект, представляющий сообщение журнала.
opts
: настройка, специфичная для текущего экземпляра формата.
Ожидается, что они вернут одно из двух:
info
объект, представляющий измененный info
аргумент. Ссылки на объекты не обязательно сохранять, если предпочтительна неизменность. Все текущие встроенные форматы считают info
изменяемой, но [immutablejs] рассматривается для будущих выпусков.
Значение false, указывающее, что аргумент info
должен игнорироваться вызывающей стороной. (См. «Фильтрация info
объектов») ниже.
winston.format
спроектирован максимально простым. Чтобы определить новый формат, просто передайте ему функцию transform(info, opts)
чтобы получить новый Format
.
Возвращенный именованный Format
можно использовать для создания любого количества копий данного Format
:
const { format } = require('winston');const Volume = format((info, opts) => { if (opts.yell) { info.message = info.message.toUpperCase(); } else if (opts. шепот) { info.message = info.message.toLowerCase(); } return info;});// `volume` теперь является функцией, которая возвращает экземпляры format.const Scream = Volume({ yell: true });console.dir(scream.transform({ level: 'info', message: `извините, что заставил вас кричать в вашей голове!`}, Screaming.options)); // {// уровень: 'info'// сообщение: "ИЗВИНИТЕ, ЧТО ЗАСТАВИЛ ВАС КРАТЬ В ГОЛОВЕ!"// }// `volume` можно использовать несколько раз для создания разных форматов.const шепот = Volume({ шепот: true });console.dir(whisper.transform({ level: 'info', message: `ПОЧЕМУ ОНИ ЗАСТАВЛЯЮТ НАС ТАК МНОГО ОРАТЬ!`}, шепот.options));// {/ / level: 'info'// message: 'почему они заставляют нас так кричать!'// }
Уровни ведения журнала в winston
соответствуют порядку серьезности, указанному в RFC5424: предполагается, что серьезность всех уровней нумеруется по возрастанию от наиболее важного к наименее важному.
Каждому level
присваивается определенный целочисленный приоритет. Чем выше приоритет, тем более важным считается сообщение и тем ниже соответствующий целочисленный приоритет. Например, как указано в RFC5424, уровни syslog
имеют приоритет от 0 до 7 (от самого высокого до самого низкого).
{ возникшее событие: 0, предупреждение: 1, крит: 2, ошибка: 3, предупреждение: 4, уведомление: 5, информация: 6, отладка: 7}
Аналогично, уровни журналирования npm
имеют приоритет от 0 до 6 (от самого высокого до самого низкого):
{ ошибка: 0, предупреждение: 1, информация: 2, http: 3, подробный: 4, отладка: 5, глупо: 6}
Если вы явно не определили уровни, которые должен использовать winston
, будут использоваться уровни npm
, указанные выше.
Установить уровень сообщения журнала можно двумя способами. Вы можете передать строку, представляющую уровень ведения журнала, в метод log() или использовать методы указанного уровня, определенные в каждом Winston Logger.
//// Любой экземпляр логгера //logger.log('silly', "127.0.0.1 - нет места лучше дома");logger.log('debug', "127.0.0.1 - нет места лучше дома") ;logger.log('verbose', "127.0.0.1 - нет места лучше дома");logger.log('info', "127.0.0.1 - лучше дома нет места");logger.log('warn', "127.0.0.1 - лучше дома нет места");logger.log('ошибка', "127.0.0.1 - места нет как дома");logger.info("127.0.0.1 - такого места нет home");logger.warn("127.0.0.1 - нет места лучше дома");logger.error("127.0.0.1 - нет места лучше дома");//// Регистратор по умолчанию//winston.log( 'info', "127.0.0.1 - лучше дома нет места");winston.info("127.0.0.1 - лучше дома нет места");winston.info("127.0.0.1 - лучше дома нет места"); дом");
winston
позволяет вам определить свойство level
для каждого транспорта, которое определяет максимальный уровень сообщений, которые транспорт должен регистрировать. Например, используя уровни syslog
вы можете записывать в консоль только сообщения error
, а всю info
и ниже — в файл (который включает сообщения error
):
const logger = winston.createLogger({levels: winston.config.syslog.levels, Transports: [new winston.transports.Console({level: 'error' }), new winston.transports.File({filename: 'combined. журнал', уровень: 'информация' }) ]});
Вы также можете динамически изменять уровень журнала транспорта:
const Transports = { console: new winston.transports.Console({level: 'warn' }), file: new winston.transports.File({ filename: 'combined.log', level: 'error' })};const logger = winston.createLogger({transports: [transports.console, Transports.file]});logger.info('Вход в систему также не будет выполнен Transport!');transports.console.level = 'info';transports.file.level = 'info';logger.info('Будет зарегистрировано в обоих транспортах!');
winston
поддерживает настраиваемые уровни ведения журнала, по умолчанию используются уровни ведения журнала в стиле npm. Уровни должны быть указаны во время создания вашего регистратора.
В дополнение к предопределенным уровням npm
, syslog
и cli
, доступным в winston
, вы также можете определить свои собственные:
const myCustomLevels = { уровни: { foo: 0, bar: 1, baz: 2, foobar: 3 }, цвета: { foo: 'blue', bar: 'green', baz: 'yellow', foobar: 'red' }};const customLevelLogger = winston.createLogger({levels: myCustomLevels.levels});customLevelLogger.foobar('какое-то сообщение с уровнем foobar');
Хотя в этой структуре данных есть небольшое повторение, она обеспечивает простую инкапсуляцию, если вы не хотите использовать цвета. Если вы хотите иметь цвета, помимо передачи уровней самому Регистратору, вы должны сообщить Уинстону о них:
winston.addColors(myCustomLevels.colors);
Это позволяет регистраторам использовать средство форматирования colorize
для соответствующего окрашивания и оформления вывода пользовательских уровней.
Кроме того, вы также можете изменить цвет фона и стиль шрифта. Например,
baz: «курсив желтый», foobar: «жирный красный голубой BG»
Возможные варианты ниже.
Стили шрифтов: bold
, dim
, italic
, underline
, inverse
, hidden
, strikethrough
.
Цвета переднего плана шрифта: black
, red
, green
, yellow
, blue
, magenta
, cyan
, white
, gray
, grey
.
Цвета фона: blackBG
, redBG
, greenBG
, yellowBG
blueBG
magentaBG
, cyanBG
, whiteBG
.
Чтобы раскрасить стандартный уровень ведения журнала, добавьте
winston.format.combine( winston.format.colorize(), winston.format.simple());
где winston.format.simple()
— любой другой форматтер, который вы хотите использовать. Средство форматирования colorize
должно предшествовать любым средствам форматирования, добавляющим текст, который вы хотите раскрасить.
Чтобы раскрасить полную строку журнала с помощью форматтера json, вы можете применить следующее
winston.format.combine(winston.format.json(), winston.format.colorize({all: true }));
В winston
включено несколько основных транспортов, которые используют встроенные сетевые возможности и файловый ввод-вывод, предлагаемые ядром Node.js. Кроме того, есть дополнительные транспорты, написанные участниками сообщества.
При создании транспорта можно использовать несколько транспортов одного типа, например winston.transports.File
.
const logger = winston.createLogger({ транспорты: [ new winston.transports.File({ имя файла: 'combined.log', уровень: 'info' }), новый winston.transports.File({ имя файла: 'errors.log' , уровень: 'ошибка' }) ]});
Если позже вы захотите удалить один из этих транспортов, вы можете сделать это, используя сам транспорт. например:
const CombinedLogs = logger.transports.find(transport => { return Transport.filename === 'combined.log'});logger.remove(combinedLogs);
Добавить собственный транспорт легко. Все, что вам нужно сделать, это принять любые необходимые параметры, реализовать метод log() и использовать его с помощью winston
.
const Transport = require('winston-transport');const util = require('util');//// Наследуется от `winston-transport`, чтобы вы могли воспользоваться // базовыми функциями и `.Exceptions.handle ()`.//module.exports = класс YourCustomTransport расширяет транспорт { конструктор (opts) { super (opts); // // Здесь можно использовать любые пользовательские параметры. например: // - Информация о соединении для баз данных // - Информация аутентификации для API (например, loggly, papertrail, // logentries и т. д.). // } log(info, callback) { setImmediate(() => { this.emit('logged', info); }); // Выполняем запись в удаленный сервис callback(); }};
Поскольку каждый транспорт наследует от winston-transport, можно установить собственный формат и уровень журнала для каждого транспорта отдельно:
const logger = winston.createLogger({transports: [new winston.transports.File({имя файла: 'error.log', уровень: 'error', формат: winston.format.json() }), new winston.transports. Http({ level: 'warn', format: winston.format.json() }), new winston.transports.Console({ level: 'информация', формат: winston.format.combine( winston.format.colorize(), winston.format.simple() ) }) ]});
С помощью winston
можно перехватывать и регистрировать события uncaughtException
из вашего процесса. Используя свой собственный экземпляр журнала, вы можете включить это поведение при его создании или на более позднем этапе жизненного цикла вашего приложения:
const { createLogger, Transports } = require('winston');// Включаем обработку исключений при создании вашего logger.const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ] ,ExceptionHandlers: [new Transports.File({ filename: 'Exceptions.log' }) ]});// Или включите его позже, добавив транспорт или используя `.Exceptions.handle`const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ]});// Вызов исключения.handle с транспортом для обработки исключений.Exceptionslogger.Exceptions.handle (new Transports.File({имя файла: 'Exceptions.log' }));
Если вы хотите использовать эту функцию с регистратором по умолчанию, просто вызовите .exceptions.handle()
с экземпляром транспорта.
//// Вы можете добавить отдельный регистратор исключений, передав его в `.Exceptions.handle`//winston.Exceptions.handle( new winston.transports.File({ filename: 'path/to/Exceptions.log' }) );//// Альтернативно вы можете установить для `handleExceptions` значение true при добавлении транспортов// в winston.//winston.add(new winston.transports.File({ filename: 'path/to/combined.log', handleExceptions: true}));
По умолчанию Winston завершит работу после регистрации uncaughtException. Если это не то поведение, которое вам нужно, установите exitOnError = false
const logger = winston.createLogger({exitOnError: false });//// или, например:://logger.exitOnError = false;
При работе с пользовательскими экземплярами средства ведения журнала вы можете передавать отдельные транспорты в exceptionHandlers
или устанавливать handleExceptions
для любого транспорта.
const logger = winston.createLogger({transports: [new winston.transports.File({имя файла: 'path/to/combined.log' })],ExceptionHandlers: [new winston.transports.File({имя файла: 'path/ to/Exceptions.log' }) ]});
const logger = winston.createLogger({transports: [new winston.transports.Console({ handleExceptions: true }) ], exitOnError: false});
Опция exitOnError
также может быть функцией, предотвращающей выход только при определенных типах ошибок:
function ignoreEpipe(err) { return err.code !== 'EPIPE';}const logger = winston.createLogger({exitOnError: ignoreEpipe });//// или, например:://logger.exitOnError = ignoreEpipe;
С помощью winston
можно перехватывать и регистрировать события unhandledRejection
из вашего процесса. Используя свой собственный экземпляр журнала, вы можете включить это поведение при его создании или на более позднем этапе жизненного цикла вашего приложения:
const { createLogger, Transports } = require('winston');// Включаем обработку отклонений при создании вашего logger.const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ] , RejectionHandlers: [ new Transports.File({ filename: 'rejections.log' }) ]});// Или включите его позже, добавив транспорт или используя `.rejections.handle`const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ]});// Вызов Rejections.handle с транспортом для обработки ignoreslogger.rejections.handle (new Transports.File({имя файла: 'rejections.log' }));
Если вы хотите использовать эту функцию с регистратором по умолчанию, просто вызовите .rejections.handle()
с экземпляром транспорта.
//// Вы можете добавить отдельный регистратор отклонений, передав его в `.rejections.handle`//winston.rejections.handle( new winston.transports.File({ filename: 'path/to/rejections.log' }) );//// Альтернативно вы можете установить для `handleRejections` значение true при добавлении транспортов// в winston.//winston.add(new winston.transports.File({имя файла: 'path/to/combined.log', handleRejections: true}));
Помимо регистрации сообщений и метаданных, winston
также имеет простой механизм профилирования, реализованный для любого регистратора:
//// Запуск профиля 'test'//logger.profile('test');setTimeout(function () { // // Остановка профиля 'test'. Теперь будет вестись журналирование: // '17 Январь 21 :00:00 - информация: продолжительность теста = 1000 мс' // logger.profile('test');}, 1000);
Также вы можете запустить таймер и сохранить ссылку, по которой вы можете вызвать .done()
:
// Возвращает объект, соответствующий определенному времени. Когда будет вызвано // завершение, таймер завершит работу и зарегистрирует продолжительность. например: // const Profiler = logger.startTimer(); setTimeout(function () {profiler.done({ message: 'Сообщение журнала' }); }, 1000);
По умолчанию для всех сообщений профиля установлен уровень «информация», и как сообщение, так и метаданные являются необязательными. Для отдельных сообщений профиля вы можете переопределить уровень журнала по умолчанию, предоставив объекту метаданных свойство level
:
logger.profile('test', {level: 'debug' });
winston
поддерживает запросы журналов с параметрами, подобными Loggly. См. раздел API поиска Loggly. В частности: File
, Couchdb
, Redis
, Loggly
, Nssocket
и Http
.
const options = { from: new Date() - (24 * 60 * 60 * 1000), до: new Date(), предел: 10, начало: 0, порядок: 'desc', поля: ['message']} ;//// Найти элементы, зарегистрированные между сегодняшним и вчерашним днем. //logger.query(options, function (err, results) { if (err) { /* TODO: обработать меня */ throw err; } console.log(результаты);});
Потоковая передача позволяет вам передавать журналы обратно с выбранного вами транспорта.
//// Начинаем с конца.//winston.stream({ start: -1 }).on('log', function(log) { console.log(log);});
Регистратор по умолчанию доступен напрямую через модуль winston
. Любой метод, который вы могли бы вызвать в экземпляре средства ведения журнала, доступен в средстве ведения журнала по умолчанию:
const winston = require('winston');winston.log('info', 'Привет, распределенные файлы журналов!');winston.info('Еще раз здравствуйте, распределенные журналы');winston.level = 'debug';winston.log ('debug', 'Теперь мои отладочные сообщения выводятся на консоль!');
По умолчанию в регистраторе по умолчанию не установлены транспорты. Вы должны добавлять или удалять транспорты с помощью методов add()
и remove()
:
const files = new winston.transports.File({ filename: 'combined.log' });const console = new winston.transports.Console();winston.add(console);winston.add(files);winston.remove (консоль);
Или сделайте это одним вызовом configure():
winston.configure({ транспорты: [ новый winston.transports.File({ имя файла: 'somefile.log' }) ]});
Дополнительную документацию по работе с каждым отдельным транспортом, поддерживаемым winston
см. в документе winston
Transports.
winston
Часто перед выходом из процесса полезно дождаться записи журналов. Каждый экземпляр winston.Logger
также является [потоком Node.js]. Событие finish
будет вызвано, когда все журналы будут сброшены на все транспорты после завершения потока.
const Transport = new winston.transports.Console();const logger = winston.createLogger({transports: [transport]});logger.on('finish', function (info) { // Все сообщения журнала `info` имеют теперь зарегистрировано});logger.info('CHILL WINSTON!', {серьезно: правда });logger.end();
Также стоит отметить, что средство ведения журнала также генерирует событие «ошибка», если в самом средстве ведения журнала возникает ошибка, которую вам следует обработать или подавить, если вы не хотите необработанных исключений:
//// Обработка ошибок, возникающих в самом регистраторе //logger.on('error', function (err) { /* Do Something */ });
Часто в более крупных и сложных приложениях необходимо иметь несколько экземпляров журнала с разными настройками. Каждый регистратор отвечает за отдельную область функций (или категорию). В winston
это проявляется двумя способами: через winston.loggers
и экземпляры winston.Container
. Фактически, winston.loggers
— это просто предопределенный экземпляр winston.Container
:
const winston = require('winston');const { format } = winston;const { join, label, json } = format;//// Настройте регистратор для `category1`//winston.loggers.add('category1' , { format: join( label({ label: 'category one' }), json() ), Transports: [ new winston.transports.Console({ level: 'silly' }), new winston.transports.File({ filename: 'somefile.log' }) ]});//// Настройте регистратор для `category2`//winston.loggers.add('category2 ', { format: join( label({ label: 'category two' }), json() ), Transports: [ new winston.transports.Http({host: 'localhost', порт: 8080 }) ]});
Теперь, когда ваши регистраторы настроены, вы можете указать Winston в любом файле вашего приложения и получить доступ к этим предварительно настроенным регистраторам:
const winston = require('winston');//// Получите предварительно настроенные регистраторы //const Category1 = winston.loggers.get('category1');const Category2 = winston.loggers.get('category2');category1. info('регистрация файлового и консольного транспорта');category2.info('регистрация HTTP-транспорта');
Если вы предпочитаете управлять Container
самостоятельно, вы можете просто создать его экземпляр:
const winston = require('winston');const { format } = winston;const { join, label, json } = format;constContainer = new winston.Container();container.add('category1', { format: join ( label({ label: 'category one' }), json() ), транспорты: [ new winston.transports.Console({ level: 'silly' }), new winston.transports.File({ filename: 'somefile.log' }) ]});const Category1 =Container.get('category1');category1.info('регистрация в файловых и консольных транспортах');
По умолчанию транспорт winston.transports.Console
отправляет сообщения на stdout
и stderr
. Это нормально в большинстве ситуаций; однако в некоторых случаях это нежелательно, в том числе:
Отладка с использованием VSCode и подключение к процессу Node.js, а не его запуск.
Написание сообщений формата JSON в AWS Lambda
Ведение журнала во время тестов Jest с опцией --silent
Чтобы журнал транспорта использовал вместо этого console.log()
, console.warn()
и console.error()
, установите для параметра forceConsole
значение true
:
const logger = winston.createLogger({level: 'info', Transports: [new winston.transports.Console({forceConsole: true })]});
npm установить Винстон
пряжа добавить Винстон
Все тесты Winston написаны с использованием mocha
, nyc
и assume
. Их можно запустить с помощью npm
.
НПМ-тест