Winston: O registro do console não é colorido.

Criado em 10 nov. 2017  ·  22Comentários  ·  Fonte: winstonjs/winston

Estou tentando colorir a saída do console e não está funcionando. A saída é toda a mesma cor (branca). Estou no 3.0.0-rc1.

const winston = require('winston');
const logLevels = {
  levels: {
    error: 0,
    warn: 1,
    info: 2,
    http: 3,
    sql: 4,
    debug: 5
  },
  colors: {
    error: "red",
    warn: "darkred",
    info: "black",
    http: "green",
    sql: "blue",
    debug: "gray"
  }
};
winston.addColors(logLevels);
const logger = winston.createLogger({...});
logger.add(new winston.transports.Console({colorize: true}));

Eu também tentei a sugestão aqui, mas isso também não está funcionando:

logger.add(new winston.transports.Console({format: winston.format.combine(formatter, winston.format.colorize())}));

Obrigado,
Álvaro

Comentários muito úteis

Consegui fazê-lo funcionar parcialmente usando a documentação do logform .

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf(info => `${info.timestamp} [${info.level}]: ${info.message}`),
  );

Não tenho certeza de como lidar com o despejo dos argumentos JSON.

Atualizando aqui está o que eu resolvi:

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf((info) => {
      const {
        timestamp, level, message, ...args
      } = info;

      const ts = timestamp.slice(0, 19).replace('T', ' ');
      return `${ts} [${level}]: ${message} ${Object.keys(args).length ? JSON.stringify(args, null, 2) : ''}`;
    }),
  );

screen shot 2017-11-13 at 10 55 05 am

Todos 22 comentários

Consegui fazê-lo funcionar parcialmente usando a documentação do logform .

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf(info => `${info.timestamp} [${info.level}]: ${info.message}`),
  );

Não tenho certeza de como lidar com o despejo dos argumentos JSON.

Atualizando aqui está o que eu resolvi:

  const alignedWithColorsAndTime = winston.format.combine(
    winston.format.colorize(),
    winston.format.timestamp(),
    winston.format.align(),
    winston.format.printf((info) => {
      const {
        timestamp, level, message, ...args
      } = info;

      const ts = timestamp.slice(0, 19).replace('T', ' ');
      return `${ts} [${level}]: ${message} ${Object.keys(args).length ? JSON.stringify(args, null, 2) : ''}`;
    }),
  );

screen shot 2017-11-13 at 10 55 05 am

Depois de duas horas consegui fazer as cores funcionarem, obrigado @Xeoncross !

comecei winston e também consegui console sem cores...
eu estava usando o próximo código de definição de transporte:

new winston.transports.Console({
  format: winston.format.simple()
})

depois de ler este tópico fiz assim:

new winston.transports.Console({
  format: winston.format.combine(
            winston.format.simple(),
            winston.format.colorize()
          )
})

e não tem diferença.
então eu mudei a posição do formato colorize para 1º e fiz as cores funcionarem

new winston.transports.Console({
  format: winston.format.combine(
            winston.format.colorize(),
            winston.format.simple()
          )
})

Obrigado @abrakadobr ! isso deu certo.

nada aqui funcionou para mim, ainda sem cores, e mudar a cor para o topo fez com que o campo de informações registrasse strings codificadas

Eu criei uma essência que mostra como usar o log de winston & morgan em um aplicativo expressjs simples.

Obrigado @Xeoncross! Adicionar winston.format.colorize() ao meu formato funcionou. Interessante que isso não está nos documentos. Ou pelo menos não consegui encontrá-lo nos documentos.

Adoro a nova flexibilidade, mas espero que obtenha uma documentação melhor. Eu só gastei muito tempo fazendo isso funcionar. Um exemplo plug-n-play para aqueles de nós que estavam usando winston.cli() iria longe, algo semelhante ao exemplo do @Xeoncross.

Alguém sabe como fazer isso com a versão de lançamento atual? Uma versão de release candidate não é uma opção.

Na leitura do código você também pode enviar all para o colorize como opção para colorir todo o log.

colorize({ all: true })

@markhealey Eu já removi a dependência winston do meu package.json e então li sua mensagem. Obrigado :+1:

Obrigado @Xeoncross. Dê uma olhada em: https://github.com/winstonjs/logform/blob/master/timestamp.js . Você pode formatar o carimbo de data/hora com o parâmetro de opção format . Mas tenha cuidado com o fuso horário

format.combine(
    format.colorize(),
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.align(),
    format.printf(info => {
        const { timestamp, level, message, ...extra } = info;

        return `${timestamp} [${level}]: ${message} ${
            Object.keys(extra).length ? JSON.stringify(extra, null, 2) : ''
        }`;
    }),
)

format.colorize({all:true} realmente não funciona se o timestamp estiver incluído, aqui está um exemplo de trabalho para colorir a linha inteira:

const colorizer = winston.format.colorize();

const logger = winston.createLogger({
  level: 'debug',
  format: combine(
    winston.format.timestamp(),
    winston.format.simple(),
    winston.format.printf(msg => 
      colorizer.colorize(msg.level, `${msg.timestamp} - ${msg.level}: ${msg.message}`)
    )
  ),
  transports: [
    new transports.Console(),
  ]

});

verifique meu registrador completo

Obrigado @abrakadobr , sua solução funcionou para mim.

@tommuhm vejo o defeito agora. Não há uma opção de formato embutida para colorize se alguém realmente quiser colorir todo o printf . Isso faz sentido para você?

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

const logger = createLogger({
  level: 'debug',
  format: format.combine(
    format.timestamp(),
    format.simple(),
    format.printf(info => `${info.timestamp} - ${info.level}: ${info.message}`),
    format.colorize({ all: true })
  ),
  transports: [
    new transports.Console(),
  ]
});

logger.error('wowza');

A parte complicada é ter o colorizer conhecido quando um info foi "serializado" (ou seja, quando info[MESSAGE] foi definido como uma string). PR de acompanhamento para logform breve - obrigado por cavar através dele!

@Xeoncross também podemos conseguir o mesmo de uma maneira muito mais simples

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

const level = process.env.LOG_LEVEL || 'debug';

const myFormat = printf(({ level, message, label, timestamp }) => {
    return `${timestamp} ${level}: ${message}`;
});

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

referência: https://www.npmjs.com/package/winston#using -custom-logging-levels

estou usando o winston para fazer login no cloudwatch e tentar adicionar cores, mas em vez de aparecerem símbolos de cores .. Eu tento todas as soluções mencionadas acima. abaixo está meu código

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

const colorizer = winston.format.colorize();


const logger = createLogger({
    level:  process.env.LOG_LEVEL,
    prettyPrint : true,
    format: combine(
        winston.format.timestamp(),
        winston.format.simple(),
        winston.format.printf(msg =>
            colorizer.colorize(msg.level, `${msg.timestamp} - ${msg.level}: ${msg.message}`)
        )
    ),
    transports: [
        new transports.Console()
    ]
});

module.exports = {logger};

e na saída do console do cloudwatch é

[34m2019-08-22T13:00:03.325Z - debug: res by id: [
{
    "isActive": true,
    "value": "fNUMheWiwXayKsaYCbUeA7Gg7BtEPIUbakB56XH1",
    "id": "oehlwqlcve",
    "userId": "6b347b41-ddef-4842-83a0-1cd5ca358482"
}
][39m

este [39m aparece em vez de cor. Alguma sugestão?

-22T13:00:03.325Z - debug: res por id: [

Estou com o mesmo problema também. Você conseguiu consertar?

-22T13:00:03.325Z - debug: res por id: [

Estou com o mesmo problema também. Você conseguiu consertar?

Alguma atualização sobre isso? Você resolveu de alguma forma?

@Xeoncross também podemos conseguir o mesmo de uma maneira muito mais simples

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

const level = process.env.LOG_LEVEL || 'debug';

const myFormat = printf(({ level, message, label, timestamp }) => {
  return `${timestamp} ${level}: ${message}`;
});

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

referência: https://www.npmjs.com/package/winston#using -custom-logging-levels

Isso fez o truque para mim no iTerm no MacOS

Esta página foi útil?
0 / 5 - 0 avaliações