Как напечатать error.stack с правильным отступом, без символа новой строки - PullRequest
0 голосов
/ 07 мая 2019

Вот мой журнал, напечатанный console.log.

2019-05-07T07:28:44.246Z[error]: {
  "message": "Unexpected end of JSON input",
  "service": "better-logging",
  "timestamp": "2019-05-07T07:28:44.246Z",
  "stack": "SyntaxError: Unexpected end of JSON input\n    at JSON.parse (<anonymous>)\n    at Object.findById (/Users/ldu020/workspace/github.com/mrdulin/nodejs-gcp/src/stackdriver/better-logging/logger.spec.js:18:12)\n    at Object.findById (/Users/ldu020/workspace/github.com/mrdulin/nodejs-gcp/src/stackdriver/better-logging/logger.spec.js:8:15)\n    at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/nodejs-gcp/src/stackdriver/better-logging/logger.spec.js:27:15)\n    at Module._compile (module.js:652:30)\n    at Object.Module._extensions..js (module.js:663:10)\n    at Module.load (module.js:565:32)\n    at tryModuleLoad (module.js:505:12)\n    at Function.Module._load (module.js:497:3)\n    at Function.Module.runMain (module.js:693:10)"
}

Как видите, значение поля stack содержит много символов новой строки \n

Я хочу напечатать stack с правильным отступом:

"SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at Object.findById (/Users/ldu020/workspace/github.com/mrdulin/nodejs-gcp/src/stackdriver/better-logging/logger.spec.js:18:12)
    at Object.findById (/Users/ldu020/workspace/github.com/mrdulin/nodejs-gcp/src/stackdriver/better-logging/logger.spec.js:8:15)
    at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/nodejs-gcp/src/stackdriver/better-logging/logger.spec.js:27:15)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)"

Странно, что я копирую строку в console браузера Chrome, тогда формат правильный.

ПРИМЕЧАНИЕ: Выходные данные уже напечатаны console.logметод.И я не могу позвонить console.log снова.Я могу получить значение stack, поэтому мне нужен код для обработки строки.

Обновление:

Я использую winston модуль логгера.Вот мой конфиг:

const printf = format.printf((info) => {
    const { level, ...rest } = info;
    let log;
    if (rest.stack) {
      //rest.stack = rest.stack.split('\n').map((line) => {
       // return line.trim();
      //});
      log = rest;
    }
    log = JSON.stringify(rest, null, 2);
    return `${info.timestamp}[${info.level}]: ${log}`;
  });
  transports = [
    new winston.transports.Console({
      format: format.combine(format.colorize(), format.timestamp(), format.errors({ stack: true }), printf)
    })
  ];

Ответы [ 3 ]

0 голосов
/ 07 мая 2019

Вот мое решение, потому что я звоню JSON.stringify(error), поэтому есть много символов новой строки \n.Теперь мне просто нужно console.log(stack).

const printf = format.printf((info) => {
    const { level, ...rest } = info;
    let log;
    if (rest.stack) {
      const { stack, ...others } = rest;
      log =
        `${info.timestamp}[${info.level}]: ${JSON.stringify(others, null, 2)}\n` +
        `${info.timestamp}[${info.level}]: ${stack}`;
    } else {
      log = `${info.timestamp}[${info.level}]: ${JSON.stringify(rest, null, 2)}`;
    }
    return log;
  });
  transports = [
    new winston.transports.Console({
      format: format.combine(format.colorize(), format.timestamp(), format.errors({ stack: true }), printf)
    })
  ];

И, вывод для журналов ошибок.

enter image description here

0 голосов
/ 07 мая 2019

Взгляните на эту статью, в частности, на раздел, где упоминается console.group()
Я думаю, это то, что вы ищете.

https://blog.teamtreehouse.com/mastering-developer-tools-console#attachment_22938

0 голосов
/ 07 мая 2019

Это потому, что вы строковый объект err, вы можете заменить все '\ n' с измененным анализом строки, используя String.prototype.replace

    const printf = format.printf((info) => {
    const { level, ...rest } = info;
    let log;
    if (rest.stack) {
      //rest.stack = rest.stack.split('\n').map((line) => {
       // return line.trim();
      //});
      log = rest;
    }
    log = JSON.stringify(rest, null, 2).replace(/\\n/g, '\n');
    return `${info.timestamp}[${info.level}]: ${log}`;
  });
  transports = [
    new winston.transports.Console({
      format: format.combine(format.colorize(), format.timestamp(), format.errors({ stack: true }), printf)
    })
  ];

Например, см. Нижефрагменты

try {
	JSON.parse('\"');
} catch(err) {
	err.stacks = err.stack;
	console.log(JSON.stringify(err))
}

try {
	JSON.parse('\"');
} catch(err) {
	err.stacks = err.stack;
	console.log(JSON.stringify(err).replace(/\\n/g, '\n'))
}
...