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
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.
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) : ''}`;
}),
);
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
O link abaixo funcionou para mim:
https://stackoverflow.com/questions/51012150/winston-3-0-colorize-whole-output-on-console
Comentários muito úteis
Consegui fazê-lo funcionar parcialmente usando a documentação do logform .
Não tenho certeza de como lidar com o despejo dos argumentos JSON.
Atualizando aqui está o que eu resolvi: