Keep source(file:line) remain the same when methodFactory is been called.
Closed this issue · 4 comments
Not sure if it is a bug.. but wondering if there is a solution:
You can see the difference on the right side that the [file:line_number] has been changed. Is there anyway to remain the [file:line_number] as it invoked?
The code I have implemented is pasted below :)
Thanks!
const originalFactory = log.methodFactory;
log.methodFactory = (methodName, level, loggerName) => {
const rawMethod = originalFactory(methodName, level, loggerName);
return function (message) {
// rawMethod.apply(`${colors.blue(String(loggerName))}: ${message}`);
rawMethod(`${colors.blue(String(loggerName))}: ${message}`);
};
};
In general this isn't possible, see the docs for a little more explanation.
In your specific case, you might be in luck though. You can't avoid this if you wrap the logging functions, as you've done here, but you can if you bind()
your extra arguments in. For a message prefix like you're using, you can do that with something like:
return rawMethod.bind(console, colors.blue(String(loggerName)))
That will pass colors.blue(String(loggerName))
as an implicit first argument on all calls, making log.warn("msg")
equivalent to console.warn(colors.blue(String(loggerName)), "msg")
. Does that work for you?
(Sorry, posted half-finished and closed this by accident!)
Thanks for the quick response! When I tried your solution, the log is not shown in the console.
import log from 'loglevel';
const originalFactory = log.methodFactory;
log.methodFactory = (methodName, level, loggerName) => {
const rawMethod = originalFactory(methodName, level, loggerName);
return function (message) {
// rawMethod.apply(`${colors.blue(String(loggerName))}: ${message}`);
return rawMethod.bind(
console,
`${colors.blue(String(loggerName))}: ${message}`,
);
};
};
if (IS_DEV) {
log.setLevel('debug');
} else {
log.setLevel('info');
}
Ah, no - bind
returns a changed function, which means that you don't need the wrapper function any more. The full example should look like this:
import log from 'loglevel';
const originalFactory = log.methodFactory;
log.methodFactory = (methodName, level, loggerName) => {
const rawMethod = originalFactory(methodName, level, loggerName);
return rawMethod.bind(
console,
colors.blue(String(loggerName))
);
};
if (IS_DEV) {
log.setLevel('debug');
} else {
log.setLevel('info');
}
The only way to ensure your wrapper's code doesn't appear as the source of the logging is to remove the wrapper entirely.
Nice! It works!!! Deeply appreciate your help!