winston
versión? _winston@2
winston@3
node -v
salidas: v10.1.0Cuando 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.
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.
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.
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.
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.
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
yconsole.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
yconsole.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 objetoconsole
, no "consola" en general o como un proxy para transmisiones. ¿No funcionarían siempre los métodos? Especialmente porque hay un transportestream
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 archivoComo han mencionado otros, puede cambiar qué salida captura VS Code, o cambiar lo que hace el transporte de "consola" en Winston.
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 sulog
anulado. Entonces, podría ser solo marginalmente útil ...