es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo colorear partes del mensaje de registro en winstonJs

Tengo el siguiente código:

const {
    colorize,
    combine,
    json,
    printf,
    simple,
    timestamp,
    errors,
    metadata
} = winston.format;

private readonly consoleLogger = new winston.transports.Console({
    format: combine(
        errors({ stack: true }),
        metadata(),
        timestamp(),
        colorize({ all: true }),
        simple(),
        printf((info) => {
            const { level, message } = info;

            if (info?.metadata?.stackTrace) {
                return `[${level}] ${message}\r\n${info.metadata.stackTrace}`;
            }
            return `[${level}] ${message}`;
        })
    )
});

Según la documentación y los ejemplos, parece que colorize cambiará el color de toda la línea. Me preguntaba cómo puedo dar diferentes colores a diferentes partes de la cadena, por ejemplo, en mi código quiero que el timestamp, el nivel y el mensaje tengan diferentes colores como se muestra en la imagen a continuación:

Imagen

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para colorear diferentes partes de la línea de registro utilizando winston, puedes modificar la función printf para que devuelva una cadena con códigos de color ANSI aplicados a partes específicas. Aquí tienes un ejemplo de cómo podrías modificar la función printf para lograr la salida deseada:

    const { colorize, combine, json, printf, simple, timestamp, errors, metadata } = winston.format;
    
    const consoleLogger = new winston.transports.Console({
      format: combine(
        errors({ stack: true }),
        metadata(),
        timestamp(),
        printf((info) => {
          const { level, message, timestamp } = info;
    
          // Define colors for different parts
          const colors = {
            timestamp: '\x1b[33m', // Amarillo
            level: (lvl) => {
              switch (lvl) {
                case 'error':
                  return '\x1b[31m'; // Rojo
                case 'warn':
                  return '\x1b[33m'; // Amarillo
                case 'info':
                  return '\x1b[36m'; // Cian
                case 'debug':
                  return '\x1b[35m'; // Magenta
                default:
                  return '\x1b[0m'; // Restablecer a color predeterminado
              }
            },
            message: '\x1b[0m', // Restablecer a color predeterminado
          };
    
          // Aplicar colores a las partes de la línea de registro
          return `${colors.timestamp}[${timestamp}]${colors.message} ${colors.level(level)}${level}${colors.message}: ${message}`;
        })
      ),
    });
    

    En esta versión modificada del código, definimos un objeto colors que asigna a cada parte de la línea de registro (timestamp, level y message) un color utilizando códigos de escape ANSI. Ten en cuenta que estamos utilizando una función para definir el color de la parte level, ya que depende del nivel de registro real.

    En la función printf, luego utilizamos la concatenación de cadenas para crear una cadena de registro formateada con cada parte coloreada en consecuencia. Estamos utilizando literales de plantilla para interpolar los valores de timestamp, level y message, y aplicando el color correspondiente del objeto colors mediante plantillas de cadenas.

    Esto debería darte la salida deseada, con cada parte de la línea de registro coloreada de manera diferente.

Comments are closed.