-
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
Request: Functions in Default Metadata #1626
Comments
I was thinking that this could be implemented similar to redux thunks. Instead of having a function-valued property in const logger = createLogger({
defaultMeta: () => {
// Function to be evaluated every time a log is written.
return {
timeWritten: Date.now();
// ..
}
}
// ...
}); |
I have found a workaround that can be used until the proposed solution would be implemented - use getters:
UPD: fixed the bug mentioned by @mooski |
@kjin If I'm understanding this issue correctly it appears that this is a feature request. Is that correct? Edit: Ignore me - didn't pay attention to issue title 😩 |
I still think that winston needs some code changes to support this feature properly, even with using the The getters are captured/realized at different places depending on the codepath. This is important because the callstack is something that a logger might want to log & the frames are inconsistent. I've fixed this in our fork by replacing Object.assign with the following function:
|
@Alexsey solution is clever, but my use case is slightly special with New Relic and APM. First, I notice it will forward the log before winston's format is called, decorating and adding more data to it using it's agent. I use Then I followed @Alexsey suggestion to add the request_id to the So it get's called, but at that moment the context is lost =/.
|
The underlying issue here is somewhat complex so I'll summarize what we're asking for up here -- we would be interested in seeing the ability for
defaultMetadata
to include dynamically generated values by providing a function as a field. For example:For a full justification see below.
Please tell us about your environment:
winston
version?winston@2
winston@3
node -v
outputs: v10.15.2What is the problem?
As authors of the Stackdriver Logging Transport for Winston, we would like to support log-request correlation. The
async_hooks
module gives us the ability to store request-specific information such as a request ID. However, we don't have a means of reliably retrieving it on theTransport
side.The problem is best described by example. The following code produces this output when ~100 requests are made in quick succession:
Note the mistmatch in "expected" and "actual" request IDs. If we are the author of
MyTransport
, we would have no way of accurately getting the correct request ID by consulting the current execution ID ("actual"). Instead, we must rely on the user passing in the correct request ID as metadata ("expected"). This is because Winston 3 batches logs (viareadable-stream
) when a Transport defers its invocation of itslog
callback.The problem is that we don't want to rely on users passing in a request ID for us; we want it to happen automatically. After all, users would probably want to just write
and leave to rest up to us.
What do you expect to happen instead?
The expected and actual request IDs (from the linked output) match up.
Other information
It's infeasible to fix the code so that actual request IDs match up, so a solution to this problem would be to allow users to specify functions as fields on
defaultMetadata
that get invoked when the logger gets called. That way, the code would change to this, which allows users to write their code without any awareness of request ID, with the small caveat that they provide a thunk as adefaultMetadata
field (that maybe our module would provide for them to use).The text was updated successfully, but these errors were encountered: