Формат журнала Winston

Я использую Winston ^3.0.0-rc6, как показано ниже:

var options = {
file: {
    level: 'info',
    filename: `${appRoot}/logs/app.log`,
    handleExceptions: true,
    json: true,
    prettyPrint: true,
    maxsize: 5242880, // 5MB
    maxFiles: 5,
    colorize: true,

}}
const jsonFormatter = (logEntry) => {

if (logEntry.type) {
    const base = {
        timestamp: new Date()
    };
    const json = Object.assign(base, logEntry);
    logEntry[MESSAGE] = JSON.stringify(json);
} else {
    logEntry = "";
}

return logEntry;}
const logger = winston.createLogger({

format: winston.format(jsonFormatter)(),

transports: [

    new winston.transports.File(options.file)

],
exceptionHandlers: [
    new winston.transports.File(options.uncaughtExceptions)
]});

мой вывод журнала:

{"timestamp":"2018-06-10T07:41:03.387Z","type":"Authentication","status":"failed","level":"error","message":"Incorrect password"}

но я хочу, чтобы они были такими:

{
    "timestamp": "2018-06-10T07:41:03.387Z",
    "type": "Authentication",
    "status": "failed",
    "level": "error",
    "message": "Incorrect password"
}

Я пытался поиграть с JSON: правда, и PrettyPrint, но это не сработало.

Может ли кто-нибудь помочь, пожалуйста

Благодарю.

2 ответа

Решение

Я заметил в вашем коде, что на линии

logEntry[MESSAGE] = JSON.stringify(json);

вы используете JSON.stringify() который принимает еще два необязательных аргумента

JSON.stringify(value[, replacer[, space]])

Если вы установите space на количество мест, которые вы хотите, вы получите результат, который вы ищете. Поэтому измените начальную строку на:

logEntry[MESSAGE] = JSON.stringify(json, null, 2);  // or 4 ;)

(The replacer аргумент null потому что мы не хотим менять поведение по умолчанию.)

Это устарело: вы можете проверить ссылку здесь.

Я пытался поиграть с json: true и prettyPrint, но это не сработало.

Простой код, как эта работа для вас:

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    //
    // - Write to all logs with level `info` and below to `combined.log` 
    // - Write all logs error (and below) to `error.log`.
    //
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

Если это не работает, дайте мне знать, чтобы я мог импровизировать.

Другие вопросы по тегам