Doesn't work as described in README: `log.logSync(logName).write(log.entry(metadata, payload))`
See original GitHub issueThe behavior of log.logSync(logName).write(log.entry(metadata, payload))
doesn’t match what’s described in the README.
Environment details
- OS: Google App Engine Standard Environment for Node.js
- Node.js version: 16
- npm version: 8.3.1
@google-cloud/logging
version: 9.8.3
I’ve created a reproduction at https://github.com/chriscalo/logsync-bug and copied the full details here:
Steps:
- Deploy to App Engine Standard environment:
gcloud app deploy app.yaml --project=<PROJECT_ID>
- Go to console.cloud.google.com/logs/ to view output
Expected:
Here are the first two calls to log.write()
in index.js
:
const metadata = {
resource: {
type: "gae_app",
labels: {
module_id: process.env.GAE_SERVICE,
version_id: process.env.GAE_VERSION,
},
},
};
log.write(log.entry(metadata, "A text payload"));
log.write(log.entry(metadata, { message: "A JSON payload" }));
The expected output is something like: (irrelevant details removed)
[
{
"textPayload": "A text payload",
"resource": {
"type": "gae_app",
"labels": {
"version_id": "logsync-bug",
"module_id": "default",
}
},
"timestamp": "2022-05-06T23:13:23.002Z",
"logName": "projects/REDACTED_PROJECT_ID/logs/my_log"
},
{
"jsonPayload": {
"message": "A JSON payload"
},
"resource": {
"type": "gae_app",
"labels": {
"module_id": "default",
"version_id": "logsync-bug"
}
},
"timestamp": "2022-05-06T23:13:23.004Z",
"logName": "projects/REDACTED_PROJECT_ID/logs/my_log",
"receiveTimestamp": "2022-05-06T23:13:23.270510336Z"
}
]
Actual:
The actual output looks like the following: (irrelevant details removed)
[
{
"jsonPayload": {
"message": "A text payload",
"timestamp": "2022-05-06T23:13:23.002Z",
"logName": "projects/REDACTED_PROJECT_ID/logs/my_log",
"resource": {
"type": "gae_app",
"labels": {
"module_id": "default",
"version_id": "logsync-bug"
}
}
},
"resource": {
"type": "gae_app",
"labels": {
"zone": "us3",
"version_id": "logsync-bug",
"module_id": "default",
"project_id": "REDACTED_PROJECT_ID"
}
},
"timestamp": "2022-05-06T23:13:23.004560Z",
"logName": "projects/REDACTED_PROJECT_ID/logs/stdout",
},
{
"jsonPayload": {
"timestamp": "2022-05-06T23:13:23.004Z",
"message": {
"message": "A JSON payload"
},
"resource": {
"labels": {
"module_id": "default",
"version_id": "logsync-bug"
},
"type": "gae_app"
},
"logName": "projects/REDACTED_PROJECT_ID/logs/my_log"
},
"resource": {
"type": "gae_app",
"labels": {
"version_id": "logsync-bug",
"module_id": "default",
"project_id": "REDACTED_PROJECT_ID",
"zone": "us3"
}
},
"timestamp": "2022-05-06T23:13:23.005096Z",
"logName": "projects/REDACTED_PROJECT_ID/logs/stdout",
}
]
The full output can be seen in downloaded-logs-20220506-191603.json
Fix
I’ve followed the instructions from the README, copied below. Notice that it says to create an entry, passing metadata and a payload and then call log.write(entry)
:
// Optional: Create and configure a client
const logging = new Logging();
await logging.setProjectId()
await logging.setDetectedResource()
// Create a LogSync transport, defaulting to `process.stdout`
const log = logging.logSync(logname);
const meta = { /* optional field overrides here */ };
const entry = log.entry(meta, 'Your log message');
log.write(entry);
// Syntax sugar for logging at a specific severity
log.alert(entry);
log.warning(entry);
However, in calls to log.write(entry)
, it appears the final payload is being populated with the entire entry
object passed to log.write()
and therefore the entry.metadata
isn’t being applied at all.
So either the README is wrong or there’s a bug here. To fix this it seems would require either:
- updating the README to show how to correctly create and write to a
log.logSync()
, or - fixing the behavior to match what’s in the README.
Issue Analytics
- State:
- Created a year ago
- Reactions:3
- Comments:8 (4 by maintainers)
@chriscalo and @NeverwinterMoon , I was thinking to close this issue - the timestamp issue was fixed and as for
logName
, it might take time to fix - I filed a feature request for our product team and it will be tracked separately. Please let me know if you have any other questions - thanks!Thanks @NeverwinterMoon for providing more context! Below are some points with respect of your observations:
logName
andresource
fields are always overriden by the environment when stdout-based output is used. See more explanation inStructured logging in Google Cloud
blog under How to write logs section. I filed an issue with CF team to provide an ability to override thelogName
, so for now we embedding this intojsonPayload
field so it could be searched at least. As forresource
, I believe it is mandatory field and expected to be in specific format which is described here.timestamp
field - based on explanation here it should be picked up correctly from the output, but seems it might be some issues.