-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Console transport does not write to debug console #1544
Comments
Feels like more of a vscode bug -- why does their debug console have props like |
We should address this, but needs more investigation. |
I just ran into this issue and wanted to add my very simple idea: Just use Right now, Winston is checking for console._stderr and console._stdout, preferring to write to those streams directly, but falling back to using What's the upside to using the streams directly in Winston over calling the methods? To me, VS Code does have the corresponding properties (probably because it's running on node), but its default "capture" for the debug console is "console" -- which probably means they've installed hooks specifically on the As others have mentioned, you can change which output VS Code captures, or change what the "console" transport does in Winston. {
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/index.js",
// Capture "std" instead of "console"
"outputCapture": "std"
}
]
} Note, if you follow the linked advice from @adi7ya, VS Code will output the line where |
Checking with VS Code folks to see whether we can make the necessary vsc settings for console transport output capturing the defaults: microsoft/vscode#69959 . Otherwise, the necessary vsc setting changes are linked from my comment there. ^^It's a valid question though, for the console transport, if a bunch of popular editors won't do the "right" thing by default, then maybe we should just change the behavior of the console transport cc @indexzero . |
This also bit me, could not agree more with @victorandree. I'm using this very barebones transport for my own purposes at the moment if anyone else finds it useful: 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()]
}); |
Please check on my proposal solving this in #1836 |
Also ran into this issue, and it does not appear to be VSCode-specific - if I run |
I'm encountering the same issue in WebStorm, this is not a vs-code only bug. |
We just ran into this issue and it took us quite a while to figure out what we did wrong. In our case, this was caused by us passing an invalid log level into Winston (i.e. This probably isn't the root cause of this issue; I'm just posting this here in case it helps anyone. |
change to use integratedTerminal
|
I extended this a bit: /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
/* eslint-disable @typescript-eslint/no-explicit-any */
import { LEVEL } from 'triple-beam';
import Transport from 'winston-transport';
// inspired by https://github.com/winstonjs/winston/issues/1544#issuecomment-499362387
export class SimpleConsoleTransport extends Transport {
private getLogMethod(level: string) {
if (level === 'debug') {
return console.debug;
} else if (level === 'info') {
return console.info;
} else if (level === 'critical' || level === 'error') {
return console.error;
} else if (level === 'warning') {
return console.warn;
} else {
return console.log;
}
}
override log(info: any, callback: any): void {
setImmediate(() => this.emit('logged', info));
const logMethod = this.getLogMethod(info[LEVEL]);
const date = new Date();
if (info.logStack) {
logMethod(
`${date.getHours()}:${date.getMinutes()}`,
info.message,
info.logStack
);
} else {
logMethod(`${date.getHours()}:${date.getMinutes()}`, info.message);
}
if (callback) {
callback();
}
}
} |
"console": "integratedTerminal" ... This did the magic for me... After spending 2 hours. Thank you. |
Thanks, using the same solution! |
Alas, for WebStorm and other JBrains IDEs the 'integratedTerminal' workaround is not available, so it would be really nice to see a fix or a documented workaround for those not using VSC |
Would #1835 / #1836 help for JetBrains etc.? I haven't looked at this issue since 2019, but scrolling up through the thread, it looks like that PR / proposal could help? I'm open to other ideas that would make the built-in stuff in Winston easier for everyone to use (without compromising performance or breaking backward compatibility, ideally). |
Yeah, both of those would help for the built-in Chrome/Node debugger and presumable JetBrains. I'd favor an intentional split like #1836 proposes (which is almost what choosing to use or not use the SimpleConsoleTransport above does, if I'm remembering correctly), as the current behavior (writing to stdout, but not the console in debuggers) allows attaching a debugger to a busy production server without overloading the debugger with thousands of log messages a second. |
IMO the correct behavior would be to output to stderr only, while also outputting to the debug console. The reason it works with the global |
I've opened a PR with a very simple fix that should resolve this, try it out. |
I'm not a maintainer, but making an explicit split sounds better than always writing to both to me. Probably always writing to both is slightly better (at least, for a default behavior, it's what people would expect) than how it is now, however writing to both is a potentially light breaking change for anyone who attaches an Inspector to busy services (e.g. to do profiling of heavy-load production servers), as funneling large amounts of log traffic to Inspector causes it crash/disconnect in my experience (presumably can't send it over the WebSocket link as quickly as it's generating new messages). |
Does inspector not let you disable logs? There's also a stream transport that people can use if they wish to log to stdout or stderr only. |
You can disable displaying logs, but that doesn't stop them from being sent, I think. An explicitly separate for transport (or option/behavior) for stdio and console is exactly what was proposed though, I think =). Anyway, some improvement here sounds great (might just not have to be in a patch/minor version, as it's got behavioral side effects people might need to deal with). |
This was addressed with the |
Per the above, closing this since #2276 was released in winston |
Please tell us about your environment:
winston
version?winston@2
winston@3
node -v
outputs: v10.1.0What is the problem?
When I use the built in Console transport, it will write to console when running normally (eg
node ./dist/index.js
) but not to the debug console when I debug from Visual Studio Code. Standard calls to console.log()/warn()/error() do write to the debug console.What do you expect to happen instead?
I expect all messages to write to the debug console as they would to the standard console when running normally.
Other information
The problem seems to be the use of _stderr.write() and _stdout.write() in the log() method of the transport implementation. If I replace the condition in the if statements at 49, 62 and 77 with
false
so that the standard console.log()/warn()/error() functions get called, the output does reach the console output. Obviously an undesirable side-effect is that the custom eol gets ignored.The text was updated successfully, but these errors were encountered: