Я последовал примеру из документации и создал регистратор, как показано ниже:
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 должна установить временную метку по умолчанию.
Я даже пытался вернуть пользовательскую метку времени, передав функцию, но даже это не отображается. Возможно, я что-то упустил, но вроде ни один из вариантов не работает, т.е. раскрасить, показать уровень, отметку времени.
Или документация не синхронизирована?
Еще нет обновлений по этому вопросу? Я столкнулся с той же проблемой. Работает на [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()
),
для записи логов в файл
Самый полезный комментарий
@armadillojim
Используйте формат
printf
следующим образом: