Skip to content
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

feat: Add support for JSON logging to stderr #1027

Merged
merged 1 commit into from
Sep 8, 2022

Conversation

bpcreech
Copy link
Contributor

@bpcreech bpcreech commented Aug 6, 2022

Fixes #1026

@bpcreech bpcreech requested review from a team as code owners August 6, 2022 18:27
@product-auto-label product-auto-label bot added size: m Pull request size is medium. api: logging Issues related to the googleapis/java-logging API. labels Aug 6, 2022
@bpcreech bpcreech force-pushed the stderr branch 2 times, most recently from 9657e1b to 092f5df Compare August 8, 2022 20:08
@product-auto-label product-auto-label bot added size: l Pull request size is large. and removed size: m Pull request size is medium. labels Aug 8, 2022
@bpcreech bpcreech force-pushed the stderr branch 3 times, most recently from c3a364d to c9f133c Compare August 8, 2022 21:59
@losalex losalex self-assigned this Aug 9, 2022
@losalex losalex changed the title Add support for JSON logging to stderr feat: Add support for JSON logging to stderr Aug 9, 2022
@conventional-commit-lint-gcf
Copy link

🤖 I detect that the PR title and the commit message differ and there's only one commit. To use the PR title for the commit history, you can use Github's automerge feature with squashing, or use automerge label. Good luck human!

-- conventional-commit-lint bot
https://conventionalcommits.org/

Copy link
Contributor

@losalex losalex left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bpcreech , thanks for opening this PR! I have a conceptual feedback on this change - basically when you configure stdout/stderr to be used, it will redirect all logging traffic to stdout/stderr respectively. While developer always can create 2 loggers to be able to use both, stdout and stderr streams, it would be best to make this feature dependent on Severity. This way we can define more flexible logic to send log record to dedicated output streams based if the record has error-related severity or not (e.g. DEFAULT/DEBUG/INFO/NOTICE severities will go to stdout and the rest to stderr).
Thats said, I believe that Severity based output could be introduced as separate feature in addition to ability to redirect everything to stdout or stderr - please let me know WDYT about this and we can take it from there.

@losalex losalex added the owlbot:run Add this label to trigger the Owlbot post processor. label Sep 8, 2022
@gcf-owl-bot gcf-owl-bot bot removed the owlbot:run Add this label to trigger the Owlbot post processor. label Sep 8, 2022
@losalex losalex added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Sep 8, 2022
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Sep 8, 2022
@losalex losalex merged commit b202f5c into googleapis:main Sep 8, 2022
@nickkieffer
Copy link

Hey @losalex and @bpcreech, I think this change made it so the default python logging package no longer logs to gcloud without using a structured log to STOUT
I think it was logging to STERR by default previously (yes malformed but it still worked)
This was before the release as an example
image
Now we just get no logs, working to add these to STOUT and json structured but figured others will run into this

@bpcreech
Copy link
Contributor Author

bpcreech commented Oct 7, 2022

Hmm, this change was to the Java logging library, which is not used by any Python SDK I'm aware of.

@nickkieffer
Copy link

I was thinking it may consume logs that are formatted via the python SDK, nothing directly related if that makes sense

@bpcreech
Copy link
Contributor Author

bpcreech commented Oct 7, 2022

Can you describe your software stack? What environment are you running on, and what SDKs are you using?

@nickkieffer
Copy link

We run python scripts using kubernetes in gcloud,
in python just the basic

import logging
log = logging.getLogger(__name__)
log.debug('debuggin')

This is pretty confusing to me though, google stackdriver doesn't have our logs but
when using the kubernetes python SDK we actually DO get logs back so we know we are logging something still 😰

from kubernetes.client import BatchV1Api, LogsApi, CoreV1Api, EventsV1beta1Api
api = api_mgr.get(CoreV1Api)
pod = api.read_namespaced_pod(pod_name, self.namespace)
logs = api.read_namespaced_pod_log(
     pod_name, self.namespace, follow=True, _preload_content=False
 )
for line in logs.stream():
            yield Event(timestamp=0, type=TYPE_POD_LOG, name=pod_name, message=line.decode('utf-8'))

@nickkieffer
Copy link

nickkieffer commented Oct 7, 2022

On the left is the google console, the right is our UI displaying the logs from that kubernetes SDK
image

if (autoPopulateMetadata) {
logEntries =
logging.populateMetadata(
logEntries, getMonitoredResource(), "com.google.cloud.logging", "java");
}
if (redirectToStdout) {
logEntries.forEach(log -> System.out.println(log.toStructuredJsonString()));
} else {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it stands out to me that this is an if else and is replaced with a switch without a default case, but 🤷

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nickkieffer , are you using redirectToStdout feature?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no, not directly anyways

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nickkieffer , I must admit that I have some confusion while following the issue you raised, but let me try answering best based on my understanding:

  1. Correct me if I wrong, you use a Python logger - based on sample code you shared. This change to print to STDERR was performed only in Java library and I believe we do not have such feature in Python. If problem indeed related to Python SDK, can you please raise the issue in Python repo? Feel free to provide all details you mentioned here and also the details about environment you run in - adding @daniel-sanche for visibility.
  2. This change supposed to use CLOUD_LOGGING by default - the STDOUT and STDERR logging needs to be explicitly enabled in code or configuration so the change should be fully backward compatible to clients which does not use the feature. If you believe this is not a case, please let us know - me and @bpcreech can take a look.

Please let me know if I understood you correctly and if I can assist you any further.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can disregard me on this, I think my ops team just so happened to turn off of logging agents around the same time as your release happened. Sorry about the distraction!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: logging Issues related to the googleapis/java-logging API. size: l Pull request size is large.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support JSON logging to stderr
4 participants