Winston: 3.0.0-rc1 — невозможно записать временные метки

Созданный на 28 дек. 2017  ·  13Комментарии  ·  Источник: winstonjs/winston

Я последовал примеру из документации и создал регистратор, как показано ниже:

const { createLogger, format, transports } = require('winston');

const logger = createLogger(
    {
        level: 'info',
        transports: [new transports.Console({
            showLevel: false,
            colorize: true,
            timestamp: true
        })
        ]
    }
);

logger.info('Server started');

Но, кажется, я могу заставить работать метки времени. Я получаю следующий вывод в черно-белом:

{"сообщение":"Сервер запущен","уровень":"информация"}

Согласно документации на странице https://github.com/winstonjs/winston/blob/master/docs/transports.md#console -transport, установка для флага временной метки значения true должна установить временную метку по умолчанию.

Я даже пытался вернуть пользовательскую метку времени, передав функцию, но даже это не отображается. Возможно, я что-то упустил, но вроде ни один из вариантов не работает, т.е. раскрасить, показать уровень, отметку времени.

Или документация не синхронизирована?

Самый полезный комментарий

@armadillojim

Используйте формат printf следующим образом:

const { createLogger, format, transports } = require('winston')
const { colorize, combine, timestamp, printf } = format

// Define your custom format with printf.
const myFormat = printf(info => {
  return `${info.timestamp} ${info.level}: ${info.message}`
})

const logger = createLogger({
  format: combine(
    timestamp(),
    colorize(),
    myFormat
  ),
  transports: [new transports.Console()]
})

logger.info('foo') // -> 2018-02-21T03:55:19.236Z info: foo

Все 13 Комментарий

Еще нет обновлений по этому вопросу? Я столкнулся с той же проблемой. Работает на [email protected], но не на [email protected]

Посмотрите на форматы , которые вы можете использовать с [email protected] .

const { createLogger, format, transports } = require('winston')

const logger = createLogger({
  level: 'info',
  transports: new transports.Console({
    format: format.combine(
      format.timestamp({
        format: 'YYYY-MM-DD' // Optional for choosing your own timestamp format.
      }),
      format.json()
    )
  })
})

logger.info('Server started')

Пример выводит следующее:

{"сообщение": "Сервер запущен", "уровень": "информация", "отметка времени": "2018-01-17T15:20:55.621Z"}

Или с опцией форматирования:

{"message":"Сервер запущен","уровень":"информация","отметка времени":"2018-01-17"}

почему format.timestamp не работает без объявления format.json после format.timestamp ?

Я просто хочу просто в начале строки, как это было раньше, я не хочу форматирования json
[2018-01-17T15:20:55.621Z] ИНФОРМАЦИЯ sdfsdfsdfsdfdfasfsadf, как я могу этого добиться?

В версии 2.3.1 я могу добиться:
2018-02-12T18:50:25.472Z - INFO: Starting up the process

С участием:

const winston = require('winston');

const logger = new (winston.Logger)({
  transports: [
    new (winston.transports.Console)({ timestamp: true, colorize: true}),
  ],
  exceptionHandlers: [
    new (winston.transports.Console)({ timestamp: true, colorize: true }),
  ],
  level: 'INFO',
  levels: {
    FATAL: 0,
    ERROR: 1,
    WARN: 2,
    INFO: 3,
    DEBUG: 4
  },
  colors: {
    INFO: 'blue',
    WARN: 'green',
    ERROR: 'yellow',
    FATAL: 'red'
  }
});

module.exports = logger

Я надеялся использовать «простую» текстовую регистрацию. Я пробовал следовать документам:

const winston = require('winston');
const logger = winston.createLogger({
    format: winston.format.combine(
        winston.format.timestamp(),
        winston.format.colorize(),
        winston.format.simple()
    ),
    transports: [new winston.transports.Console()]
});

Но это приводит к смешению текста и JSON, например:

info: GET /alice?bob {"timestamp":"2018-02-21T02:52:31.452Z"}

Я надеялся поставить перед каждой строкой временную метку и чтобы временная метка печаталась отдельно. Что-то типа:

2018-02-21T02:52:31.452Z info: GET /alice?bob

но приведенные выше комментарии указывают, что это возможно только при использовании старого стиля передачи параметров конструктору Console() .

Какие-либо предложения? Или я неправильно задаю вопрос? То есть в наши дни анализаторы журналов предпочитают JSON? ТИА.

@armadillojim

Используйте формат printf следующим образом:

const { createLogger, format, transports } = require('winston')
const { colorize, combine, timestamp, printf } = format

// Define your custom format with printf.
const myFormat = printf(info => {
  return `${info.timestamp} ${info.level}: ${info.message}`
})

const logger = createLogger({
  format: combine(
    timestamp(),
    colorize(),
    myFormat
  ),
  transports: [new transports.Console()]
})

logger.info('foo') // -> 2018-02-21T03:55:19.236Z info: foo

@ChrisAlderson , вы мужчина, также, если вы хотите отобразить знак, я улучшил ваш ответ:
`
const vsprintf = require('sprintf-js').vsprintf;

const myFormat = printf (информация => ${info.timestamp} ${info.level}: ${vsprintf(info.message, ...(info.splat || []))} )
`

@ChrisAlderson , большое спасибо! Документация не показалась мне ясной по этому поводу. Очень признателен!

Спасибо за помощь людям @ChrisAlderson. Вклад в документацию для улучшения объяснения того, как работают форматы, приветствуется 👍

Примечание: будьте осторожны при использовании временной метки с метаданными, по-видимому, использование обеих функций формата приводит к тому, что временная метка помещается как info.metadata.timestamp вместо info.timestamp.

Если кому-то нужно зарегистрировать дополнительные метаданные, в том числе стек ошибок, приведенный ниже фрагмент кода сделает эту работу (PS: в примере используется простой формат вывода). Вырезанное ниже нацелено на ожидаемый результат @armadillojim (описанный ранее) и представляет собой незначительное улучшение, основанное на ответе @ChrisAlderson .

Как описано @OzzyTheGiant , при использовании метки времени с метаданными доступ к timestamp осуществляется как к свойству metadata , а не к info .

import winston from 'winston';

// Creates the default formatter.
// We deconstruct "metadata" into "timestamp" and "meta", and use them in the default formatter.
const logFormat = winston.format.printf((info) => {
  const { timestamp, ...meta } = info.metadata;
  return `${timestamp} ${info.level}: ${info.message} ${JSON.stringify(meta)}`;
});

// Creates the logger. "padLevels", "colorize" and "padLevels" are optional.
logger = winston.createLogger({
  format: winston.format.combine(
    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    winston.format.padLevels(),
    winston.format.metadata(),
    winston.format.errors({ stack: true }),
    logFormat,
    winston.format.colorize({ all: true })
  ),
  transports: [new winston.transports.Console()],
});



logger.info('Simple log');
logger.info('Logger Info', { logLevel: 'info', colorize: { all: true } });
logger.error('', new Error('Logger error'));

Вывод:

// 2019-05-11 00:20:53 info:     Simple log {}
// 2019-05-11 00:20:53 info:     Logger Info {"logLevel":"info","colorize":{"all":true}}
// 2019-05-11 00:20:53 error:    Logger error {"stack":"Logger error\n    at ...

почему format.timestamp не работает без объявления format.json после format.timestamp ?

Это все еще актуально спустя 2 года.

это работает
format: winston.format.combine( winston.format.timestamp(), winston.format.json() ),

это не
format: winston.format.combine( winston.format.json(), winston.format.timestamp() ),

для записи логов в файл

Была ли эта страница полезной?
0 / 5 - 0 рейтинги