Winston: El transporte de la consola no escribe en la consola de depuración

Creado en 6 dic. 2018  ·  9Comentarios  ·  Fuente: winstonjs/winston

Háblenos de su entorno:

  • _ winston versión? _

    • [] winston@2

    • [x] winston@3

  • _ node -v salidas: v10.1.0
  • _Sistema operativo? _ Windows
  • _Idioma? _ TypeScript

¿Cuál es el problema?

Cuando uso el transporte de consola integrado, escribirá en la consola cuando se ejecute normalmente (por ejemplo, node ./dist/index.js ) pero no en la consola de depuración cuando depuro desde Visual Studio Code. Las llamadas estándar a console.log () / warn () / error () escriben en la consola de depuración.

¿Qué esperas que suceda en su lugar?

Espero que todos los mensajes se escriban en la consola de depuración como lo harían en la consola estándar cuando se ejecuta normalmente.

Otra información

El problema parece ser el uso de _stderr.write () y _stdout.write () en el método log () de la implementación de transporte. Si reemplazo la condición en las declaraciones if en 49, 62 y 77 con false para que se llamen a las funciones estándar console.log () / warn () / error (), la salida llega a la salida de la consola . Obviamente, un efecto secundario indeseable es que se ignora el eol personalizado.

bug help wanted important

Comentario más útil

Me acabo de encontrar con este problema y quería agregar mi idea muy simple: simplemente use console.log , console.warn y console.error 😄

En este momento, Winston está buscando [console._stderr] y [console._stdout], prefiriendo escribir en esas transmisiones directamente, pero recurriendo a console.warn , console.error y console.log si no está disponible. Estas propiedades ( _stderr y _stdout ) están disponibles en la instancia de la consola global en node.js, sin embargo, no están documentadas como parte de la API de [consola] ni son enumerables .

¿Cuál es la ventaja de usar las transmisiones directamente en Winston en lugar de llamar a los métodos? Para mí, console en un contexto de Javascript significa específicamente el objeto console , no "consola" en general o como un proxy para transmisiones. ¿No funcionarían siempre los métodos? Especialmente porque hay un transporte stream incorporado en Winston, interpretaría "consola" como apropiado para el desarrollo básicamente local.

VS Code _tiene_ las propiedades correspondientes (probablemente porque se está ejecutando en el nodo), pero su "captura" predeterminada para la consola de depuración es "consola", lo que probablemente significa que han instalado enlaces específicamente en las llamadas console.log , no en los propios arroyos. Es decir, VS Code genera salida, pero no la captura. Probablemente esté relacionado con este archivo

Como han mencionado otros, puede cambiar qué salida captura VS Code, o cambiar lo que hace el transporte de "consola" en Winston.

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${workspaceFolder}/index.js",
      // Capture "std" instead of "console"
      "outputCapture": "std"
    }
  ]
}

Tenga en cuenta que si sigue el consejo vinculado de @ adi7ya , VS Code generará la línea donde se llamó console.log , que no es donde llamó a Winston, sino la línea en su log anulado. Entonces, podría ser solo marginalmente útil ...

Todos 9 comentarios

Se siente más como un error de vscode: ¿por qué su consola de depuración tiene accesorios como _stdout si no podemos escribir con éxito de esa manera? Por supuesto, podría tener un transporte modificado como su solución alternativa que funcione para vscode, pero puede que no sea lo ideal. Si cree que esto es algo que debe arreglarse en winston, siéntase libre de ofrecer alguna idea :) Pero no creo que winston deba verificar si se está ejecutando en vscode, más bien parece que la consola de vscode debería comportarse mejor.

@sirockin ¿Está desarrollando una extensión de vscode? Encontré este problema similar en vsode. De todos modos, puede anular el método de registro para el transporte de la consola para que funcione.

Deberíamos abordar esto, pero necesita más investigación.

Me acabo de encontrar con este problema y quería agregar mi idea muy simple: simplemente use console.log , console.warn y console.error 😄

En este momento, Winston está buscando [console._stderr] y [console._stdout], prefiriendo escribir en esas transmisiones directamente, pero recurriendo a console.warn , console.error y console.log si no está disponible. Estas propiedades ( _stderr y _stdout ) están disponibles en la instancia de la consola global en node.js, sin embargo, no están documentadas como parte de la API de [consola] ni son enumerables .

¿Cuál es la ventaja de usar las transmisiones directamente en Winston en lugar de llamar a los métodos? Para mí, console en un contexto de Javascript significa específicamente el objeto console , no "consola" en general o como un proxy para transmisiones. ¿No funcionarían siempre los métodos? Especialmente porque hay un transporte stream incorporado en Winston, interpretaría "consola" como apropiado para el desarrollo básicamente local.

VS Code _tiene_ las propiedades correspondientes (probablemente porque se está ejecutando en el nodo), pero su "captura" predeterminada para la consola de depuración es "consola", lo que probablemente significa que han instalado enlaces específicamente en las llamadas console.log , no en los propios arroyos. Es decir, VS Code genera salida, pero no la captura. Probablemente esté relacionado con este archivo

Como han mencionado otros, puede cambiar qué salida captura VS Code, o cambiar lo que hace el transporte de "consola" en Winston.

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${workspaceFolder}/index.js",
      // Capture "std" instead of "console"
      "outputCapture": "std"
    }
  ]
}

Tenga en cuenta que si sigue el consejo vinculado de @ adi7ya , VS Code generará la línea donde se llamó console.log , que no es donde llamó a Winston, sino la línea en su log anulado. Entonces, podría ser solo marginalmente útil ...

Verificando con la gente de VS Code para ver si podemos realizar la configuración vsc necesaria para la salida de transporte de la consola que captura los valores predeterminados: https://github.com/Microsoft/vscode/issues/69959 . De lo contrario, los cambios necesarios en la configuración de vsc están vinculados desde mi comentario allí. ^^ Sin embargo, es una pregunta válida, para el transporte de la consola, si un grupo de editores populares no hacen lo "correcto" por defecto, entonces tal vez deberíamos cambiar el comportamiento del transporte de la consola cc @indexzero .

Esto también me mordió, no podría estar más de acuerdo con @victorandree.

Estoy usando este transporte muy básico para mis propios fines en este momento si alguien más lo encuentra útil:

import winston from "winston";
import Transport from "winston-transport";

const { MESSAGE } = require("triple-beam");
const level = process.env.LOG_LEVEL || "info";

class SimpleConsoleTransport extends Transport {
  log = (info: any, callback: any) => {
    setImmediate(() => this.emit("logged", info));

    console.log(info[MESSAGE]);

    if (callback) {
      callback();
    }
  };
}

export const logger = winston.createLogger({
  level,
  defaultMeta: {},
  transports: [new SimpleConsoleTransport()]
});

Por favor revise mi propuesta resolviendo esto en # 1836

También encontré este problema, y ​​no parece ser específico de VSCode: si ejecuto node --inspect y luego lo adjunto desde Chrome con chrome://inspect , solo veo llamadas a console.log/etc y nada que vaya al transporte de la consola.

¿Fue útil esta página
0 / 5 - 0 calificaciones