-
Notifications
You must be signed in to change notification settings - Fork 47
Description
I have a lib, that uses winston for logging, which I want to use inside my cloud function and integrate its logging with Cloud Logging. So inside the lib I check whether it's running in Cloud and if so I create a winston logger with LoggingWinston transport:
export function createLogger() {
if (process.env.K_SERVICE) {
// we're in Google Cloud (Run/Functions)
return createCloudLogger();
} else {
return createConsoleLogger();
}
}
where createCloudLogger is:
export function createCloudLogger() {
const cloudLogger = winston.createLogger({
level: LOG_LEVEL,
format: format.combine(
format((info) => {
info.trace = process.env.TRACE_ID;
info[LOGGING_TRACE_KEY] = process.env.TRACE_ID;
return info;
})(),
),
defaultMeta: getDefaultMetadataForTracing(),
transports: [
new LoggingWinston({
projectId: process.env.GCP_PROJECT,
labels: {
component: <string>process.env.LOG_COMPONENT,
},
logName: "mylog",
resource: {
labels: {
function_name: <string>process.env.K_SERVICE,
},
type: "cloud_function",
},
useMessageField: false,
redirectToStdout: false,
}),
],
});
return cloudLogger;
}
Please note I specify redirectToStdout: false.
It worked fine in general but recently I've noticed that in logs there're a lot of entries like this:
DEFAULT 2023-04-17T11:03:56.398817Z Exception from a finished function: Error: Total timeout of API google.logging.v2.LoggingServiceV2 exceeded 60000 milliseconds before any response was received.
and sometime they are even turned into error:
Error: Total timeout of API google.logging.v2.LoggingServiceV2 exceeded 60000 milliseconds before any response was received.
at repeat (/workspace/node_modules/google-gax/build/src/normalCalls/retries.js:66:31)
at Timeout._onTimeout (/workspace/node_modules/google-gax/build/src/normalCalls/retries.js:101:25)
at listOnTimeout (node:internal/timers:559:17)
at processTimers (node:internal/timers:502:7)
in the related bug googleapis/nodejs-logging#1185 it's suggested to turn on stdout writing.
So I changed redirectToStdout to true.
Unfortunately the result isn't the same.
Here's a log entry with redirectToStdout: false:

Here's a log entry with redirectToStdout: true:

there are very similar but redirectToStdout: true resource.labels.function_name goes to jsonPayload instead of to the root object as with redirectToStdout: false. Which results in missing label (chip) with function name on the log entry.