Как я могу изменить вывод JSON на winston узла в одну строку
Когда я создаю nodejs winston console logger и устанавливаю json:true
, он всегда выводит журналы JSON в многострочном формате. Если я подключу их к файлу и попробую grep этот файл, мои grep-хиты включают только часть строки журнала. Я хочу, чтобы winston выводил мои строки журнала в формате JSON, но не для того, чтобы печатать JSON
Вот мой конфиг (coffeescript, извинения):
winston = require 'winston'
logger = new (winston.Logger)(
transports: [
new winston.transports.Console({
json: true
})
]
)
И некоторые результаты выборки:
{
"name": "User4",
"level": "info",
"message": "multi line whyyyyy"
}
Ответы
Ответ 1
Winston 3.x (текущая версия)
Форматтер по умолчанию
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.json(),
transports: [
new winston.transports.Console()
]
});
Пример Example
const test = { t: 'test', array: [1, 2, 3] };
logger.info('your message', test);
// logger output:
// {"t":"test","array":[1,2,3],"level":"info","message":"your message"}
Пользовательский форматер
const winston = require('winston');
const { splat, combine, timestamp, printf } = winston.format;
// meta param is ensured by splat()
const myFormat = printf(({ timestamp, level, message, meta }) => {
return '${timestamp};${level};${message};${meta? JSON.stringify(meta) : ''}';
});
const logger = winston.createLogger({
format: combine(
timestamp(),
splat(),
myFormat
),
transports: [
new winston.transports.Console()
]
});
Пример:
const test = { t: 'test', array: [1, 2, 3] };
// NOTE: wrapping object name in '{...}' ensures that JSON.stringify will never
// return an empty string e.g. if 'test = 0' you won't get any info if
// you pass 'test' instead of '{ test }' to the logger.info(...)
logger.info('your message', { test });
// logger output:
// 2018-09-18T20:21:10.899Z;info;your message;{"test": {"t":"test","array":[1,2,3]}}
winston 2.x (устаревшая версия)
Похоже, принятый ответ устарел. Вот как это сделать для текущей версии Winston (2.3.1):
var winston = require('winston');
var logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
json: true,
stringify: (obj) => JSON.stringify(obj),
})
]
})
Обратите внимание на круглые скобки вокруг winston.transports.Console
.
Ответ 2
Транзакции winston предоставляют способ переопределить метод stringify, поэтому, изменив конфигурацию выше, я получил однострочный вывод JSON.
Новая конфигурация:
winston = require('winston')
logger = new (winston.Logger)({
transports: [
new winston.transports.Console({
json: true,
stringify: (obj) => JSON.stringify(obj)
})
]
})
Ответ 3
"winston": "^3.0.0"
function createAppLogger() {
const { combine, timestamp, printf, colorize } = format;
return createLogger({
level: 'info',
format: combine(
colorize(),
timestamp(),
printf(info => {
return '${info.timestamp} [${info.level}] : ${JSON.stringify(info.message)}';
})
),
transports: [new transports.Console()]
});
}
Вывод:
2018-08-11T13:13:37.554Z [info]: {"data":{"hello":"Hello, World"}}
Ответ 4
winston.format.printf(
info => '${info.timestamp} ${info.level}: ${JSON.stringify(info.message, null, 2)}'))
довольно распечатает объект json
Ответ 5
На "winston": "^3.2.1"
Это прекрасно работает для меня
const {createLogger, format} = require('winston');
// instantiate a new Winston Logger with the settings defined above
var logger = createLogger({
format: format.combine(
format.timestamp(),
// format.timestamp({format:'MM/DD/YYYY hh:mm:ss.SSS'}),
format.json(),
format.printf(info => {
return '${info.timestamp} [${info.level}] : ${info.message}';
})
),
transports: [
new winston.transports.File(options.file),
new winston.transports.Console(options.console)
],
exitOnError: false, // do not exit on handled exceptions
});