diff --git a/.github/workflows/java-logging-ci.yaml b/.github/workflows/java-logging-ci.yaml
new file mode 100644
index 000000000000..128b6c00bab0
--- /dev/null
+++ b/.github/workflows/java-logging-ci.yaml
@@ -0,0 +1,141 @@
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# Github action job to test core java library features on
+# downstream client libraries before they are released.
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+name: java-logging ci
+defaults:
+ run:
+ working-directory: java-logging
+jobs:
+ filter:
+ runs-on: ubuntu-latest
+ outputs:
+ library: ${{ steps.filter.outputs.library }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dorny/paths-filter@v3
+ id: filter
+ with:
+ filters: |
+ library:
+ - 'java-logging/**'
+ units:
+ needs: filter
+ if: ${{ needs.filter.outputs.library == 'true' }}
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ java: [11, 17, 21, 25]
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: ${{matrix.java}}
+ - run: java -version
+ - run: .kokoro/build.sh
+ env:
+ JOB_TYPE: test
+ units-java8:
+ needs: filter
+ if: ${{ needs.filter.outputs.library == 'true' }}
+ # Building using Java 17 and run the tests with Java 8 runtime
+ name: "units (8)"
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
+ with:
+ java-version: 8
+ distribution: temurin
+ - name: "Set jvm system property environment variable for surefire plugin (unit tests)"
+ # Maven surefire plugin (unit tests) allows us to specify JVM to run the tests.
+ # https://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#jvm
+ run: echo "SUREFIRE_JVM_OPT=-Djvm=${JAVA_HOME}/bin/java -P !java17" >> $GITHUB_ENV
+ shell: bash
+ - uses: actions/setup-java@v4
+ with:
+ java-version: 17
+ distribution: temurin
+ - run: .kokoro/build.sh
+ env:
+ JOB_TYPE: test
+ windows:
+ needs: filter
+ if: ${{ needs.filter.outputs.library == 'true' }}
+ runs-on: windows-latest
+ steps:
+ - name: Support longpaths
+ run: git config --system core.longpaths true
+ working-directory: .
+ - name: Support longpaths
+ run: git config --system core.longpaths true
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: 8
+ - run: java -version
+ - run: .kokoro/build.bat
+ env:
+ JOB_TYPE: test
+ dependencies:
+ needs: filter
+ if: ${{ needs.filter.outputs.library == 'true' }}
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ java: [17]
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: ${{matrix.java}}
+ - run: java -version
+ - run: .kokoro/dependencies.sh
+ javadoc:
+ needs: filter
+ if: ${{ needs.filter.outputs.library == 'true' }}
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: 17
+ - run: java -version
+ - run: .kokoro/build.sh
+ env:
+ JOB_TYPE: javadoc
+ lint:
+ needs: filter
+ if: ${{ needs.filter.outputs.library == 'true' }}
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
+ with:
+ distribution: temurin
+ java-version: 17
+ - run: java -version
+ - run: .kokoro/build.sh
+ env:
+ JOB_TYPE: lint
diff --git a/gapic-libraries-bom/pom.xml b/gapic-libraries-bom/pom.xml
index e7b3efd5a591..d578996e5797 100644
--- a/gapic-libraries-bom/pom.xml
+++ b/gapic-libraries-bom/pom.xml
@@ -796,6 +796,13 @@
pomimport
+
+ com.google.cloud
+ google-cloud-logging-bom
+ 3.23.10
+ pom
+ import
+ com.google.cloudgoogle-cloud-lustre-bom
diff --git a/generation_config.yaml b/generation_config.yaml
index 76a9c95606a8..56dfa98579f5 100644
--- a/generation_config.yaml
+++ b/generation_config.yaml
@@ -1,10 +1,6 @@
gapic_generator_version: 2.65.1
googleapis_commitish: 415914bd49d41beaae8a9adb348ee2587c93aa70
libraries_bom_version: 26.73.0
-
-# the libraries are ordered with respect to library name, which is
-# java-{library.library_name} or java-{library.api-shortname} when
-# library.library_name is not defined.
libraries:
- api_shortname: accessapproval
name_pretty: Access Approval
@@ -14,7 +10,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/accessapproval/v1
-
- api_shortname: accesscontextmanager
name_pretty: Identity Access Context Manager
product_documentation: n/a
@@ -24,7 +19,6 @@ libraries:
GAPICs:
- proto_path: google/identity/accesscontextmanager/v1
- proto_path: google/identity/accesscontextmanager/type
-
- api_shortname: admanager
name_pretty: Google Ad Manager API
product_documentation: https://developers.google.com/ad-manager/api/beta
@@ -40,7 +34,6 @@ libraries:
GAPICs:
- proto_path: google/ads/admanager/v1
requires_billing: true
-
- api_shortname: advisorynotifications
name_pretty: Advisory Notifications API
product_documentation: https://cloud.google.com/advisory-notifications/
@@ -48,7 +41,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/advisorynotifications/v1
-
- api_shortname: aiplatform
name_pretty: Vertex AI
product_documentation: https://cloud.google.com/vertex-ai/docs
@@ -61,7 +53,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/aiplatform/v1
- proto_path: google/cloud/aiplatform/v1beta1
-
- api_shortname: alloydb
name_pretty: AlloyDB
product_documentation: https://cloud.google.com/alloydb/
@@ -73,7 +64,6 @@ libraries:
- proto_path: google/cloud/alloydb/v1
- proto_path: google/cloud/alloydb/v1alpha
- proto_path: google/cloud/alloydb/v1beta
-
- api_shortname: alloydb
name_pretty: AlloyDB connectors
product_documentation: https://cloud.google.com/alloydb/docs
@@ -88,7 +78,6 @@ libraries:
- proto_path: google/cloud/alloydb/connectors/v1
- proto_path: google/cloud/alloydb/connectors/v1alpha
- proto_path: google/cloud/alloydb/connectors/v1beta
-
- api_shortname: analyticsadmin
name_pretty: Analytics Admin
product_documentation: https://developers.google.com/analytics
@@ -100,7 +89,6 @@ libraries:
GAPICs:
- proto_path: google/analytics/admin/v1alpha
- proto_path: google/analytics/admin/v1beta
-
- api_shortname: analyticsdata
name_pretty: Analytics Data
product_documentation: https://developers.google.com/analytics/trusted-testing/analytics-data
@@ -114,7 +102,6 @@ libraries:
GAPICs:
- proto_path: google/analytics/data/v1alpha
- proto_path: google/analytics/data/v1beta
-
- api_shortname: analyticshub
name_pretty: Analytics Hub API
product_documentation: https://cloud.google.com/bigquery/TBD
@@ -122,7 +109,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/bigquery/analyticshub/v1
-
- api_shortname: apigateway
name_pretty: API Gateway
product_documentation: https://cloud.google.com/api-gateway/docs
@@ -137,7 +123,6 @@ libraries:
rest_documentation: https://cloud.google.com/api-gateway/docs/reference/rest
GAPICs:
- proto_path: google/cloud/apigateway/v1
-
- api_shortname: apigeeconnect
name_pretty: Apigee Connect
product_documentation: https://cloud.google.com/apigee/docs/hybrid/v1.3/apigee-connect/
@@ -148,7 +133,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/apigeeconnect/v1
-
- api_shortname: apigee-registry
name_pretty: Registry API
product_documentation: https://cloud.google.com/apigee/docs/api-hub/get-started-registry-api
@@ -157,7 +141,6 @@ libraries:
api_id: apigeeregistry.googleapis.com
GAPICs:
- proto_path: google/cloud/apigeeregistry/v1
-
- api_shortname: apihub
name_pretty: API hub API
product_documentation: https://cloud.google.com/apigee/docs/apihub/what-is-api-hub
@@ -183,7 +166,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/api/apikeys/v2
-
- api_shortname: appengine
name_pretty: App Engine Admin API
product_documentation: https://cloud.google.com/appengine/docs/admin-api/
@@ -193,7 +175,6 @@ libraries:
codeowner_team: '@googleapis/aap-dpes'
GAPICs:
- proto_path: google/appengine/v1
-
- api_shortname: apphub
name_pretty: App Hub API
product_documentation: https://cloud.google.com/app-hub/docs/overview
@@ -202,7 +183,6 @@ libraries:
rpc_documentation: https://cloud.google.com/app-hub/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/apphub/v1
-
- api_shortname: area120tables
name_pretty: Area 120 Tables
product_documentation: https://area120.google.com/
@@ -212,7 +192,6 @@ libraries:
distribution_name: com.google.area120:google-area120-tables
GAPICs:
- proto_path: google/area120/tables/v1alpha1
-
- api_shortname: artifactregistry
name_pretty: Artifact Registry
product_documentation: https://cloud.google.com/artifact-registry
@@ -229,7 +208,6 @@ libraries:
GAPICs:
- proto_path: google/devtools/artifactregistry/v1
- proto_path: google/devtools/artifactregistry/v1beta2
-
- api_shortname: cloudasset
name_pretty: Cloud Asset Inventory
product_documentation: https://cloud.google.com/resource-manager/docs/cloud-asset-inventory/overview
@@ -247,7 +225,6 @@ libraries:
- proto_path: google/cloud/asset/v1p2beta1
- proto_path: google/cloud/asset/v1p5beta1
- proto_path: google/cloud/asset/v1p7beta1
-
- api_shortname: assuredworkloads
name_pretty: Assured Workloads for Government
product_documentation: https://cloud.google.com/assured-workloads/
@@ -260,7 +237,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/assuredworkloads/v1
- proto_path: google/cloud/assuredworkloads/v1beta1
-
- api_shortname: automl
name_pretty: Cloud Auto ML
product_documentation: https://cloud.google.com/automl/docs/
@@ -276,14 +252,12 @@ libraries:
GAPICs:
- proto_path: google/cloud/automl/v1
- proto_path: google/cloud/automl/v1beta1
-
- api_shortname: backupdr
name_pretty: Backup and DR Service API
product_documentation: https://cloud.google.com/backup-disaster-recovery/docs/concepts/backup-dr
api_description: 'Backup and DR Service is a powerful, centralized, cloud-first
backup and disaster recovery solution for cloud-based and hybrid workloads. '
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-backupdr/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-backupdr/latest/overview
release_level: stable
distribution_name: com.google.cloud:google-cloud-backupdr
api_id: backupdr.googleapis.com
@@ -303,7 +277,6 @@ libraries:
rpc_documentation: https://cloud.google.com/bare-metal/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/baremetalsolution/v2
-
- api_shortname: batch
name_pretty: Cloud Batch
product_documentation: https://cloud.google.com/
@@ -311,7 +284,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/batch/v1
- proto_path: google/cloud/batch/v1alpha
-
- api_shortname: beyondcorp-appconnections
name_pretty: BeyondCorp AppConnections
product_documentation: https://cloud.google.com/beyondcorp-enterprise/
@@ -322,7 +294,6 @@ libraries:
need for a traditional VPN.
GAPICs:
- proto_path: google/cloud/beyondcorp/appconnections/v1
-
- api_shortname: beyondcorp-appconnectors
name_pretty: BeyondCorp AppConnectors
product_documentation: cloud.google.com/beyondcorp-enterprise/
@@ -330,7 +301,6 @@ libraries:
AppConnectors.
GAPICs:
- proto_path: google/cloud/beyondcorp/appconnectors/v1
-
- api_shortname: beyondcorp-appgateways
name_pretty: BeyondCorp AppGateways
product_documentation: https://cloud.google.com/beyondcorp-enterprise/
@@ -339,7 +309,6 @@ libraries:
api_id: beyondcorp.googleapis.com
GAPICs:
- proto_path: google/cloud/beyondcorp/appgateways/v1
-
- api_shortname: beyondcorp-clientconnectorservices
name_pretty: BeyondCorp ClientConnectorServices
product_documentation: https://cloud.google.com/beyondcorp-enterprise/
@@ -348,7 +317,6 @@ libraries:
api_id: beyondcorp.googleapis.com
GAPICs:
- proto_path: google/cloud/beyondcorp/clientconnectorservices/v1
-
- api_shortname: beyondcorp-clientgateways
name_pretty: BeyondCorp ClientGateways
product_documentation: https://cloud.google.com/beyondcorp-enterprise/
@@ -357,7 +325,6 @@ libraries:
api_id: beyondcorp.googleapis.com
GAPICs:
- proto_path: google/cloud/beyondcorp/clientgateways/v1
-
- api_shortname: biglake
name_pretty: BigLake
product_documentation: https://cloud.google.com/biglake
@@ -368,7 +335,6 @@ libraries:
- proto_path: google/cloud/bigquery/biglake/v1
- proto_path: google/cloud/biglake/v1
- proto_path: google/cloud/bigquery/biglake/v1alpha1
-
- api_shortname: analyticshub
name_pretty: Analytics Hub
product_documentation: https://cloud.google.com/analytics-hub
@@ -378,18 +344,15 @@ libraries:
library_name: bigquery-data-exchange
GAPICs:
- proto_path: google/cloud/bigquery/dataexchange/v1beta1
-
- api_shortname: bigqueryconnection
name_pretty: Cloud BigQuery Connection
product_documentation: https://cloud.google.com/bigquery/docs/reference/bigqueryconnection/rest
api_description: allows users to manage BigQuery connections to external data sources.
release_level: stable
- client_documentation:
- https://cloud.google.com/bigquery/docs/reference/reservations/rpc/google.cloud.bigquery.reservation.v1beta1
+ client_documentation: https://cloud.google.com/bigquery/docs/reference/reservations/rpc/google.cloud.bigquery.reservation.v1beta1
GAPICs:
- proto_path: google/cloud/bigquery/connection/v1
- proto_path: google/cloud/bigquery/connection/v1beta1
-
- api_shortname: bigquerydatapolicy
name_pretty: BigQuery DataPolicy API
product_documentation: https://cloud.google.com/bigquery/docs/reference/datapolicy/
@@ -399,7 +362,6 @@ libraries:
- proto_path: google/cloud/bigquery/datapolicies/v1beta1
- proto_path: google/cloud/bigquery/datapolicies/v2beta1
- proto_path: google/cloud/bigquery/datapolicies/v2
-
- api_shortname: bigquerydatatransfer
name_pretty: BigQuery Data Transfer Service
product_documentation: https://cloud.google.com/bigquery/transfer/
@@ -409,7 +371,6 @@ libraries:
issue_tracker: https://issuetracker.google.com/savedsearches/559654
GAPICs:
- proto_path: google/cloud/bigquery/datatransfer/v1
-
- api_shortname: bigquerymigration
name_pretty: BigQuery Migration
product_documentation: https://cloud.google.com/bigquery/docs
@@ -418,7 +379,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/bigquery/migration/v2
- proto_path: google/cloud/bigquery/migration/v2alpha
-
- api_shortname: bigqueryreservation
name_pretty: Cloud BigQuery Reservation
product_documentation: https://cloud.google.com/bigquery/docs/reference/reservations/rpc
@@ -426,7 +386,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/bigquery/reservation/v1
-
- api_shortname: cloudbilling
name_pretty: Cloud Billing
product_documentation: https://cloud.google.com/billing/docs
@@ -439,7 +398,6 @@ libraries:
rpc_documentation: https://cloud.google.com/billing/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/billing/v1
-
- api_shortname: billingbudgets
name_pretty: Cloud Billing Budgets
product_documentation: https://cloud.google.com/billing/docs/how-to/budgets
@@ -449,7 +407,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/billing/budgets/v1
- proto_path: google/cloud/billing/budgets/v1beta1
-
- api_shortname: binaryauthorization
name_pretty: Binary Authorization
product_documentation: https://cloud.google.com/binary-authorization/docs
@@ -465,13 +422,11 @@ libraries:
GAPICs:
- proto_path: google/cloud/binaryauthorization/v1
- proto_path: google/cloud/binaryauthorization/v1beta1
-
- api_shortname: capacityplanner
name_pretty: Capacity Planner API
product_documentation: https://cloud.google.com/capacity-planner/docs
api_description: Provides programmatic access to Capacity Planner features.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-capacityplanner/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-capacityplanner/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-capacityplanner
api_id: capacityplanner.googleapis.com
@@ -490,7 +445,6 @@ libraries:
api_id: certificatemanager.googleapis.com
GAPICs:
- proto_path: google/cloud/certificatemanager/v1
-
- api_shortname: cloudchannel
name_pretty: Channel Services
product_documentation: https://cloud.google.com/channel/docs
@@ -504,7 +458,6 @@ libraries:
rpc_documentation: https://cloud.google.com/channel/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/channel/v1
-
- api_shortname: chat
name_pretty: Google Chat API
product_documentation: https://developers.google.com/chat/concepts
@@ -514,15 +467,13 @@ libraries:
rest_documentation: https://developers.google.com/chat/api/reference/rest
GAPICs:
- proto_path: google/chat/v1
-
- api_shortname: chronicle
name_pretty: Chronicle API
product_documentation: https://cloud.google.com/chronicle/docs/secops/secops-overview
api_description: The Google Cloud Security Operations API, popularly known as the
Chronicle API, serves endpoints that enable security analysts to analyze and mitigate
a security threat throughout its lifecycle
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-chronicle/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-chronicle/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-chronicle
api_id: chronicle.googleapis.com
@@ -538,8 +489,7 @@ libraries:
api_description: Cloud API Registry lets you discover, govern, use, and monitor
Model Context Protocol (MCP) servers and tools provided by Google, or by your
organization through Apigee API hub.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-cloudapiregistry/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-cloudapiregistry/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-cloudapiregistry
api_id: cloudapiregistry.googleapis.com
@@ -562,7 +512,6 @@ libraries:
GAPICs:
- proto_path: google/devtools/cloudbuild/v1
- proto_path: google/devtools/cloudbuild/v2
-
- api_shortname: cloudcommerceconsumerprocurement
name_pretty: Cloud Commerce Consumer Procurement
product_documentation: https://cloud.google.com/marketplace/
@@ -573,7 +522,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/commerce/consumer/procurement/v1
- proto_path: google/cloud/commerce/consumer/procurement/v1alpha1
-
- api_shortname: cloudcontrolspartner
name_pretty: Cloud Controls Partner API
product_documentation: https://cloud.google.com/sovereign-controls-by-partners/docs/sovereign-partners
@@ -583,27 +531,23 @@ libraries:
GAPICs:
- proto_path: google/cloud/cloudcontrolspartner/v1
- proto_path: google/cloud/cloudcontrolspartner/v1beta
-
- api_shortname: cloudquotas
name_pretty: Cloud Quotas API
product_documentation: https://cloud.google.com/cloudquotas/docs/
- api_description: "Cloud Quotas API provides GCP service consumers with management
- and\n observability for resource usage, quotas, and restrictions of the services\n\
+ api_description: "Cloud Quotas API provides GCP service consumers with management\
+ \ and\n observability for resource usage, quotas, and restrictions of the services\n\
\ they consume."
release_level: stable
GAPICs:
- proto_path: google/api/cloudquotas/v1
- proto_path: google/api/cloudquotas/v1beta
-
- api_shortname: cloudsecuritycompliance
name_pretty: Cloud Security Compliance API
- product_documentation:
- https://cloud.google.com/security-command-center/docs/compliance-manager-overview
+ product_documentation: https://cloud.google.com/security-command-center/docs/compliance-manager-overview
api_description: Compliance Manager uses software-defined controls that let you
assess support for multiple compliance programs and security requirements within
a Google Cloud organization
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-cloudsecuritycompliance/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-cloudsecuritycompliance/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-cloudsecuritycompliance
api_id: cloudsecuritycompliance.googleapis.com
@@ -621,21 +565,19 @@ libraries:
GAPICs:
- proto_path: google/cloud/support/v2
- proto_path: google/cloud/support/v2beta
-
- api_shortname: compute
name_pretty: Compute Engine
product_documentation: https://cloud.google.com/compute/
- api_description: "delivers virtual machines running in Google's innovative data
- centers and worldwide fiber network. Compute Engine's tooling and workflow support
+ api_description: 'delivers virtual machines running in Google''s innovative data
+ centers and worldwide fiber network. Compute Engine''s tooling and workflow support
enable scaling from single instances to global, load-balanced cloud computing.
- Compute Engine's VMs boot quickly, come with persistent disk storage, deliver
- consistent performance and are available in many configurations. "
+ Compute Engine''s VMs boot quickly, come with persistent disk storage, deliver
+ consistent performance and are available in many configurations. '
release_level: stable
excluded_poms: grpc-google-cloud-compute-v1
excluded_dependencies: grpc-google-cloud-compute-v1
GAPICs:
- proto_path: google/cloud/compute/v1
-
- api_shortname: confidentialcomputing
name_pretty: Confidential Computing API
product_documentation: https://cloud.google.com/confidential-computing/
@@ -644,15 +586,12 @@ libraries:
GAPICs:
- proto_path: google/cloud/confidentialcomputing/v1
- proto_path: google/cloud/confidentialcomputing/v1alpha1
-
- api_shortname: configdelivery
name_pretty: Config Delivery API
- product_documentation:
- https://cloud.google.com/kubernetes-engine/enterprise/config-sync/docs/concepts/fleet-packages
+ product_documentation: https://cloud.google.com/kubernetes-engine/enterprise/config-sync/docs/concepts/fleet-packages
api_description: ConfigDelivery service manages the deployment of kubernetes configuration
to a fleet of kubernetes clusters.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-configdelivery/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-configdelivery/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-configdelivery
api_id: configdelivery.googleapis.com
@@ -660,19 +599,16 @@ libraries:
group_id: com.google.cloud
cloud_api: true
requires_billing: true
- rest_documentation:
- https://cloud.google.com/kubernetes-engine/enterprise/config-sync/docs/reference/rest
+ rest_documentation: https://cloud.google.com/kubernetes-engine/enterprise/config-sync/docs/reference/rest
GAPICs:
- proto_path: google/cloud/configdelivery/v1beta
- proto_path: google/cloud/configdelivery/v1
- api_shortname: connectgateway
name_pretty: Connect Gateway API
- product_documentation:
- https://cloud.google.com/kubernetes-engine/enterprise/multicluster-management/gateway
+ product_documentation: https://cloud.google.com/kubernetes-engine/enterprise/multicluster-management/gateway
api_description: The Connect Gateway service allows connectivity from external parties
to connected Kubernetes clusters.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-connectgateway/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-connectgateway/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-connectgateway
api_id: connectgateway.googleapis.com
@@ -692,7 +628,6 @@ libraries:
codeowner_team: '@googleapis/api-contact-center-insights'
GAPICs:
- proto_path: google/cloud/contactcenterinsights/v1
-
- api_shortname: container
name_pretty: Kubernetes Engine
product_documentation: https://cloud.google.com/kubernetes-engine/
@@ -708,7 +643,6 @@ libraries:
GAPICs:
- proto_path: google/container/v1
- proto_path: google/container/v1beta1
-
- api_shortname: containeranalysis
name_pretty: Cloud Container Analysis
product_documentation: https://cloud.google.com/container-registry/docs/container-analysis
@@ -724,7 +658,6 @@ libraries:
GAPICs:
- proto_path: google/devtools/containeranalysis/v1
- proto_path: google/devtools/containeranalysis/v1beta1
-
- api_shortname: contentwarehouse
name_pretty: Document AI Warehouse
product_documentation: https://cloud.google.com/document-warehouse/docs/overview
@@ -733,7 +666,6 @@ libraries:
metadata.
GAPICs:
- proto_path: google/cloud/contentwarehouse/v1
-
- api_shortname: datafusion
name_pretty: Cloud Data Fusion
product_documentation: https://cloud.google.com/data-fusion/docs
@@ -745,19 +677,17 @@ libraries:
GAPICs:
- proto_path: google/cloud/datafusion/v1
- proto_path: google/cloud/datafusion/v1beta1
-
- api_shortname: databasecenter
name_pretty: Database Center API
product_documentation: https://cloud.google.com/database-center/docs/overview
- api_description: Database Center provides an organization-wide, cross-product fleet
- health platform to eliminate the overhead, complexity, and risk associated with
- aggregating and summarizing health signals through custom dashboards. Through
- Database Center’s fleet health dashboard and API, database platform teams that
- are responsible for reliability, compliance, security, cost, and administration
- of database fleets will now have a single pane of glass that pinpoints issues
- relevant to each team.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-databasecenter/latest/overview
+ api_description: "Database Center provides an organization-wide, cross-product fleet\
+ \ health platform to eliminate the overhead, complexity, and risk associated with\
+ \ aggregating and summarizing health signals through custom dashboards. Through\
+ \ Database Center\u2019s fleet health dashboard and API, database platform teams\
+ \ that are responsible for reliability, compliance, security, cost, and administration\
+ \ of database fleets will now have a single pane of glass that pinpoints issues\
+ \ relevant to each team."
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-databasecenter/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-databasecenter
api_id: databasecenter.googleapis.com
@@ -777,7 +707,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/datacatalog/v1
- proto_path: google/cloud/datacatalog/v1beta1
-
- api_shortname: dataflow
name_pretty: Dataflow
product_documentation: https://cloud.google.com/dataflow/docs
@@ -787,7 +716,6 @@ libraries:
rpc_documentation: https://cloud.google.com/dataflow/docs/reference/rpc
GAPICs:
- proto_path: google/dataflow/v1beta3
-
- api_shortname: dataform
name_pretty: Cloud Dataform
product_documentation: https://cloud.google.com/dataform/docs
@@ -795,7 +723,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/dataform/v1beta1
- proto_path: google/cloud/dataform/v1
-
- api_shortname: datalabeling
name_pretty: Data Labeling
product_documentation: https://cloud.google.com/ai-platform/data-labeling/docs/
@@ -807,7 +734,6 @@ libraries:
rpc_documentation: https://cloud.google.com/ai-platform/data-labeling/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/datalabeling/v1beta1
-
- api_shortname: datalineage
name_pretty: Data Lineage
product_documentation: https://cloud.google.com/data-catalog/docs/data-lineage/
@@ -815,7 +741,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/datacatalog/lineage/v1
-
- api_shortname: datamanager
name_pretty: Data Manager API
product_documentation: https://developers.google.com/data-manager
@@ -845,7 +770,6 @@ libraries:
rpc_documentation: https://cloud.google.com/dataplex/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/dataplex/v1
-
- api_shortname: dataproc
name_pretty: Dataproc
product_documentation: https://cloud.google.com/dataproc
@@ -858,7 +782,6 @@ libraries:
rpc_documentation: https://cloud.google.com/dataproc/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/dataproc/v1
-
- api_shortname: metastore
name_pretty: Dataproc Metastore
product_documentation: https://cloud.google.com/dataproc-metastore/docs
@@ -874,7 +797,6 @@ libraries:
- proto_path: google/cloud/metastore/v1
- proto_path: google/cloud/metastore/v1alpha
- proto_path: google/cloud/metastore/v1beta
-
- api_shortname: datastream
name_pretty: Datastream
product_documentation: https://cloud.google.com/datastream/docs
@@ -886,7 +808,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/datastream/v1
- proto_path: google/cloud/datastream/v1alpha1
-
- api_shortname: clouddeploy
name_pretty: Google Cloud Deploy
product_documentation: https://cloud.google.com/deploy/docs
@@ -897,13 +818,11 @@ libraries:
codeowner_team: '@googleapis/aap-dpes'
GAPICs:
- proto_path: google/cloud/deploy/v1
-
- api_shortname: developerconnect
name_pretty: Developer Connect API
product_documentation: https://cloud.google.com/developer-connect/docs/overview
api_description: Connect third-party source code management to Google
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-developerconnect/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-developerconnect/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-developerconnect
api_id: developerconnect.googleapis.com
@@ -917,8 +836,7 @@ libraries:
name_pretty: Device Streaming API
product_documentation: https://cloud.google.com/device-streaming/docs
api_description: The Cloud API for device streaming usage.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-devicestreaming/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-devicestreaming/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-devicestreaming
api_id: devicestreaming.googleapis.com
@@ -943,7 +861,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/dialogflow/v2
- proto_path: google/cloud/dialogflow/v2beta1
-
- api_shortname: dialogflow-cx
name_pretty: Dialogflow CX
product_documentation: https://cloud.google.com/dialogflow/cx/docs
@@ -955,7 +872,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/dialogflow/cx/v3
- proto_path: google/cloud/dialogflow/cx/v3beta1
-
- api_shortname: discoveryengine
name_pretty: Discovery Engine API
product_documentation: https://cloud.google.com/discovery-engine/media/docs
@@ -966,7 +882,6 @@ libraries:
- proto_path: google/cloud/discoveryengine/v1
- proto_path: google/cloud/discoveryengine/v1alpha
- proto_path: google/cloud/discoveryengine/v1beta
-
- api_shortname: distributedcloudedge
name_pretty: Google Distributed Cloud Edge
product_documentation: https://cloud.google.com/distributed-cloud/edge/latest/
@@ -978,7 +893,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/edgecontainer/v1
-
- api_shortname: dlp
name_pretty: Cloud Data Loss Prevention
product_documentation: https://cloud.google.com/dlp/docs/
@@ -991,7 +905,6 @@ libraries:
rpc_documentation: https://cloud.google.com/dlp/docs/reference/rpc
GAPICs:
- proto_path: google/privacy/dlp/v2
-
- api_shortname: datamigration
name_pretty: Database Migration Service
product_documentation: https://cloud.google.com/database-migration/docs
@@ -1004,7 +917,6 @@ libraries:
rest_documentation: https://cloud.google.com/database-migration/docs/reference/rest
GAPICs:
- proto_path: google/cloud/clouddms/v1
-
- api_shortname: documentai
name_pretty: Document AI
product_documentation: https://cloud.google.com/compute/docs/documentai/
@@ -1016,7 +928,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/documentai/v1
- proto_path: google/cloud/documentai/v1beta3
-
- api_shortname: domains
name_pretty: Cloud Domains
product_documentation: https://cloud.google.com/domains
@@ -1026,7 +937,6 @@ libraries:
- proto_path: google/cloud/domains/v1
- proto_path: google/cloud/domains/v1alpha2
- proto_path: google/cloud/domains/v1beta1
-
- api_shortname: edgenetwork
name_pretty: Distributed Cloud Edge Network API
product_documentation: https://cloud.google.com/distributed-cloud/edge/latest/docs/overview
@@ -1034,7 +944,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/edgenetwork/v1
-
- api_shortname: enterpriseknowledgegraph
name_pretty: Enterprise Knowledge Graph
product_documentation: https://cloud.google.com/enterprise-knowledge-graph/docs/overview
@@ -1043,7 +952,6 @@ libraries:
an efficient and useful way.
GAPICs:
- proto_path: google/cloud/enterpriseknowledgegraph/v1
-
- api_shortname: clouderrorreporting
name_pretty: Error Reporting
product_documentation: https://cloud.google.com/error-reporting
@@ -1058,7 +966,6 @@ libraries:
requires_billing: false
GAPICs:
- proto_path: google/devtools/clouderrorreporting/v1beta1
-
- api_shortname: essentialcontacts
name_pretty: Essential Contacts API
product_documentation: https://cloud.google.com/resource-manager/docs/managing-notification-contacts/
@@ -1068,7 +975,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/essentialcontacts/v1
-
- api_shortname: eventarc
name_pretty: Eventarc
product_documentation: https://cloud.google.com/eventarc/docs
@@ -1082,7 +988,6 @@ libraries:
rpc_documentation: https://cloud.google.com/eventarc/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/eventarc/v1
-
- api_shortname: eventarcpublishing
name_pretty: Eventarc Publishing
product_documentation: https://cloud.google.com/eventarc/docs
@@ -1094,7 +999,6 @@ libraries:
rpc_documentation: https://cloud.google.com/eventarc/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/eventarc/publishing/v1
-
- api_shortname: file
name_pretty: Cloud Filestore API
product_documentation: https://cloud.google.com/filestore/docs
@@ -1107,16 +1011,13 @@ libraries:
GAPICs:
- proto_path: google/cloud/filestore/v1
- proto_path: google/cloud/filestore/v1beta1
-
- api_shortname: financialservices
name_pretty: Financial Services API
- product_documentation:
- https://cloud.google.com/financial-services/anti-money-laundering/docs/concepts/overview
+ product_documentation: https://cloud.google.com/financial-services/anti-money-laundering/docs/concepts/overview
api_description: Google Cloud's Anti Money Laundering AI (AML AI) product is an
API that scores AML risk. Use it to identify more risk, more defensibly, with
fewer false positives and reduced time per review.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-financialservices/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-financialservices/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-financialservices
api_id: financialservices.googleapis.com
@@ -1141,15 +1042,13 @@ libraries:
- proto_path: google/cloud/functions/v2
- proto_path: google/cloud/functions/v2alpha
- proto_path: google/cloud/functions/v2beta
-
- api_shortname: gdchardwaremanagement
name_pretty: GDC Hardware Management API
product_documentation: https://cloud.google.com/distributed-cloud/edge/latest/docs
api_description: Google Distributed Cloud connected allows you to run Kubernetes
clusters on dedicated hardware provided and maintained by Google that is separate
from the Google Cloud data center.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-gdchardwaremanagement/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-gdchardwaremanagement/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-gdchardwaremanagement
api_id: gdchardwaremanagement.googleapis.com
@@ -1159,16 +1058,14 @@ libraries:
GAPICs:
- proto_path: google/cloud/gdchardwaremanagement/v1alpha
requires_billing: true
- rpc_documentation:
- https://cloud.google.com/distributed-cloud/edge/latest/docs/reference/hardware/rpc
+ rpc_documentation: https://cloud.google.com/distributed-cloud/edge/latest/docs/reference/hardware/rpc
- api_shortname: geminidataanalytics
name_pretty: Data Analytics API with Gemini
product_documentation: https://cloud.google.com/gemini/docs/conversational-analytics-api/overview
api_description: Use Conversational Analytics API to build an artificial intelligence
(AI)-powered chat interface, or data agent, that answers questions about structured
data using natural language.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-geminidataanalytics/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-geminidataanalytics/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-geminidataanalytics
api_id: geminidataanalytics.googleapis.com
@@ -1187,7 +1084,6 @@ libraries:
library_name: gke-backup
GAPICs:
- proto_path: google/cloud/gkebackup/v1
-
- api_shortname: connectgateway
name_pretty: Connect Gateway API
product_documentation: https://cloud.google.com/anthos/multicluster-management/gateway/
@@ -1199,7 +1095,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/gkeconnect/gateway/v1beta1
-
- api_shortname: gke-multi-cloud
name_pretty: Anthos Multicloud
product_documentation: https://cloud.google.com/anthos/clusters/docs/multi-cloud
@@ -1208,7 +1103,6 @@ libraries:
api_id: gkemulticloud.googleapis.com
GAPICs:
- proto_path: google/cloud/gkemulticloud/v1
-
- api_shortname: gkehub
name_pretty: GKE Hub API
product_documentation: https://cloud.google.com/anthos/gke/docs/
@@ -1225,16 +1119,13 @@ libraries:
- proto_path: google/cloud/gkehub/v1beta1
- proto_path: google/cloud/gkehub/policycontroller/v1beta
- proto_path: google/cloud/gkehub/servicemesh/v1beta
-
- api_shortname: gkerecommender
name_pretty: GKE Recommender API
- product_documentation:
- https://cloud.google.com/kubernetes-engine/docs/how-to/machine-learning/inference-quickstart
+ product_documentation: https://cloud.google.com/kubernetes-engine/docs/how-to/machine-learning/inference-quickstart
api_description: lets you analyze the performance and cost-efficiency of your inference
workloads, and make data-driven decisions about resource allocation and model
deployment strategies.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-gkerecommender/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-gkerecommender/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-gkerecommender
api_id: gkerecommender.googleapis.com
@@ -1255,7 +1146,6 @@ libraries:
library_name: grafeas
GAPICs:
- proto_path: grafeas/v1
-
- api_shortname: gsuiteaddons
name_pretty: Google Workspace Add-ons API
product_documentation: https://developers.google.com/workspace/add-ons/overview
@@ -1271,14 +1161,11 @@ libraries:
- proto_path: google/apps/script/type/gmail
- proto_path: google/apps/script/type/sheets
- proto_path: google/apps/script/type/slides
-
- api_shortname: hypercomputecluster
name_pretty: Cluster Director API
- product_documentation:
- https://cloud.google.com/blog/products/compute/managed-slurm-and-other-cluster-director-enhancements
+ product_documentation: https://cloud.google.com/blog/products/compute/managed-slurm-and-other-cluster-director-enhancements
api_description: simplifies cluster management across compute, network, and storage
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-hypercomputecluster/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-hypercomputecluster/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-hypercomputecluster
api_id: hypercomputecluster.googleapis.com
@@ -1304,7 +1191,6 @@ libraries:
- proto_path: google/iam/v2beta
- proto_path: google/iam/v3
- proto_path: google/iam/v3beta
-
- api_shortname: iam-admin
name_pretty: IAM Admin API
product_documentation: https://cloud.google.com/iam/docs/apis
@@ -1314,7 +1200,6 @@ libraries:
api_id: iam.googleapis.com
GAPICs:
- proto_path: google/iam/admin/v1
-
- api_shortname: iamcredentials
name_pretty: IAM Service Account Credentials API
product_documentation: https://cloud.google.com/iam/credentials/reference/rest/
@@ -1325,7 +1210,6 @@ libraries:
issue_tracker: https://issuetracker.google.com/issues/new?component=187161&template=0
GAPICs:
- proto_path: google/iam/credentials/v1
-
- api_shortname: iap
name_pretty: Cloud Identity-Aware Proxy API
product_documentation: https://cloud.google.com/iap
@@ -1348,7 +1232,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/ids/v1
-
- api_shortname: infra-manager
name_pretty: Infrastructure Manager API
product_documentation: https://cloud.google.com/infrastructure-manager/docs/overview
@@ -1357,7 +1240,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/config/v1
-
- api_shortname: cloudiot
name_pretty: Cloud Internet of Things (IoT) Core
product_documentation: https://cloud.google.com/iot
@@ -1374,8 +1256,7 @@ libraries:
name_pretty: Merchant Issue Resolution API
product_documentation: https://developers.google.com/merchant/api
api_description: Programatically manage your Merchant Issues
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-issue-resolution/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-issue-resolution/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-issue-resolution
api_id: merchantapi.googleapis.com
@@ -1387,13 +1268,11 @@ libraries:
- proto_path: google/shopping/merchant/issueresolution/v1beta
library_name: java-shopping-merchant-issue-resolution
requires_billing: true
-
- api_shortname: merchantapi
name_pretty: Merchant Order Tracking API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center Accounts
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-order-tracking/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-order-tracking/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-order-tracking
api_id: merchantapi.googleapis.com
@@ -1405,7 +1284,6 @@ libraries:
- proto_path: google/shopping/merchant/ordertracking/v1beta
library_name: java-shopping-merchant-order-tracking
requires_billing: true
-
- api_shortname: cloudkms
name_pretty: Cloud Key Management Service
product_documentation: https://cloud.google.com/kms
@@ -1421,7 +1299,6 @@ libraries:
issue_tracker: https://issuetracker.google.com/savedsearches/5264932
GAPICs:
- proto_path: google/cloud/kms/v1
-
- api_shortname: kmsinventory
name_pretty: KMS Inventory API
product_documentation: https://cloud.google.com/kms/docs/
@@ -1430,7 +1307,6 @@ libraries:
rpc_documentation: https://cloud.google.com/kms/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/kms/inventory/v1
-
- api_shortname: language
name_pretty: Natural Language
product_documentation: https://cloud.google.com/natural-language/docs/
@@ -1446,14 +1322,12 @@ libraries:
- proto_path: google/cloud/language/v1
- proto_path: google/cloud/language/v1beta2
- proto_path: google/cloud/language/v2
-
- api_shortname: licensemanager
name_pretty: License Manager API
product_documentation: https://cloud.google.com/compute/docs/instances/windows/ms-licensing
api_description: License Manager is a tool to manage and track third-party licenses
on Google Cloud.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-licensemanager/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-licensemanager/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-licensemanager
api_id: licensemanager.googleapis.com
@@ -1473,15 +1347,13 @@ libraries:
rpc_documentation: https://cloud.google.com/life-sciences/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/lifesciences/v2beta
-
- api_shortname: locationfinder
name_pretty: Cloud Location Finder API
product_documentation: https://cloud.google.com/location-finder/docs/overview
api_description: Cloud Location Finder is a public API that offers a repository
of all Google Cloud and Google Distributed Cloud locations, as well as cloud locations
for other cloud providers.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-locationfinder/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-locationfinder/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-locationfinder
api_id: locationfinder.googleapis.com
@@ -1492,6 +1364,26 @@ libraries:
- proto_path: google/cloud/locationfinder/v1
requires_billing: true
rpc_documentation: https://cloud.google.com/locationfinder/docs/reference/rest
+- api_shortname: logging
+ name_pretty: Cloud Logging
+ product_documentation: https://cloud.google.com/logging/docs
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-logging/latest/history
+ issue_tracker: https://issuetracker.google.com/savedsearches/559764
+ release_level: stable
+ language: java
+ distribution_name: com.google.cloud:google-cloud-logging
+ api_id: logging.googleapis.com
+ transport: grpc
+ library_type: GAPIC_COMBO
+ api_description: allows you to store, search, analyze, monitor, and alert on log
+ data and events from Google Cloud and Amazon Web Services. Using the BindPlane
+ service, you can also collect this data from over 150 common application components,
+ on-premises systems, and hybrid cloud systems. BindPlane is included with your
+ Google Cloud project at no additional cost.
+ codeowner_team: '@googleapis/cloud-java-team-teamsync'
+ recommended_package: com.google.cloud.logging
+ GAPICs:
+ - proto_path: google/logging/v2
- api_shortname: lustre
name_pretty: Google Cloud Managed Lustre API
product_documentation: https://cloud.google.com/managed-lustre/docs
@@ -1512,8 +1404,7 @@ libraries:
product_documentation: https://cloud.google.com/unified-maintenance/docs/overview
api_description: The Maintenance API provides a centralized view of planned disruptive
maintenance events across supported Google Cloud products.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-maintenance/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-maintenance/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-maintenance
api_id: maintenance.googleapis.com
@@ -1538,13 +1429,11 @@ libraries:
GAPICs:
- proto_path: google/cloud/managedidentities/v1
- proto_path: google/cloud/managedidentities/v1beta1
-
- api_shortname: managedkafka
name_pretty: Managed Service for Apache Kafka
product_documentation: https://cloud.google.com/managed-kafka
api_description: Manage Apache Kafka clusters and resources.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-managedkafka/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-managedkafka/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-managedkafka
api_id: managedkafka.googleapis.com
@@ -1566,13 +1455,11 @@ libraries:
distribution_name: com.google.maps:google-maps-addressvalidation
GAPICs:
- proto_path: google/maps/addressvalidation/v1
-
- api_shortname: maps-area-insights
name_pretty: Places Insights API
product_documentation: https://developers.google.com/maps/documentation/places-insights
api_description: Places Insights API.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-maps-area-insights/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-maps-area-insights/latest/overview
release_level: preview
distribution_name: com.google.maps:google-maps-area-insights
api_id: maps-area-insights.googleapis.com
@@ -1584,14 +1471,12 @@ libraries:
requires_billing: true
- api_shortname: maps-fleetengine
name_pretty: Local Rides and Deliveries API
- product_documentation:
- https://developers.google.com/maps/documentation/transportation-logistics/mobility
+ product_documentation: https://developers.google.com/maps/documentation/transportation-logistics/mobility
api_description: Enables Fleet Engine for access to the On Demand Rides and Deliveries
and Last Mile Fleet Solution APIs. Customer's use of Google Maps Content in the
Cloud Logging Services is subject to the Google Maps Platform Terms of Service
located at https://cloud.google.com/maps-platform/terms.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-maps-fleetengine/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-maps-fleetengine/latest/overview
release_level: preview
distribution_name: com.google.maps:google-maps-fleetengine
api_id: maps-fleetengine.googleapis.com
@@ -1603,14 +1488,12 @@ libraries:
requires_billing: true
- api_shortname: maps-fleetengine-delivery
name_pretty: Last Mile Fleet Solution Delivery API
- product_documentation:
- https://developers.google.com/maps/documentation/transportation-logistics/mobility
+ product_documentation: https://developers.google.com/maps/documentation/transportation-logistics/mobility
api_description: Enables Fleet Engine for access to the On Demand Rides and Deliveries
and Last Mile Fleet Solution APIs. Customer's use of Google Maps Content in the
Cloud Logging Services is subject to the Google Maps Platform Terms of Service
located at https://cloud.google.com/maps-platform/terms.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-maps-fleetengine-delivery/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-maps-fleetengine-delivery/latest/overview
release_level: preview
distribution_name: com.google.maps:google-maps-fleetengine-delivery
api_id: maps-fleetengine-delivery.googleapis.com
@@ -1623,15 +1506,14 @@ libraries:
- api_shortname: maps-mapsplatformdatasets
name_pretty: Maps Platform Datasets API
product_documentation: https://developers.google.com/maps/documentation
- api_description: "The Maps Platform Datasets API enables developers to ingest geospatially-tied
- datasets\n that they can use to enrich their experience of Maps Platform solutions
- (e.g. styling, routing)."
+ api_description: "The Maps Platform Datasets API enables developers to ingest geospatially-tied\
+ \ datasets\n that they can use to enrich their experience of Maps Platform\
+ \ solutions (e.g. styling, routing)."
api_id: mapsplatformdatasets.googleapis.com
distribution_name: com.google.maps:google-maps-mapsplatformdatasets
cloud_api: false
GAPICs:
- proto_path: google/maps/mapsplatformdatasets/v1
-
- api_shortname: maps-places
name_pretty: Places API (New)
product_documentation: https://developers.google.com/maps/documentation/places/web-service/
@@ -1642,15 +1524,13 @@ libraries:
cloud_api: false
GAPICs:
- proto_path: google/maps/places/v1
-
- api_shortname: routeoptimization
name_pretty: Route Optimization API
product_documentation: https://developers.google.com/maps/documentation/route-optimization
api_description: The Route Optimization API assigns tasks and routes to a vehicle
fleet, optimizing against the objectives and constraints that you supply for your
transportation goals.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-maps-routeoptimization/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-maps-routeoptimization/latest/overview
release_level: preview
distribution_name: com.google.maps:google-maps-routeoptimization
api_id: routeoptimization.googleapis.com
@@ -1661,10 +1541,8 @@ libraries:
- proto_path: google/maps/routeoptimization/v1
library_name: maps-routeoptimization
requires_billing: true
- rest_documentation:
- https://developers.google.com/maps/documentation/route-optimization/reference/rest/
- rpc_documentation:
- https://developers.google.com/maps/documentation/route-optimization/reference/rpc
+ rest_documentation: https://developers.google.com/maps/documentation/route-optimization/reference/rest/
+ rpc_documentation: https://developers.google.com/maps/documentation/route-optimization/reference/rpc
- api_shortname: maps-routing
name_pretty: Routes API
product_documentation: https://developers.google.com/maps/documentation/routes
@@ -1678,7 +1556,6 @@ libraries:
cloud_api: false
GAPICs:
- proto_path: google/maps/routing/v2
-
- api_shortname: maps-solar
name_pretty: Solar API
product_documentation: https://developers.google.com/maps/documentation/solar/overview
@@ -1722,7 +1599,6 @@ libraries:
requires_billing: false
GAPICs:
- proto_path: google/cloud/mediatranslation/v1beta1
-
- api_shortname: meet
name_pretty: Google Meet API
product_documentation: https://developers.google.com/meet/api/guides/overview
@@ -1731,7 +1607,6 @@ libraries:
GAPICs:
- proto_path: google/apps/meet/v2
- proto_path: google/apps/meet/v2beta
-
- api_shortname: memcache
name_pretty: Cloud Memcache
product_documentation: https://cloud.google.com/memorystore/
@@ -1741,7 +1616,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/memcache/v1
- proto_path: google/cloud/memcache/v1beta2
-
- api_shortname: migrationcenter
name_pretty: Migration Center API
product_documentation: https://cloud.google.com/migration-center/docs/migration-center-overview
@@ -1750,15 +1624,13 @@ libraries:
cloud environments to Google Cloud
GAPICs:
- proto_path: google/cloud/migrationcenter/v1
-
- api_shortname: modelarmor
name_pretty: Model Armor API
product_documentation: https://cloud.google.com/security-command-center/docs/model-armor-overview
api_description: Model Armor helps you protect against risks like prompt injection,
harmful content, and data leakage in generative AI applications by letting you
define policies that filter user prompts and model responses.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-modelarmor/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-modelarmor/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-modelarmor
api_id: modelarmor.googleapis.com
@@ -1782,7 +1654,6 @@ libraries:
issue_tracker: https://issuetracker.google.com/savedsearches/559785
GAPICs:
- proto_path: google/monitoring/v3
-
- api_shortname: monitoring-dashboards
name_pretty: Monitoring Dashboards
product_documentation: https://cloud.google.com/monitoring/charts/dashboards
@@ -1795,18 +1666,15 @@ libraries:
api_id: monitoring.googleapis.com
GAPICs:
- proto_path: google/monitoring/dashboard/v1
-
- api_shortname: monitoring-metricsscope
name_pretty: Monitoring Metrics Scopes
- product_documentation:
- https://cloud.google.com/monitoring/api/ref_v3/rest/v1/locations.global.metricsScopes
+ product_documentation: https://cloud.google.com/monitoring/api/ref_v3/rest/v1/locations.global.metricsScopes
api_description: The metrics scope defines the set of Google Cloud projects whose
metrics the current Google Cloud project can access.
api_id: monitoring.googleapis.com
distribution_name: com.google.cloud:google-cloud-monitoring-metricsscope
GAPICs:
- proto_path: google/monitoring/metricsscope/v1
-
- api_shortname: netapp
name_pretty: NetApp API
product_documentation: https://cloud.google.com/netapp/volumes/docs/discover/overview
@@ -1815,11 +1683,9 @@ libraries:
scalable performance with global availability.
GAPICs:
- proto_path: google/cloud/netapp/v1
-
- api_shortname: networkmanagement
name_pretty: Network Management API
- product_documentation:
- https://cloud.google.com/network-intelligence-center/docs/connectivity-tests/reference/networkmanagement/rest/
+ product_documentation: https://cloud.google.com/network-intelligence-center/docs/connectivity-tests/reference/networkmanagement/rest/
api_description: provides a collection of network performance monitoring and diagnostic
capabilities.
library_name: network-management
@@ -1827,7 +1693,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/networkmanagement/v1
- proto_path: google/cloud/networkmanagement/v1beta1
-
- api_shortname: networksecurity
name_pretty: Network Security API
product_documentation: https://cloud.google.com/traffic-director/docs/reference/network-security/rest
@@ -1837,7 +1702,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/networksecurity/v1
- proto_path: google/cloud/networksecurity/v1beta1
-
- api_shortname: networkconnectivity
name_pretty: Network Connectivity Center
product_documentation: https://cloud.google.com/network-connectivity/docs
@@ -1848,7 +1712,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/networkconnectivity/v1
- proto_path: google/cloud/networkconnectivity/v1alpha1
-
- api_shortname: networkservices
name_pretty: Network Services API
product_documentation: https://cloud.google.com/products/networking
@@ -1856,8 +1719,7 @@ libraries:
on top of planet-scale infrastructure that leverages automation, advanced AI,
and programmability, enabling enterprises to connect, scale, secure, modernize
and optimize their infrastructure.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-networkservices/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-networkservices/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-networkservices
api_id: networkservices.googleapis.com
@@ -1880,7 +1742,6 @@ libraries:
- proto_path: google/cloud/notebooks/v1
- proto_path: google/cloud/notebooks/v1beta1
- proto_path: google/cloud/notebooks/v2
-
- api_shortname: cloudoptimization
name_pretty: Cloud Fleet Routing
product_documentation: https://cloud.google.com/optimization/docs
@@ -1893,14 +1754,12 @@ libraries:
rpc_documentation: https://cloud.google.com/optimization/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/optimization/v1
-
- api_shortname: oracledatabase
name_pretty: Oracle Database@Google Cloud API
product_documentation: https://cloud.google.com/oracle/database/docs
api_description: The Oracle Database@Google Cloud API provides a set of APIs to
manage Oracle database services, such as Exadata and Autonomous Databases.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-oracledatabase/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-oracledatabase/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-oracledatabase
api_id: oracledatabase.googleapis.com
@@ -1925,18 +1784,15 @@ libraries:
GAPICs:
- proto_path: google/cloud/orchestration/airflow/service/v1
- proto_path: google/cloud/orchestration/airflow/service/v1beta1
-
- api_shortname: orgpolicy
name_pretty: Cloud Organization Policy
product_documentation: n/a
api_description: n/a
release_level: stable
- client_documentation:
- https://cloud.google.com/java/docs/reference/proto-google-cloud-orgpolicy-v1/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/proto-google-cloud-orgpolicy-v1/latest/overview
GAPICs:
- proto_path: google/cloud/orgpolicy/v1
- proto_path: google/cloud/orgpolicy/v2
-
- api_shortname: osconfig
name_pretty: OS Config API
product_documentation: https://cloud.google.com/compute/docs/os-patch-management
@@ -1950,7 +1806,6 @@ libraries:
- proto_path: google/cloud/osconfig/v1
- proto_path: google/cloud/osconfig/v1alpha
- proto_path: google/cloud/osconfig/v1beta
-
- api_shortname: oslogin
name_pretty: Cloud OS Login
product_documentation: https://cloud.google.com/compute/docs/oslogin/
@@ -1961,14 +1816,12 @@ libraries:
GAPICs:
- proto_path: google/cloud/oslogin/v1
- proto_path: google/cloud/oslogin/v1beta
-
- api_shortname: parallelstore
name_pretty: Parallelstore API
product_documentation: https://cloud/parallelstore?hl=en
api_description: 'Parallelstore is based on Intel DAOS and delivers up to 6.3x greater
read throughput performance compared to competitive Lustre scratch offerings. '
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-parallelstore/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-parallelstore/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-parallelstore
api_id: parallelstore.googleapis.com
@@ -1986,8 +1839,7 @@ libraries:
to store, access and manage the lifecycle of your workload parameters. Parameter Manager
aims to make management of sensitive application parameters effortless for
customers without diminishing focus on security.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-parametermanager/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-parametermanager/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-parametermanager
api_id: parametermanager.googleapis.com
@@ -2009,7 +1861,6 @@ libraries:
requires_billing: false
GAPICs:
- proto_path: google/cloud/phishingprotection/v1beta1
-
- api_shortname: policytroubleshooter
name_pretty: IAM Policy Troubleshooter API
product_documentation: https://cloud.google.com/iam/docs/troubleshooting-access
@@ -2025,7 +1876,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/policytroubleshooter/v1
- proto_path: google/cloud/policytroubleshooter/iam/v3
-
- api_shortname: policysimulator
name_pretty: Policy Simulator API
product_documentation: https://cloud.google.com/policysimulator/docs/overview
@@ -2033,7 +1883,6 @@ libraries:
and viewing a Replay.
GAPICs:
- proto_path: google/cloud/policysimulator/v1
-
- api_shortname: cloudprivatecatalog
name_pretty: Private Catalog
product_documentation: https://cloud.google.com/private-catalog/docs
@@ -2044,11 +1893,9 @@ libraries:
api_id: privatecatalog.googleapis.com
GAPICs:
- proto_path: google/cloud/privatecatalog/v1beta1
-
- api_shortname: privilegedaccessmanager
name_pretty: Privileged Access Manager API
- product_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-privilegedaccessmanager/latest/overview
+ product_documentation: https://cloud.google.com/java/docs/reference/google-cloud-privilegedaccessmanager/latest/overview
api_description: Privileged Access Manager (PAM) helps you on your journey towards
least privilege and helps mitigate risks tied to privileged access misuse orabuse.
PAM allows you to shift from always-on standing privileges towards on-demand access
@@ -2061,8 +1908,7 @@ libraries:
access for developers for critical deployment or maintenance, temporary access
for operators for data ingestion and audits, JIT access to service accounts for
automated tasks, and more.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-privilegedaccessmanager/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-privilegedaccessmanager/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-privilegedaccessmanager
api_id: privilegedaccessmanager.googleapis.com
@@ -2086,7 +1932,6 @@ libraries:
api_id: cloudprofiler.googleapis.com
GAPICs:
- proto_path: google/devtools/cloudprofiler/v2
-
- api_shortname: publicca
name_pretty: Public Certificate Authority API
product_documentation: https://cloud.google.com/certificate-manager/docs/public-ca
@@ -2098,14 +1943,12 @@ libraries:
GAPICs:
- proto_path: google/cloud/security/publicca/v1beta1
- proto_path: google/cloud/security/publicca/v1
-
- api_shortname: rapidmigrationassessment
name_pretty: Rapid Migration Assessment API
product_documentation: https://cloud.google.com/migration-center/docs
api_description: Rapid Migration Assessment API
GAPICs:
- proto_path: google/cloud/rapidmigrationassessment/v1
-
- api_shortname: recaptchaenterprise
name_pretty: reCAPTCHA Enterprise
product_documentation: https://cloud.google.com/recaptcha-enterprise/docs/
@@ -2118,7 +1961,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/recaptchaenterprise/v1
- proto_path: google/cloud/recaptchaenterprise/v1beta1
-
- api_shortname: recommendationengine
name_pretty: Recommendations AI
product_documentation: https://cloud.google.com/recommendations-ai/
@@ -2126,7 +1968,6 @@ libraries:
library_name: recommendations-ai
GAPICs:
- proto_path: google/cloud/recommendationengine/v1beta1
-
- api_shortname: recommender
name_pretty: Recommender
product_documentation: https://cloud.google.com/recommendations/
@@ -2136,7 +1977,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/recommender/v1
- proto_path: google/cloud/recommender/v1beta1
-
- api_shortname: redis
name_pretty: Cloud Redis
product_documentation: https://cloud.google.com/memorystore/docs/redis/
@@ -2149,7 +1989,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/redis/v1
- proto_path: google/cloud/redis/v1beta1
-
- api_shortname: redis-cluster
name_pretty: Google Cloud Memorystore for Redis API
product_documentation: https://cloud.google.com/memorystore/docs/cluster
@@ -2157,7 +1996,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/redis/cluster/v1
- proto_path: google/cloud/redis/cluster/v1beta1
-
- api_shortname: cloudresourcemanager
name_pretty: Resource Manager API
product_documentation: https://cloud.google.com/resource-manager
@@ -2169,7 +2007,6 @@ libraries:
issue_tracker: https://issuetracker.google.com/savedsearches/559757
GAPICs:
- proto_path: google/cloud/resourcemanager/v3
-
- api_shortname: retail
name_pretty: Cloud Retail
product_documentation: https://cloud.google.com/solutions/retail
@@ -2179,7 +2016,6 @@ libraries:
- proto_path: google/cloud/retail/v2
- proto_path: google/cloud/retail/v2alpha
- proto_path: google/cloud/retail/v2beta
-
- api_shortname: run
name_pretty: Cloud Run
product_documentation: https://cloud.google.com/run/docs
@@ -2189,13 +2025,11 @@ libraries:
rpc_documentation: https://cloud.google.com/run/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/run/v2
-
- api_shortname: saasservicemgmt
name_pretty: SaaS Runtime API
product_documentation: https://cloud.google.com/saas-runtime/docs/overview
api_description: "Model, deploy, and operate your SaaS at scale.\t"
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-saasservicemgmt/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-saasservicemgmt/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-saasservicemgmt
api_id: saasservicemgmt.googleapis.com
@@ -2223,7 +2057,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/scheduler/v1
- proto_path: google/cloud/scheduler/v1beta1
-
- api_shortname: secretmanager
name_pretty: Secret Management
product_documentation: https://cloud.google.com/solutions/secrets-management/
@@ -2234,18 +2067,15 @@ libraries:
GAPICs:
- proto_path: google/cloud/secretmanager/v1
- proto_path: google/cloud/secretmanager/v1beta2
- # v1beta1's version is in a different proto path from the rest
- proto_path: google/cloud/secrets/v1beta1
-
- api_shortname: securesourcemanager
name_pretty: Secure Source Manager API
product_documentation: https://cloud.google.com/secure-source-manager/docs/overview
- api_description: "Regionally deployed, single-tenant managed source code repository
- hosted on\n Google Cloud."
+ api_description: "Regionally deployed, single-tenant managed source code repository\
+ \ hosted on\n Google Cloud."
release_level: stable
GAPICs:
- proto_path: google/cloud/securesourcemanager/v1
-
- api_shortname: privateca
name_pretty: Certificate Authority Service
product_documentation: https://cloud.google.com/certificate-authority-service/docs
@@ -2259,8 +2089,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/security/privateca/v1
- proto_path: google/cloud/security/privateca/v1beta1
-
-# duplicated api_shortname
- api_shortname: securitycenter
name_pretty: Security Command Center
product_documentation: https://cloud.google.com/security-command-center
@@ -2280,7 +2108,6 @@ libraries:
- proto_path: google/cloud/securitycenter/v1beta1
- proto_path: google/cloud/securitycenter/v1p1beta1
- proto_path: google/cloud/securitycenter/v2
-
- api_shortname: securitycenter
name_pretty: Security Command Center Settings API
product_documentation: https://cloud.google.com/security-command-center/
@@ -2293,7 +2120,6 @@ libraries:
rest_documentation: https://cloud.google.com/security-command-center/docs/reference/rest
GAPICs:
- proto_path: google/cloud/securitycenter/settings/v1beta1
-
- api_shortname: securitycentermanagement
name_pretty: Security Center Management API
product_documentation: https://cloud.google.com/securitycentermanagement/docs/overview
@@ -2301,7 +2127,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/securitycentermanagement/v1
-
- api_shortname: securityposture
name_pretty: Security Posture API
product_documentation: https://cloud.google.com/security-command-center/docs/security-posture-overview
@@ -2312,7 +2137,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/securityposture/v1
-
- api_shortname: servicecontrol
name_pretty: Service Control API
product_documentation: https://cloud.google.com/service-infrastructure/docs/overview/
@@ -2324,7 +2148,6 @@ libraries:
GAPICs:
- proto_path: google/api/servicecontrol/v1
- proto_path: google/api/servicecontrol/v2
-
- api_shortname: servicemanagement
name_pretty: Service Management API
product_documentation: https://cloud.google.com/service-infrastructure/docs/overview/
@@ -2338,7 +2161,6 @@ libraries:
api_id: servicemanagement.googleapis.com
GAPICs:
- proto_path: google/api/servicemanagement/v1
-
- api_shortname: serviceusage
name_pretty: Service Usage
product_documentation: https://cloud.google.com/service-usage/docs/overview
@@ -2349,7 +2171,6 @@ libraries:
GAPICs:
- proto_path: google/api/serviceusage/v1
- proto_path: google/api/serviceusage/v1beta1
-
- api_shortname: servicedirectory
name_pretty: Service Directory
product_documentation: https://cloud.google.com/service-directory/
@@ -2361,7 +2182,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/servicedirectory/v1
- proto_path: google/cloud/servicedirectory/v1beta1
-
- api_shortname: servicehealth
name_pretty: Service Health API
product_documentation: https://cloud.google.com/service-health/docs/overview
@@ -2370,7 +2190,6 @@ libraries:
rpc_documentation: https://cloud.google.com/service-health/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/servicehealth/v1
-
- api_shortname: cloudshell
name_pretty: Cloud Shell
product_documentation: https://cloud.google.com/shell/docs
@@ -2384,7 +2203,6 @@ libraries:
rpc_documentation: https://cloud.google.com/shell/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/shell/v1
-
- api_shortname: css
name_pretty: CSS API
product_documentation: https://developers.google.com/comparison-shopping-services/api
@@ -2395,14 +2213,11 @@ libraries:
distribution_name: com.google.shopping:google-shopping-css
GAPICs:
- proto_path: google/shopping/css/v1
-
- # duplicated api_shortname
- api_shortname: merchantapi
name_pretty: Merchant API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center accounts.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-accounts/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-accounts/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-accounts
api_id: merchantapi.googleapis.com
@@ -2418,8 +2233,7 @@ libraries:
name_pretty: Merchant Conversions API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center accounts.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-conversions/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-conversions/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-conversions
api_id: shopping-merchant-conversions.googleapis.com
@@ -2430,13 +2244,11 @@ libraries:
- proto_path: google/shopping/merchant/conversions/v1
- proto_path: google/shopping/merchant/conversions/v1beta
requires_billing: true
-
- api_shortname: merchantapi
name_pretty: Merchant API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center accounts.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-datasources/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-datasources/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-datasources
api_id: merchantapi.googleapis.com
@@ -2463,8 +2275,7 @@ libraries:
name_pretty: Merchant LFP API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center accounts.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-lfp/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-lfp/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-lfp
api_id: shopping-merchant-lfp.googleapis.com
@@ -2475,13 +2286,11 @@ libraries:
- proto_path: google/shopping/merchant/lfp/v1
- proto_path: google/shopping/merchant/lfp/v1beta
requires_billing: true
-
- api_shortname: shopping-merchant-notifications
name_pretty: Merchant Notifications API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center accounts.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-notifications/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-notifications/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-notifications
api_id: shopping-merchant-notifications.googleapis.com
@@ -2496,8 +2305,7 @@ libraries:
name_pretty: Merchant API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your products.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-productstudio/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-productstudio/latest/overview
release_level: preview
distribution_name: com.google.shopping:google-shopping-merchant-productstudio
api_id: merchantapi.googleapis.com
@@ -2512,8 +2320,7 @@ libraries:
name_pretty: Merchant API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center accounts.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-products/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-products/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-products
api_id: merchantapi.googleapis.com
@@ -2528,8 +2335,7 @@ libraries:
name_pretty: Merchant API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center accounts.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-promotions/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-promotions/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-promotions
api_id: merchantapi.googleapis.com
@@ -2545,8 +2351,7 @@ libraries:
name_pretty: Merchant Quota API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center accounts.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-quota/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-quota/latest/overview
release_level: stable
distribution_name: com.google.shopping:google-shopping-merchant-quota
api_id: shopping-merchant-quota.googleapis.com
@@ -2557,7 +2362,6 @@ libraries:
- proto_path: google/shopping/merchant/quota/v1
- proto_path: google/shopping/merchant/quota/v1beta
requires_billing: true
-
- api_shortname: merchantapi
name_pretty: Merchant API
product_documentation: https://developers.google.com/merchant/api
@@ -2570,13 +2374,11 @@ libraries:
- proto_path: google/shopping/merchant/reports/v1
- proto_path: google/shopping/merchant/reports/v1beta
- proto_path: google/shopping/merchant/reports/v1alpha
-
- api_shortname: merchantapi
name_pretty: Merchant API
product_documentation: https://developers.google.com/merchant/api
api_description: Programmatically manage your Merchant Center Accounts.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-shopping-merchant-reviews/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-shopping-merchant-reviews/latest/overview
release_level: preview
distribution_name: com.google.shopping:google-shopping-merchant-reviews
library_type: GAPIC_AUTO
@@ -2586,16 +2388,13 @@ libraries:
- proto_path: google/shopping/merchant/reviews/v1beta
requires_billing: true
library_name: shopping-merchant-reviews
-
- api_shortname: spanneradapter
name_pretty: Cloud Spanner Adapter API
- product_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-spanneradapter/latest/overview
+ product_documentation: https://cloud.google.com/java/docs/reference/google-cloud-spanneradapter/latest/overview
api_description: The Cloud Spanner Adapter service allows native drivers of supported database
dialects to interact directly with Cloud Spanner by wrapping the underlying wire
protocol used by the driver in a gRPC stream.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-spanneradapter/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-spanneradapter/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-spanneradapter
api_id: spanneradapter.googleapis.com
@@ -2620,7 +2419,6 @@ libraries:
- proto_path: google/cloud/speech/v1
- proto_path: google/cloud/speech/v1p1beta1
- proto_path: google/cloud/speech/v2
-
- api_shortname: storagetransfer
name_pretty: Storage Transfer Service
product_documentation: https://cloud.google.com/storage-transfer-service
@@ -2630,15 +2428,13 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/storagetransfer/v1
-
- api_shortname: storagebatchoperations
name_pretty: Storage Batch Operations API
product_documentation: https://cloud.google.com/storage/docs/batch-operations/overview
api_description: Storage batch operations is a Cloud Storage management feature
that performs operations on billions of Cloud Storage objects in a serverless
manner.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-storagebatchoperations/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-storagebatchoperations/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-storagebatchoperations
api_id: storagebatchoperations.googleapis.com
@@ -2654,7 +2450,6 @@ libraries:
api_description: Provides insights capability on Google Cloud Storage
GAPICs:
- proto_path: google/cloud/storageinsights/v1
-
- api_shortname: jobs
name_pretty: Talent Solution
product_documentation: https://cloud.google.com/solutions/talent-solution/
@@ -2670,7 +2465,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/talent/v4
- proto_path: google/cloud/talent/v4beta1
-
- api_shortname: cloudtasks
name_pretty: Cloud Tasks
product_documentation: https://cloud.google.com/tasks/docs/
@@ -2688,7 +2482,6 @@ libraries:
- proto_path: google/cloud/tasks/v2
- proto_path: google/cloud/tasks/v2beta2
- proto_path: google/cloud/tasks/v2beta3
-
- api_shortname: telcoautomation
name_pretty: Telco Automation API
product_documentation: https://cloud.google.com/telecom-network-automation
@@ -2698,7 +2491,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/telcoautomation/v1
- proto_path: google/cloud/telcoautomation/v1alpha1
-
- api_shortname: texttospeech
name_pretty: Cloud Text-to-Speech
product_documentation: https://cloud.google.com/text-to-speech
@@ -2713,7 +2505,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/texttospeech/v1
- proto_path: google/cloud/texttospeech/v1beta1
-
- api_shortname: tpu
name_pretty: Cloud TPU
product_documentation: https://cloud.google.com/tpu/docs
@@ -2725,7 +2516,6 @@ libraries:
- proto_path: google/cloud/tpu/v1
- proto_path: google/cloud/tpu/v2
- proto_path: google/cloud/tpu/v2alpha1
-
- api_shortname: cloudtrace
name_pretty: Stackdriver Trace
product_documentation: https://cloud.google.com/trace/docs/
@@ -2739,7 +2529,6 @@ libraries:
GAPICs:
- proto_path: google/devtools/cloudtrace/v1
- proto_path: google/devtools/cloudtrace/v2
-
- api_shortname: translate
name_pretty: Cloud Translation
product_documentation: https://cloud.google.com/translate/docs/
@@ -2754,14 +2543,12 @@ libraries:
GAPICs:
- proto_path: google/cloud/translate/v3
- proto_path: google/cloud/translate/v3beta1
-
- api_shortname: memorystore
name_pretty: Memorystore API
product_documentation: https://cloud.google.com/memorystore/docs/valkey
api_description: Memorystore for Valkey is a fully managed Valkey Cluster service
for Google Cloud.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-memorystore/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-memorystore/latest/overview
release_level: stable
api_id: memorystore.googleapis.com
library_type: GAPIC_AUTO
@@ -2784,8 +2571,7 @@ libraries:
with associated metadata, automatically generate embeddings from your data, and
perform fast approximate nearest neighbor (ANN) searches to find semantically
similar items at scale.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-vectorsearch/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-vectorsearch/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-vectorsearch
api_id: vectorsearch.googleapis.com
@@ -2811,7 +2597,6 @@ libraries:
- proto_path: google/cloud/videointelligence/v1p1beta1
- proto_path: google/cloud/videointelligence/v1p2beta1
- proto_path: google/cloud/videointelligence/v1p3beta1
-
- api_shortname: livestream
name_pretty: Live Stream API
product_documentation: https://cloud.google.com/livestream/
@@ -2822,7 +2607,6 @@ libraries:
distribution_name: com.google.cloud:google-cloud-live-stream
GAPICs:
- proto_path: google/cloud/video/livestream/v1
-
- api_shortname: videostitcher
name_pretty: Video Stitcher API
product_documentation: https://cloud.google.com/video-stitcher/
@@ -2832,7 +2616,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/video/stitcher/v1
-
- api_shortname: transcoder
name_pretty: Video Transcoder
product_documentation: https://cloud.google.com/transcoder/docs
@@ -2846,7 +2629,6 @@ libraries:
rpc_documentation: https://cloud.google.com/transcoder/docs/reference/rpc
GAPICs:
- proto_path: google/cloud/video/transcoder/v1
-
- api_shortname: vision
name_pretty: Cloud Vision
product_documentation: https://cloud.google.com/vision/docs/
@@ -2863,14 +2645,12 @@ libraries:
- proto_path: google/cloud/vision/v1p2beta1
- proto_path: google/cloud/vision/v1p3beta1
- proto_path: google/cloud/vision/v1p4beta1
-
- api_shortname: visionai
name_pretty: Vision AI API
product_documentation: https://cloud.google.com/vision-ai/docs
api_description: Vertex AI Vision is an AI-powered platform to ingest, analyze and
store video data.
- client_documentation:
- https://cloud.google.com/java/docs/reference/google-cloud-visionai/latest/overview
+ client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-visionai/latest/overview
release_level: preview
distribution_name: com.google.cloud:google-cloud-visionai
api_id: visionai.googleapis.com
@@ -2890,7 +2670,6 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/vmmigration/v1
-
- api_shortname: vmwareengine
name_pretty: Google Cloud VMware Engine
product_documentation: https://cloud.google.com/vmware-engine/
@@ -2899,7 +2678,6 @@ libraries:
rest_documentation: https://cloud.google.com/vmware-engine/docs/reference/rest
GAPICs:
- proto_path: google/cloud/vmwareengine/v1
-
- api_shortname: vpcaccess
name_pretty: Serverless VPC Access
product_documentation: https://cloud.google.com/vpc/docs/serverless-vpc-access
@@ -2910,18 +2688,17 @@ libraries:
release_level: stable
GAPICs:
- proto_path: google/cloud/vpcaccess/v1
-
- api_shortname: webrisk
name_pretty: Web Risk
product_documentation: https://cloud.google.com/web-risk/docs/
- api_description: is a Google Cloud service that lets client applications check URLs
- against Google's constantly updated lists of unsafe web resources. Unsafe web
- resources include social engineering sites—such as phishing and deceptive sites—and
- sites that host malware or unwanted software. With the Web Risk API, you can quickly
- identify known bad sites, warn users before they click infected links, and prevent
- users from posting links to known infected pages from your site. The Web Risk
- API includes data on more than a million unsafe URLs and stays up to date by examining
- billions of URLs each day.
+ api_description: "is a Google Cloud service that lets client applications check\
+ \ URLs against Google's constantly updated lists of unsafe web resources. Unsafe\
+ \ web resources include social engineering sites\u2014such as phishing and deceptive\
+ \ sites\u2014and sites that host malware or unwanted software. With the Web Risk\
+ \ API, you can quickly identify known bad sites, warn users before they click\
+ \ infected links, and prevent users from posting links to known infected pages\
+ \ from your site. The Web Risk API includes data on more than a million unsafe\
+ \ URLs and stays up to date by examining billions of URLs each day."
release_level: stable
requires_billing: false
issue_tracker: ''
@@ -2930,7 +2707,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/webrisk/v1
- proto_path: google/cloud/webrisk/v1beta1
-
- api_shortname: websecurityscanner
name_pretty: Cloud Security Scanner
product_documentation: https://cloud.google.com/security-scanner/docs/
@@ -2945,7 +2721,6 @@ libraries:
- proto_path: google/cloud/websecurityscanner/v1
- proto_path: google/cloud/websecurityscanner/v1alpha
- proto_path: google/cloud/websecurityscanner/v1beta
-
- api_shortname: workflowexecutions
name_pretty: Cloud Workflow Executions
product_documentation: https://cloud.google.com/workflows
@@ -2958,7 +2733,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/workflows/executions/v1
- proto_path: google/cloud/workflows/executions/v1beta
-
- api_shortname: workflows
name_pretty: Cloud Workflows
product_documentation: https://cloud.google.com/workflows
@@ -2970,7 +2744,6 @@ libraries:
GAPICs:
- proto_path: google/cloud/workflows/v1
- proto_path: google/cloud/workflows/v1beta
-
- api_shortname: workspaceevents
name_pretty: Google Workspace Events API
product_documentation: https://developers.google.com/workspace/events
@@ -2980,7 +2753,6 @@ libraries:
GAPICs:
- proto_path: google/apps/events/subscriptions/v1
- proto_path: google/apps/events/subscriptions/v1beta
-
- api_shortname: workstations
name_pretty: Cloud Workstations
product_documentation: https://cloud.google.com/workstations
diff --git a/java-logging/.OwlBot-hermetic.yaml b/java-logging/.OwlBot-hermetic.yaml
new file mode 100644
index 000000000000..146fffa7eccd
--- /dev/null
+++ b/java-logging/.OwlBot-hermetic.yaml
@@ -0,0 +1,27 @@
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+deep-remove-regex:
+- /java-logging/grpc-google-.*/src
+- /java-logging/proto-google-.*/src
+- /java-logging/google-.*/src/v.*
+deep-preserve-regex:
+- /java-logging/google-.*/src/test/java/com/google/cloud/.*/v.*/it/IT.*Test.java
+deep-copy-regex:
+- source: /google/logging/(v.*)/.*-java/proto-google-.*/src
+ dest: /owl-bot-staging/java-logging/$1/proto-google-cloud-logging-$1/src
+- source: /google/logging/(v.*)/.*-java/grpc-google-.*/src
+ dest: /owl-bot-staging/java-logging/$1/grpc-google-cloud-logging-$1/src
+- source: /google/logging/(v.*)/.*-java/gapic-google-.*/src
+ dest: /owl-bot-staging/java-logging/$1/google-cloud-logging/src
diff --git a/java-logging/.cloudbuild/samples_build.yaml b/java-logging/.cloudbuild/samples_build.yaml
new file mode 100644
index 000000000000..018fdd1fcf9c
--- /dev/null
+++ b/java-logging/.cloudbuild/samples_build.yaml
@@ -0,0 +1,32 @@
+steps:
+- name: gcr.io/cloud-devrel-public-resources/java8
+ entrypoint: ls
+ args: [
+ '-alt',
+ ]
+- name: gcr.io/cloud-devrel-public-resources/java8
+ entrypoint: curl
+ args: [
+ '--header',
+ 'Metadata-Flavor: Google',
+ 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email'
+ ]
+- name: gcr.io/cloud-devrel-public-resources/java8
+ entrypoint: pwd
+- name: gcr.io/cloud-devrel-public-resources/java8
+ entrypoint: bash
+ args: [
+ '.kokoro/build.sh'
+ ]
+ env:
+ - 'JOB_TYPE=samples'
+ - 'GOOGLE_CLOUD_PROJECT=cloud-java-ci-sample'
+- name: gcr.io/cloud-devrel-public-resources/java8
+ entrypoint: echo
+ args: [
+ 'Sample job succeeded',
+ ]
+timeout: 3600s
+options:
+ defaultLogsBucketBehavior: REGIONAL_USER_OWNED_BUCKET
+
diff --git a/java-logging/.gitmodules b/java-logging/.gitmodules
new file mode 100644
index 000000000000..3ab2448e083f
--- /dev/null
+++ b/java-logging/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "env-tests-logging"]
+ path = env-tests-logging
+ url = https://github.com/googleapis/env-tests-logging
diff --git a/java-logging/.kokoro/build.bat b/java-logging/.kokoro/build.bat
new file mode 100644
index 000000000000..067cf4a4c489
--- /dev/null
+++ b/java-logging/.kokoro/build.bat
@@ -0,0 +1,18 @@
+:: Copyright 2022 Google LLC
+::
+:: Licensed under the Apache License, Version 2.0 (the "License");
+:: you may not use this file except in compliance with the License.
+:: You may obtain a copy of the License at
+::
+:: http://www.apache.org/licenses/LICENSE-2.0
+::
+:: Unless required by applicable law or agreed to in writing, software
+:: distributed under the License is distributed on an "AS IS" BASIS,
+:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+:: See the License for the specific language governing permissions and
+:: limitations under the License.
+:: Github action job to test core java library features on
+:: downstream client libraries before they are released.
+:: See documentation in type-shell-output.bat
+
+"C:\Program Files\Git\bin\bash.exe" %~dp0build.sh
diff --git a/java-logging/.kokoro/build.sh b/java-logging/.kokoro/build.sh
new file mode 100755
index 000000000000..7c267d2a6c43
--- /dev/null
+++ b/java-logging/.kokoro/build.sh
@@ -0,0 +1,135 @@
+#!/bin/bash
+# Copyright 2025 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -eo pipefail
+
+## Get the directory of the build script
+scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}"))
+## cd to the parent directory, i.e. the root of the git repo
+cd ${scriptDir}/..
+
+# include common functions
+source ${scriptDir}/common.sh
+
+# Print out Maven & Java version
+mvn -version
+echo ${JOB_TYPE}
+
+# attempt to install 3 times with exponential backoff (starting with 10 seconds)
+retry_with_backoff 3 10 \
+ mvn install -B -V -ntp \
+ -DskipTests=true \
+ -Dclirr.skip=true \
+ -Denforcer.skip=true \
+ -Dmaven.javadoc.skip=true \
+ -Dgcloud.download.skip=true \
+ -T 1C
+
+# if GOOGLE_APPLICATION_CREDENTIALS is specified as a relative path, prepend Kokoro root directory onto it
+if [[ ! -z "${GOOGLE_APPLICATION_CREDENTIALS}" && "${GOOGLE_APPLICATION_CREDENTIALS}" != /* ]]; then
+ export GOOGLE_APPLICATION_CREDENTIALS=$(realpath ${KOKORO_GFILE_DIR}/${GOOGLE_APPLICATION_CREDENTIALS})
+fi
+
+
+RETURN_CODE=0
+set +e
+
+case ${JOB_TYPE} in
+test)
+ echo "SUREFIRE_JVM_OPT: ${SUREFIRE_JVM_OPT}"
+ mvn test -B -ntp -Dfmt.skip=true -Dclirr.skip=true -Denforcer.skip=true ${SUREFIRE_JVM_OPT}
+ RETURN_CODE=$?
+ ;;
+lint)
+ mvn com.spotify.fmt:fmt-maven-plugin:check -B -ntp
+ RETURN_CODE=$?
+ ;;
+javadoc)
+ mvn javadoc:javadoc javadoc:test-javadoc -B -ntp -Dfmt.skip=true
+ RETURN_CODE=$?
+ ;;
+integration)
+ mvn -B ${INTEGRATION_TEST_ARGS} \
+ -ntp \
+ -Penable-integration-tests \
+ -DtrimStackTrace=false \
+ -Dclirr.skip=true \
+ -Denforcer.skip=true \
+ -Dcheckstyle.skip=true \
+ -DskipUnitTests=true \
+ -Dfmt.skip=true \
+ -fae \
+ verify
+ RETURN_CODE=$?
+ ;;
+graalvm)
+ # Run Unit and Integration Tests with Native Image
+ mvn -B ${INTEGRATION_TEST_ARGS} -ntp -Pnative test -Dfmt.skip=true
+ RETURN_CODE=$?
+ ;;
+samples)
+ SAMPLES_DIR=samples
+ # only run ITs in snapshot/ on presubmit PRs. run ITs in all 3 samples/ subdirectories otherwise.
+ if [[ ! -z ${KOKORO_GITHUB_PULL_REQUEST_NUMBER} ]]
+ then
+ SAMPLES_DIR=samples/snapshot
+ fi
+
+ if [[ -f ${SAMPLES_DIR}/pom.xml ]]
+ then
+ for FILE in ${KOKORO_GFILE_DIR}/secret_manager/*-samples-secrets; do
+ [[ -f "$FILE" ]] || continue
+ source "$FILE"
+ done
+
+ pushd ${SAMPLES_DIR}
+ mvn -B \
+ -ntp \
+ -DtrimStackTrace=false \
+ -Dclirr.skip=true \
+ -Denforcer.skip=true \
+ -Dfmt.skip=true \
+ -fae \
+ verify
+ RETURN_CODE=$?
+ popd
+ else
+ echo "no sample pom.xml found - skipping sample tests"
+ fi
+ ;;
+clirr)
+ mvn -B -ntp -Dfmt.skip=true -Denforcer.skip=true clirr:check
+ RETURN_CODE=$?
+ ;;
+*)
+ ;;
+esac
+
+if [ "${REPORT_COVERAGE}" == "true" ]
+then
+ bash ${KOKORO_GFILE_DIR}/codecov.sh
+fi
+
+# fix output location of logs
+bash .kokoro/coerce_logs.sh
+
+if [[ "${ENABLE_FLAKYBOT}" == "true" ]]
+then
+ chmod +x ${KOKORO_GFILE_DIR}/linux_amd64/flakybot
+ ${KOKORO_GFILE_DIR}/linux_amd64/flakybot -repo=googleapis/java-logging
+fi
+
+echo "exiting with ${RETURN_CODE}"
+exit ${RETURN_CODE}
diff --git a/java-logging/.kokoro/coerce_logs.sh b/java-logging/.kokoro/coerce_logs.sh
new file mode 100755
index 000000000000..46edbf7f2fcd
--- /dev/null
+++ b/java-logging/.kokoro/coerce_logs.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This script finds and moves sponge logs so that they can be found by placer
+# and are not flagged as flaky by sponge.
+
+set -eo pipefail
+
+## Get the directory of the build script
+scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}"))
+## cd to the parent directory, i.e. the root of the git repo
+cd ${scriptDir}/..
+
+job=$(basename ${KOKORO_JOB_NAME})
+
+echo "coercing sponge logs..."
+for xml in `find . -name *-sponge_log.xml`
+do
+ class=$(basename ${xml} | cut -d- -f2)
+ dir=$(dirname ${xml})/${job}/${class}
+ text=$(dirname ${xml})/${class}-sponge_log.txt
+ mkdir -p ${dir}
+ mv ${xml} ${dir}/sponge_log.xml
+ mv ${text} ${dir}/sponge_log.txt
+done
diff --git a/java-logging/.kokoro/common.cfg b/java-logging/.kokoro/common.cfg
new file mode 100644
index 000000000000..6ac75eb53f41
--- /dev/null
+++ b/java-logging/.kokoro/common.cfg
@@ -0,0 +1,33 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Download trampoline resources. These will be in ${KOKORO_GFILE_DIR}
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# All builds use the trampoline script to run in docker.
+build_file: "java-logging/.kokoro/trampoline.sh"
+
+# Tell the trampoline which build file to use.
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/java-logging/.kokoro/build.sh"
+}
+
+
+#############################################
+# this section merged from .kokoro/common_env_vars.cfg using owlbot.py
+
+env_vars: {
+ key: "PRODUCT_AREA_LABEL"
+ value: "observability"
+}
+env_vars: {
+ key: "PRODUCT_LABEL"
+ value: "logging"
+}
+env_vars: {
+ key: "LANGUAGE_LABEL"
+ value: "java"
+}
+
+###################################################
+
diff --git a/java-logging/.kokoro/common.sh b/java-logging/.kokoro/common.sh
new file mode 100644
index 000000000000..f8f957af1112
--- /dev/null
+++ b/java-logging/.kokoro/common.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+function retry_with_backoff {
+ attempts_left=$1
+ sleep_seconds=$2
+ shift 2
+ command=$@
+
+
+ # store current flag state
+ flags=$-
+
+ # allow a failures to continue
+ set +e
+ ${command}
+ exit_code=$?
+
+ # restore "e" flag
+ if [[ ${flags} =~ e ]]
+ then set -e
+ else set +e
+ fi
+
+ if [[ $exit_code == 0 ]]
+ then
+ return 0
+ fi
+
+ # failure
+ if [[ ${attempts_left} > 0 ]]
+ then
+ echo "failure (${exit_code}), sleeping ${sleep_seconds}..."
+ sleep ${sleep_seconds}
+ new_attempts=$((${attempts_left} - 1))
+ new_sleep=$((${sleep_seconds} * 2))
+ retry_with_backoff ${new_attempts} ${new_sleep} ${command}
+ fi
+
+ return $exit_code
+}
+
+## Helper functionss
+function now() { date +"%Y-%m-%d %H:%M:%S" | tr -d '\n'; }
+function msg() { println "$*" >&2; }
+function println() { printf '%s\n' "$(now) $*"; }
+
+## Helper comment to trigger updated repo dependency release
\ No newline at end of file
diff --git a/java-logging/.kokoro/common_env_vars.cfg b/java-logging/.kokoro/common_env_vars.cfg
new file mode 100644
index 000000000000..fd34bc54d39b
--- /dev/null
+++ b/java-logging/.kokoro/common_env_vars.cfg
@@ -0,0 +1,19 @@
+
+#############################################
+# this section merged from .kokoro/common_env_vars.cfg using owlbot.py
+
+env_vars: {
+ key: "PRODUCT_AREA_LABEL"
+ value: "observability"
+}
+env_vars: {
+ key: "PRODUCT_LABEL"
+ value: "logging"
+}
+env_vars: {
+ key: "LANGUAGE_LABEL"
+ value: "java"
+}
+
+###################################################
+
diff --git a/java-logging/.kokoro/dependencies.sh b/java-logging/.kokoro/dependencies.sh
new file mode 100755
index 000000000000..bd8960246f66
--- /dev/null
+++ b/java-logging/.kokoro/dependencies.sh
@@ -0,0 +1,59 @@
+#!/bin/bash
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -eo pipefail
+shopt -s nullglob
+
+## Get the directory of the build script
+scriptDir=$(realpath $(dirname "${BASH_SOURCE[0]}"))
+## cd to the parent directory, i.e. the root of the git repo
+cd ${scriptDir}/..
+
+# include common functions
+source ${scriptDir}/common.sh
+
+# Print out Java
+java -version
+echo $JOB_TYPE
+
+function determineMavenOpts() {
+ local javaVersion=$(
+ # filter down to the version line, then pull out the version between quotes,
+ # then trim the version number down to its minimal number (removing any
+ # update or suffix number).
+ java -version 2>&1 | grep "version" \
+ | sed -E 's/^.*"(.*?)".*$/\1/g' \
+ | sed -E 's/^(1\.[0-9]\.0).*$/\1/g'
+ )
+
+ if [[ $javaVersion == 17* ]]
+ then
+ # MaxPermSize is no longer supported as of jdk 17
+ echo -n "-Xmx1024m"
+ else
+ echo -n "-Xmx1024m -XX:MaxPermSize=128m"
+ fi
+}
+
+export MAVEN_OPTS=$(determineMavenOpts)
+
+# this should run maven enforcer
+retry_with_backoff 3 10 \
+ mvn install -B -V -ntp \
+ -DskipTests=true \
+ -Dmaven.javadoc.skip=true \
+ -Dclirr.skip=true
+
+mvn -B dependency:analyze -DfailOnWarning=true
diff --git a/java-logging/.kokoro/environment/appengine_flex/common.cfg b/java-logging/.kokoro/environment/appengine_flex/common.cfg
new file mode 100644
index 000000000000..e1dd4fedac24
--- /dev/null
+++ b/java-logging/.kokoro/environment/appengine_flex/common.cfg
@@ -0,0 +1,57 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+
+# Specify which tests to run
+env_vars: {
+ key: "ENVIRONMENT"
+ value: "appengine_flex"
+}
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "java-logging/.kokoro/trampoline.sh"
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-multi"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/java-logging/.kokoro/environment_tests.sh"
+}
+
+env_vars: {
+ key: "SECRET_MANAGER_KEYS"
+ value: "java-it-service-account"
+}
+
+env_vars: {
+ key: "GOOGLE_CLOUD_PROJECT"
+ value: "gcloud-devel"
+}
+
+# add labels to help with testgrid filtering
+env_vars: {
+ key: "PRODUCT_AREA_LABEL"
+ value: "observability"
+}
+env_vars: {
+ key: "PRODUCT_LABEL"
+ value: "logging"
+}
+env_vars: {
+ key: "LANGUAGE_LABEL"
+ value: "java"
+}
+
diff --git a/java-logging/.kokoro/environment/appengine_flex/continuous.cfg b/java-logging/.kokoro/environment/appengine_flex/continuous.cfg
new file mode 100644
index 000000000000..8f43917d92fe
--- /dev/null
+++ b/java-logging/.kokoro/environment/appengine_flex/continuous.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
\ No newline at end of file
diff --git a/java-logging/.kokoro/environment/appengine_flex/presubmit.cfg b/java-logging/.kokoro/environment/appengine_flex/presubmit.cfg
new file mode 100644
index 000000000000..18a4c35325b8
--- /dev/null
+++ b/java-logging/.kokoro/environment/appengine_flex/presubmit.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
diff --git a/java-logging/.kokoro/environment/appengine_standard/common.cfg b/java-logging/.kokoro/environment/appengine_standard/common.cfg
new file mode 100644
index 000000000000..5c4b2ccba0d6
--- /dev/null
+++ b/java-logging/.kokoro/environment/appengine_standard/common.cfg
@@ -0,0 +1,57 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+
+# Specify which tests to run
+env_vars: {
+ key: "ENVIRONMENT"
+ value: "appengine_standard"
+}
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "java-logging/.kokoro/trampoline.sh"
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-multi"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/java-logging/.kokoro/environment_tests.sh"
+}
+
+env_vars: {
+ key: "SECRET_MANAGER_KEYS"
+ value: "java-it-service-account"
+}
+
+env_vars: {
+ key: "GOOGLE_CLOUD_PROJECT"
+ value: "gcloud-devel"
+}
+
+# add labels to help with testgrid filtering
+env_vars: {
+ key: "PRODUCT_AREA_LABEL"
+ value: "observability"
+}
+env_vars: {
+ key: "PRODUCT_LABEL"
+ value: "logging"
+}
+env_vars: {
+ key: "LANGUAGE_LABEL"
+ value: "java"
+}
+
diff --git a/java-logging/.kokoro/environment/appengine_standard/continuous.cfg b/java-logging/.kokoro/environment/appengine_standard/continuous.cfg
new file mode 100644
index 000000000000..8f43917d92fe
--- /dev/null
+++ b/java-logging/.kokoro/environment/appengine_standard/continuous.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
\ No newline at end of file
diff --git a/java-logging/.kokoro/environment/appengine_standard/presubmit.cfg b/java-logging/.kokoro/environment/appengine_standard/presubmit.cfg
new file mode 100644
index 000000000000..18a4c35325b8
--- /dev/null
+++ b/java-logging/.kokoro/environment/appengine_standard/presubmit.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
diff --git a/java-logging/.kokoro/environment/cloudrun/common.cfg b/java-logging/.kokoro/environment/cloudrun/common.cfg
new file mode 100644
index 000000000000..12c4e7f6b817
--- /dev/null
+++ b/java-logging/.kokoro/environment/cloudrun/common.cfg
@@ -0,0 +1,57 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+
+# Specify which tests to run
+env_vars: {
+ key: "ENVIRONMENT"
+ value: "cloudrun"
+}
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "java-logging/.kokoro/trampoline.sh"
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-multi"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/java-logging/.kokoro/environment_tests.sh"
+}
+
+env_vars: {
+ key: "SECRET_MANAGER_KEYS"
+ value: "java-it-service-account"
+}
+
+env_vars: {
+ key: "GOOGLE_CLOUD_PROJECT"
+ value: "gcloud-devel"
+}
+
+# add labels to help with testgrid filtering
+env_vars: {
+ key: "PRODUCT_AREA_LABEL"
+ value: "observability"
+}
+env_vars: {
+ key: "PRODUCT_LABEL"
+ value: "logging"
+}
+env_vars: {
+ key: "LANGUAGE_LABEL"
+ value: "java"
+}
+
diff --git a/java-logging/.kokoro/environment/cloudrun/continuous.cfg b/java-logging/.kokoro/environment/cloudrun/continuous.cfg
new file mode 100644
index 000000000000..8f43917d92fe
--- /dev/null
+++ b/java-logging/.kokoro/environment/cloudrun/continuous.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
\ No newline at end of file
diff --git a/java-logging/.kokoro/environment/cloudrun/presubmit.cfg b/java-logging/.kokoro/environment/cloudrun/presubmit.cfg
new file mode 100644
index 000000000000..18a4c35325b8
--- /dev/null
+++ b/java-logging/.kokoro/environment/cloudrun/presubmit.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
diff --git a/java-logging/.kokoro/environment/compute/common.cfg b/java-logging/.kokoro/environment/compute/common.cfg
new file mode 100644
index 000000000000..968e69107290
--- /dev/null
+++ b/java-logging/.kokoro/environment/compute/common.cfg
@@ -0,0 +1,57 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+
+# Specify which tests to run
+env_vars: {
+ key: "ENVIRONMENT"
+ value: "compute"
+}
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "java-logging/.kokoro/trampoline.sh"
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-multi"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/java-logging/.kokoro/environment_tests.sh"
+}
+
+env_vars: {
+ key: "SECRET_MANAGER_KEYS"
+ value: "java-it-service-account"
+}
+
+env_vars: {
+ key: "GOOGLE_CLOUD_PROJECT"
+ value: "gcloud-devel"
+}
+
+# add labels to help with testgrid filtering
+env_vars: {
+ key: "PRODUCT_AREA_LABEL"
+ value: "observability"
+}
+env_vars: {
+ key: "PRODUCT_LABEL"
+ value: "logging"
+}
+env_vars: {
+ key: "LANGUAGE_LABEL"
+ value: "java"
+}
+
diff --git a/java-logging/.kokoro/environment/compute/continuous.cfg b/java-logging/.kokoro/environment/compute/continuous.cfg
new file mode 100644
index 000000000000..8f43917d92fe
--- /dev/null
+++ b/java-logging/.kokoro/environment/compute/continuous.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
\ No newline at end of file
diff --git a/java-logging/.kokoro/environment/compute/presubmit.cfg b/java-logging/.kokoro/environment/compute/presubmit.cfg
new file mode 100644
index 000000000000..18a4c35325b8
--- /dev/null
+++ b/java-logging/.kokoro/environment/compute/presubmit.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
diff --git a/java-logging/.kokoro/environment/functions/common.cfg b/java-logging/.kokoro/environment/functions/common.cfg
new file mode 100644
index 000000000000..ff79f018b931
--- /dev/null
+++ b/java-logging/.kokoro/environment/functions/common.cfg
@@ -0,0 +1,57 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+
+# Specify which tests to run
+env_vars: {
+ key: "ENVIRONMENT"
+ value: "functions"
+}
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "java-logging/.kokoro/trampoline.sh"
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-multi"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/java-logging/.kokoro/environment_tests.sh"
+}
+
+env_vars: {
+ key: "SECRET_MANAGER_KEYS"
+ value: "java-it-service-account"
+}
+
+env_vars: {
+ key: "GOOGLE_CLOUD_PROJECT"
+ value: "gcloud-devel"
+}
+
+# add labels to help with testgrid filtering
+env_vars: {
+ key: "PRODUCT_AREA_LABEL"
+ value: "observability"
+}
+env_vars: {
+ key: "PRODUCT_LABEL"
+ value: "logging"
+}
+env_vars: {
+ key: "LANGUAGE_LABEL"
+ value: "java"
+}
+
diff --git a/java-logging/.kokoro/environment/functions/continuous.cfg b/java-logging/.kokoro/environment/functions/continuous.cfg
new file mode 100644
index 000000000000..8f43917d92fe
--- /dev/null
+++ b/java-logging/.kokoro/environment/functions/continuous.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
\ No newline at end of file
diff --git a/java-logging/.kokoro/environment/functions/presubmit.cfg b/java-logging/.kokoro/environment/functions/presubmit.cfg
new file mode 100644
index 000000000000..18a4c35325b8
--- /dev/null
+++ b/java-logging/.kokoro/environment/functions/presubmit.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
diff --git a/java-logging/.kokoro/environment/kubernetes/common.cfg b/java-logging/.kokoro/environment/kubernetes/common.cfg
new file mode 100644
index 000000000000..558cd6c4dba6
--- /dev/null
+++ b/java-logging/.kokoro/environment/kubernetes/common.cfg
@@ -0,0 +1,57 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+
+# Specify which tests to run
+env_vars: {
+ key: "ENVIRONMENT"
+ value: "kubernetes"
+}
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "java-logging/.kokoro/trampoline.sh"
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-multi"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/java-logging/.kokoro/environment_tests.sh"
+}
+
+env_vars: {
+ key: "SECRET_MANAGER_KEYS"
+ value: "java-it-service-account"
+}
+
+env_vars: {
+ key: "GOOGLE_CLOUD_PROJECT"
+ value: "gcloud-devel"
+}
+
+# add labels to help with testgrid filtering
+env_vars: {
+ key: "PRODUCT_AREA_LABEL"
+ value: "observability"
+}
+env_vars: {
+ key: "PRODUCT_LABEL"
+ value: "logging"
+}
+env_vars: {
+ key: "LANGUAGE_LABEL"
+ value: "java"
+}
+
diff --git a/java-logging/.kokoro/environment/kubernetes/continuous.cfg b/java-logging/.kokoro/environment/kubernetes/continuous.cfg
new file mode 100644
index 000000000000..8f43917d92fe
--- /dev/null
+++ b/java-logging/.kokoro/environment/kubernetes/continuous.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
\ No newline at end of file
diff --git a/java-logging/.kokoro/environment/kubernetes/presubmit.cfg b/java-logging/.kokoro/environment/kubernetes/presubmit.cfg
new file mode 100644
index 000000000000..18a4c35325b8
--- /dev/null
+++ b/java-logging/.kokoro/environment/kubernetes/presubmit.cfg
@@ -0,0 +1 @@
+# Format: //devtools/kokoro/config/proto/build.proto
diff --git a/java-logging/.kokoro/environment_tests.sh b/java-logging/.kokoro/environment_tests.sh
new file mode 100755
index 000000000000..cb2da72035b2
--- /dev/null
+++ b/java-logging/.kokoro/environment_tests.sh
@@ -0,0 +1,86 @@
+#!/bin/bash
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -eox pipefail
+
+if [[ -z "${ENVIRONMENT:-}" ]]; then
+ echo "ENVIRONMENT not set. Exiting"
+ exit 1
+fi
+
+if [[ -z "${PROJECT_ROOT:-}" ]]; then
+ PROJECT_ROOT="${KOKORO_ARTIFACTS_DIR}/github/java-logging"
+fi
+
+# make sure submodule is up to date
+cd "$PROJECT_ROOT"
+git config --global --add safe.directory '*'
+git config --global --add safe.directory /tmpfs/src/github/java-logging
+git submodule update --init --recursive
+cd "${PROJECT_ROOT}/env-tests-logging"
+
+# Disable buffering, so that the logs stream through.
+export PYTHONUNBUFFERED=1
+
+# Setup service account credentials.
+export GOOGLE_APPLICATION_CREDENTIALS=$KOKORO_GFILE_DIR/secret_manager/java-it-service-account
+gcloud auth activate-service-account --key-file=$GOOGLE_APPLICATION_CREDENTIALS
+
+gcloud config get-value project
+
+# Setup project id.
+gcloud config set project $GOOGLE_CLOUD_PROJECT
+
+# set a default zone.
+gcloud config set compute/zone us-central1-b
+
+# authenticate docker
+gcloud auth configure-docker -q
+
+# Remove old nox
+python3 -m pip uninstall --yes --quiet nox-automation
+
+# Install nox
+python3 -m pip install --upgrade --quiet nox
+python3 -m nox --version
+
+# Install kubectl
+if [[ "${ENVIRONMENT}" == "kubernetes" ]]; then
+ curl -LO https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl
+ chmod +x kubectl
+ mkdir -p ~/.local/bin
+ mv ./kubectl ~/.local/bin
+ export PATH=$PATH:~/.local/bin
+ # install auth plugin
+ gcloud components install gke-gcloud-auth-plugin -q
+ export USE_GKE_GCLOUD_AUTH_PLUGIN=True
+fi
+
+# create a unique id for this run
+UUID=$(python -c 'import uuid; print(uuid.uuid1())' | head -c 7)
+export ENVCTL_ID=ci-$UUID
+echo $ENVCTL_ID
+
+# Run the specified environment test
+set +e
+python3 -m nox --session "tests(language='java', platform='$ENVIRONMENT')"
+TEST_STATUS_CODE=$?
+
+# destroy resources
+echo "cleaning up..."
+${PROJECT_ROOT}/env-tests-logging/envctl/envctl java $ENVIRONMENT destroy
+
+# exit with proper status code
+exit $TEST_STATUS_CODE
diff --git a/java-logging/.kokoro/populate-secrets.sh b/java-logging/.kokoro/populate-secrets.sh
new file mode 100755
index 000000000000..f52514257ef0
--- /dev/null
+++ b/java-logging/.kokoro/populate-secrets.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+# Copyright 2020 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -eo pipefail
+
+function now { date +"%Y-%m-%d %H:%M:%S" | tr -d '\n' ;}
+function msg { println "$*" >&2 ;}
+function println { printf '%s\n' "$(now) $*" ;}
+
+
+# Populates requested secrets set in SECRET_MANAGER_KEYS from service account:
+# kokoro-trampoline@cloud-devrel-kokoro-resources.iam.gserviceaccount.com
+SECRET_LOCATION="${KOKORO_GFILE_DIR}/secret_manager"
+msg "Creating folder on disk for secrets: ${SECRET_LOCATION}"
+mkdir -p ${SECRET_LOCATION}
+for key in $(echo ${SECRET_MANAGER_KEYS} | sed "s/,/ /g")
+do
+ msg "Retrieving secret ${key}"
+ docker run --entrypoint=gcloud \
+ --volume=${KOKORO_GFILE_DIR}:${KOKORO_GFILE_DIR} \
+ gcr.io/google.com/cloudsdktool/cloud-sdk \
+ secrets versions access latest \
+ --project cloud-devrel-kokoro-resources \
+ --secret ${key} > \
+ "${SECRET_LOCATION}/${key}"
+ if [[ $? == 0 ]]; then
+ msg "Secret written to ${SECRET_LOCATION}/${key}"
+ else
+ msg "Error retrieving secret ${key}"
+ fi
+done
diff --git a/java-logging/.kokoro/readme.sh b/java-logging/.kokoro/readme.sh
new file mode 100755
index 000000000000..0e4ce5bf1f97
--- /dev/null
+++ b/java-logging/.kokoro/readme.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -eo pipefail
+
+cd ${KOKORO_ARTIFACTS_DIR}/github/java-logging
+
+# Disable buffering, so that the logs stream through.
+export PYTHONUNBUFFERED=1
+
+# Kokoro exposes this as a file, but the scripts expect just a plain variable.
+export GITHUB_TOKEN=$(cat ${KOKORO_KEYSTORE_DIR}/73713_yoshi-automation-github-key)
+
+# Setup git credentials
+echo "https://${GITHUB_TOKEN}:@github.com" >> ~/.git-credentials
+git config --global credential.helper 'store --file ~/.git-credentials'
+
+python3.6 -m pip install git+https://github.com/googleapis/synthtool.git#egg=gcp-synthtool
+
+set +e
+python3.6 -m autosynth.synth \
+ --repository=googleapis/java-logging \
+ --synth-file-name=.github/readme/synth.py \
+ --metadata-path=.github/readme/synth.metadata \
+ --pr-title="chore: regenerate README" \
+ --branch-suffix="readme"
+
+# autosynth returns 28 to signal there are no changes
+RETURN_CODE=$?
+if [[ ${RETURN_CODE} -ne 0 && ${RETURN_CODE} -ne 28 ]]
+then
+ exit ${RETURN_CODE}
+fi
diff --git a/java-logging/.kokoro/trampoline.sh b/java-logging/.kokoro/trampoline.sh
new file mode 100644
index 000000000000..8b69b793c9ec
--- /dev/null
+++ b/java-logging/.kokoro/trampoline.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+# Copyright 2018 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+set -eo pipefail
+# Always run the cleanup script, regardless of the success of bouncing into
+# the container.
+function cleanup() {
+ chmod +x ${KOKORO_GFILE_DIR}/trampoline_cleanup.sh
+ ${KOKORO_GFILE_DIR}/trampoline_cleanup.sh
+ echo "cleanup";
+}
+trap cleanup EXIT
+
+$(dirname $0)/populate-secrets.sh # Secret Manager secrets.
+python3 "${KOKORO_GFILE_DIR}/trampoline_v1.py"
diff --git a/java-logging/.readme-partials.yaml b/java-logging/.readme-partials.yaml
new file mode 100644
index 000000000000..27cf6092f535
--- /dev/null
+++ b/java-logging/.readme-partials.yaml
@@ -0,0 +1,243 @@
+custom_content: |
+ #### Creating an authorized service object
+
+ To make requests to Cloud Logging, you must create a service object with valid credentials.
+ You can then make API calls by calling methods on the Logging service object.
+ You can obtain credentials by using [Application Default Credentials](https://developers.google.com/identity/protocols/application-default-credentials).
+ Or you can use a [Service Account](https://cloud.google.com/iam/docs/service-accounts) which is a recommended way to obtain credentials.
+ The credentials can be automatically inferred from your [environment](https://cloud.google.com/docs/authentication/getting-started#setting_the_environment_variable).
+ Then you only need the following code to create your service object:
+
+ ```java
+ import com.google.cloud.logging.Logging;
+ import com.google.cloud.logging.LoggingOptions;
+
+ LoggingOptions options = LoggingOptions.getDefaultInstance();
+ try(Logging logging = options.getService()) {
+ // use logging here
+ }
+ ```
+
+ For other options, see the [Authentication](https://github.com/googleapis/google-cloud-java#authentication) page.
+ The service object should be granted permissions to make API calls.
+ Each API call describes the permissions under Authorized Scopes section.
+ See [Logging API](https://cloud.google.com/logging/docs/reference/v2/rest) to find the required list of permissions or consult with [Access control guide](https://cloud.google.com/logging/docs/access-control) for predefined IAM roles that can be granted to the Logging service object.
+
+ #### Creating a metric
+ With Logging you can create logs-based metrics. Logs-based metrics allow to keep track of the number
+ of log messages associated to specific events. Add the following imports at the top of your file:
+
+ ```java
+ import com.google.cloud.logging.Metric;
+ import com.google.cloud.logging.MetricInfo;
+ ```
+
+ Then, to create the metric, use the following code:
+
+ ```java
+ MetricInfo metricInfo = MetricInfo.newBuilder("test-metric", "severity >= ERROR")
+ .setDescription("Log entries with severity higher or equal to ERROR")
+ .build();
+ logging.create(metricInfo);
+ ```
+
+ #### Writing log entries
+ For an interactive tutorial click
+
+ [](https://console.cloud.google.com/?walkthrough_id=logging__logging-java)
+
+ With Logging you can also write custom log entries. Add the following imports at the top of your
+ file:
+
+ ```java
+ import com.google.cloud.MonitoredResource;
+ import com.google.cloud.logging.LogEntry;
+ import com.google.cloud.logging.Logging;
+ import com.google.cloud.logging.Payload.StringPayload;
+
+ import java.util.Collections;
+ ```
+
+ Then, to write the log entries, use the following code:
+
+ ```java
+ LogEntry firstEntry = LogEntry.newBuilder(StringPayload.of("message"))
+ .setLogName("test-log")
+ .setResource(MonitoredResource.newBuilder("global")
+ .addLabel("project_id", options.getProjectId())
+ .build())
+ .build();
+ logging.write(Collections.singleton(firstEntry));
+ ```
+
+ The library supports writing log entries synchronously and asynchronously.
+ In the synchronous mode each call to `write()` method results in a consequent call to Logging API to write a log entry.
+ In the asynchronous mode the call(s) to Logging API takes place asynchronously and few calls to `write()` method may be batched together to compose a single call to Logging API.
+ The default mode of writing is asynchronous.
+ It can be configured in the `java.util.logging` handler [configuration file](https://cloud.google.com/logging/docs/setup/java#javautillogging_configuration):
+
+ ```
+ com.google.cloud.logging.LoggingHandler.synchronicity=SYNC
+ ```
+
+ or in the code after initiating an instance of `Logging` by calling:
+
+ ```java
+ logging.setWriteSynchronicity(Synchronicity.SYNC);
+ ```
+
+ NOTE:
+ > Writing log entries asynchronously in some Google Cloud managed environments (e.g. Cloud Functions)
+ > may lead to unexpected results such as absense of expected log entries or abnormal program execution.
+ > To avoid these unexpected results, it is recommended to use synchronous mode.
+
+ #### Controlling the batching settings
+ As mentioned before, in the asynchronous mode the call(s) to Logging API takes place asynchronously and few calls to `write()`
+ method may be batched together to compose a single call to Logging API. In order to control the batching settings, the `LoggingOptions`
+ is enhanced with `BatchingSettings` which can be set as shown in example below:
+
+ ```java
+ import com.google.api.gax.batching.BatchingSettings;
+ import com.google.api.gax.batching.FlowControlSettings;
+ import com.google.api.gax.batching.FlowController;
+
+ LoggingOptions actual =
+ LoggingOptions.newBuilder()
+ .setBatchingSettings(
+ BatchingSettings.newBuilder()
+ .setIsEnabled(true)
+ .setElementCountThreshold(1000L)
+ .setRequestByteThreshold(1048576L)
+ .setDelayThreshold(Duration.ofMillis(50L))
+ .setFlowControlSettings(
+ FlowControlSettings.newBuilder()
+ .setMaxOutstandingElementCount(100000L)
+ .setMaxOutstandingRequestBytes(10485760L)
+ .setLimitExceededBehavior(
+ FlowController.LimitExceededBehavior.ThrowException)
+ .build())
+ .build())
+ .setProjectId('Your project ID')
+ .build();
+ ```
+
+ You can find more information about batching parameters see [BatchingSettings](https://cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.batching.BatchingSettings).
+
+ #### Listing log entries
+
+ With Logging you can also list log entries that have been previously written. Add the following
+ imports at the top of your file:
+
+ ```java
+ import com.google.api.gax.paging.Page;
+ import com.google.cloud.logging.LogEntry;
+ import com.google.cloud.logging.Logging.EntryListOption;
+ ```
+
+ Then, to list the log entries, use the following code:
+
+ ``` java
+ Page entries = logging.listLogEntries(
+ EntryListOption.filter("logName=projects/" + options.getProjectId() + "/logs/test-log"));
+ while (entries != null) {
+ for (LogEntry logEntry : entries.iterateAll()) {
+ System.out.println(logEntry);
+ }
+ entries = entries.getNextPage();
+ }
+ ```
+ #### Add a Cloud Logging handler to a logger
+
+ You can also register a `LoggingHandler` to a `java.util.logging.Logger` that publishes log entries
+ to Cloud Logging. Given the following logger:
+
+ ```java
+ private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());
+ ```
+
+ You can register a `LoggingHandler` with the code:
+
+ ```java
+ LoggingHandler.addHandler(LOGGER, new LoggingHandler());
+ ```
+
+ After that, logs generated using `LOGGER` will be also directed to Cloud Logging.
+
+ Notice that you can also register a `LoggingHandler` via the `logging.properties` configuration
+ file. Adding, for instance, the following line:
+
+ ```
+ com.google.cloud.examples.logging.snippets.AddLoggingHandler.handlers=com.google.cloud.logging.LoggingHandler
+ ```
+
+ #### Alternative way to ingest logs in Google Cloud managed environments
+
+ If you use Java logger with the Cloud Logging Handler, you can configure the handler to output logs to `stdout` using
+ the [structured logging Json format](https://cloud.google.com/logging/docs/structured-logging#special-payload-fields).
+ To do this, add `com.google.cloud.logging.LoggingHandler.redirectToStdout=true` to the logger configuration file.
+ You can use this configuration when running applications in Google Cloud managed environments such as AppEngine, Cloud Run,
+ Cloud Function or GKE. The logger agent installed on these environments can capture STDOUT and ingest it into Cloud Logging.
+ The agent can parse structured logs printed to STDOUT and capture additional log metadata beside the log payload.
+ The parsed information includes severity, source location, user labels, http request and tracing information.
+
+ #### Auto-population of log entrys' metadata
+
+ LogEntry object metadata information such as [monitored resource](https://cloud.google.com/logging/docs/reference/v2/rest/v2/MonitoredResource),
+ [Http request](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#HttpRequest) or
+ [source location](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogEntrySourceLocation)
+ are automatically populated with information that the library retrieves from the execution context.
+ The library populates only empty (set to `null`) LogEntry fields.
+ This behavior in the `Logging` instance can be opted out via `LoggingOptions`.
+ Call `LoggingOptions.Builder.setAutoPopulateMetadata(false)` to configure logging options to opt-out the metadata auto-population.
+ Cloud Logging handler can be configured to opt-out automatic population of the metadata using the logger configuration.
+ To disable the metadata auto-population add `com.google.cloud.logging.LoggingHandler.autoPopulateMetadata=false`
+ to the logger configuration file.
+
+ The auto-population logic populates source location _only_ for log entries with `Severity.DEBUG` severity.
+ The execution context of the Http request and tracing information is maintained by `ContextHandler` class.
+ The context is managed in the scope of the thread.
+ If you do not use thread pools for multi-threading the `ContextHandler` can be configured to propagate the context
+ to the scope of the child threads.
+ To enable this add `com.google.cloud.logging.ContextHandler.useInheritedContext=true` to the logger configuration file.
+ The library provides two methods to update the context:
+
+ * Manually set the context. You can use the following methods of the `Context.Builder` to set the context information.
+ Use the method `setRequest()` to setup the `HttpRequest` instance or `setRequestUrl()`, `setRequestMethod()`,
+ `setReferer() `, `setRemoteIp()` and `setServerIp()` to setup the fields of the `HttpRequest`.
+ The trace and span Ids can be set directly using `setTraceId()` and `setSpanId()` respectively.
+ Alternatively it can be parsed from the W3C tracing context header using `loadW3CTraceParentContext()` or
+ from the Google Cloud tracing context header using `loadCloudTraceContext()`.
+
+ ```java
+ Context context = Context.newBuilder().setHttpRequest(request).setTrace(traceId).setSpanId(spanId).build();
+ (new ContextHandler()).setCurrentContext(context);
+ ```
+
+ * Using [servlet initializer](https://github.com/googleapis/java-logging-servlet-initializer).
+ If your application uses a Web server based on Jakarta servlets (e.g. Jetty or Tomcat), you can add the servlet initializer
+ package to your WAR. The package implements a service provider interface (SPI) for
+ [javax.servlet.ServletContainerInitializer](https://docs.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.html)
+ and filters all servlet requests to automatically capture the execution context of the servlet request and store it using
+ `ContextHandler` class. The stored `Context` class instances are used to populate Http request and tracing information.
+ If you use Maven, to use the servlet initializer add the following dependency to your BOM:
+
+ ```xml
+
+ com.google.cloud
+ google-cloud-logging-servlet-initializer
+
+ ```
+ #### Population of Trace/Span ID fields in a LogEntry
+ Cloud Logging libraries use [trace fields within LogEntry](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.trace) to capture trace contexts, which enables the [correlation of logs and traces](https://cloud.google.com/logging/docs/view/correlate-logs), and distributed tracing troubleshooting.
+ These tracing fields, including [trace](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.trace), [spanId](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.span_id), and [traceSampled](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.trace_sampled), define the trace context for a `LogEntry`.
+
+ Tracing information set manually takes precedence over information set by the following methods:
+
+ * Auto-populate Trace/Span ID from OpenTelemetry Context
+ If you are using OpenTelemetry and there is an active span in the OpenTelemetry Context, the `trace`, `span_id`, and `trace_sampled` fields in the log entry are populated from the active span. More information about OpenTelemetry can be found [here](https://opentelemetry.io/docs/languages/java/).
+
+ * Use the [servlet initializer](https://github.com/googleapis/java-logging-servlet-initializer) to Populate Trace/Span ID from HTTP Headers
+ If trace/span Id are not manually set or auto-populated from OpenTelemetry context, you can use the [servlet initializer](https://github.com/googleapis/java-logging-servlet-initializer) to populate trace/span Id from HTTP headers.
+ This package filters all servlet requests to automatically capture the execution context of the servlet request and stores it by using ContextHandler class. Http request and trace/span Id information are populated from the stored Context class instances.
+ Using this method, trace/span Id can be automatically populated from either the [W3C Traceparent](https://www.w3.org/TR/trace-context) or [X-Cloud-Trace-Context](https://cloud.google.com/trace/docs/trace-context#legacy-http-header) headers.
+
diff --git a/java-logging/.repo-metadata.json b/java-logging/.repo-metadata.json
new file mode 100644
index 000000000000..521b4aa14707
--- /dev/null
+++ b/java-logging/.repo-metadata.json
@@ -0,0 +1,19 @@
+{
+ "api_shortname": "logging",
+ "name_pretty": "Cloud Logging",
+ "product_documentation": "https://cloud.google.com/logging/docs",
+ "api_description": "allows you to store, search, analyze, monitor, and alert on log data and events from Google Cloud and Amazon Web Services. Using the BindPlane service, you can also collect this data from over 150 common application components, on-premises systems, and hybrid cloud systems. BindPlane is included with your Google Cloud project at no additional cost.",
+ "client_documentation": "https://cloud.google.com/java/docs/reference/google-cloud-logging/latest/history",
+ "release_level": "stable",
+ "transport": "grpc",
+ "language": "java",
+ "repo": "googleapis/google-cloud-java",
+ "repo_short": "java-logging",
+ "distribution_name": "com.google.cloud:google-cloud-logging",
+ "api_id": "logging.googleapis.com",
+ "library_type": "GAPIC_COMBO",
+ "requires_billing": true,
+ "codeowner_team": "@googleapis/cloud-java-team-teamsync",
+ "issue_tracker": "https://issuetracker.google.com/savedsearches/559764",
+ "recommended_package": "com.google.cloud.logging"
+}
\ No newline at end of file
diff --git a/java-logging/CHANGELOG.md b/java-logging/CHANGELOG.md
new file mode 100644
index 000000000000..fda651eb298d
--- /dev/null
+++ b/java-logging/CHANGELOG.md
@@ -0,0 +1,1540 @@
+# Changelog
+
+## [3.23.10](https://github.com/googleapis/java-logging/compare/v3.23.9...v3.23.10) (2026-01-15)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.65.1 ([e0ca81e](https://github.com/googleapis/java-logging/commit/e0ca81e148d4f7dd6426640c574b453905cbe000))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.55.1 ([#1911](https://github.com/googleapis/java-logging/issues/1911)) ([93eadba](https://github.com/googleapis/java-logging/commit/93eadbaba65210e8686ea5240430fdbc86038fd5))
+* Update googleapis/sdk-platform-java action to v2.65.1 ([#1910](https://github.com/googleapis/java-logging/issues/1910)) ([3853159](https://github.com/googleapis/java-logging/commit/3853159f7255910dd33900086d410351f4cb0e98))
+
+## [3.23.9](https://github.com/googleapis/java-logging/compare/v3.23.8...v3.23.9) (2025-12-11)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.64.2 ([fcb7ec1](https://github.com/googleapis/java-logging/commit/fcb7ec1ba7ae7c9a041d68c76e7b72a7e0861cf7))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.54.2 ([#1897](https://github.com/googleapis/java-logging/issues/1897)) ([ab9862f](https://github.com/googleapis/java-logging/commit/ab9862f655bc89fa3e4e381567dcd0a9d8afdbf9))
+* Update googleapis/sdk-platform-java action to v2.64.2 ([#1898](https://github.com/googleapis/java-logging/issues/1898)) ([5860f51](https://github.com/googleapis/java-logging/commit/5860f516596686ef3054969b8c69de7eb48629e3))
+
+## [3.23.8](https://github.com/googleapis/java-logging/compare/v3.23.7...v3.23.8) (2025-11-13)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.64.1 ([9187dcd](https://github.com/googleapis/java-logging/commit/9187dcd1314a6be4df8f8c6eed95092724c6da69))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.54.1 ([#1883](https://github.com/googleapis/java-logging/issues/1883)) ([acc56db](https://github.com/googleapis/java-logging/commit/acc56db1ea0389ca91a09e435662b802db63abe6))
+* Update googleapis/sdk-platform-java action to v2.64.1 ([#1882](https://github.com/googleapis/java-logging/issues/1882)) ([abdd374](https://github.com/googleapis/java-logging/commit/abdd37434c76f615cdc9affb5d770970fbcbbf72))
+
+## [3.23.7](https://github.com/googleapis/java-logging/compare/v3.23.6...v3.23.7) (2025-10-20)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.63.0 ([385a1dc](https://github.com/googleapis/java-logging/commit/385a1dc67fcdd8706238ba2f95f694bbb647f5f8))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.53.0 ([#1875](https://github.com/googleapis/java-logging/issues/1875)) ([b79fd2b](https://github.com/googleapis/java-logging/commit/b79fd2b0cd2c358e3d3e69ddc76fcbfa16a47b5b))
+
+## [3.23.6](https://github.com/googleapis/java-logging/compare/v3.23.5...v3.23.6) (2025-10-08)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.62.3 ([5d5d8a7](https://github.com/googleapis/java-logging/commit/5d5d8a76c58c3329f90e4fa84f5e81a1d3296894))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.52.3 ([#1869](https://github.com/googleapis/java-logging/issues/1869)) ([94405fa](https://github.com/googleapis/java-logging/commit/94405fa929c48db114dd10ae39a0f3e520865bbf))
+* Update googleapis/sdk-platform-java action to v2.62.3 ([#1868](https://github.com/googleapis/java-logging/issues/1868)) ([cac5cd9](https://github.com/googleapis/java-logging/commit/cac5cd99e6a1738100248c9d235f4fa2987967d0))
+
+## [3.23.5](https://github.com/googleapis/java-logging/compare/v3.23.4...v3.23.5) (2025-09-24)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.62.2 ([eeca440](https://github.com/googleapis/java-logging/commit/eeca440da06c24afc07e669f6f087246d91cd933))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.52.2 ([#1858](https://github.com/googleapis/java-logging/issues/1858)) ([0252352](https://github.com/googleapis/java-logging/commit/0252352ca34dd494c4471f3a90391df762d676df))
+
+## [3.23.4](https://github.com/googleapis/java-logging/compare/v3.23.3...v3.23.4) (2025-09-11)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.62.1 ([1438bff](https://github.com/googleapis/java-logging/commit/1438bff5bc7028fbf125895f0bdd2bb50490effa))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.52.1 ([#1853](https://github.com/googleapis/java-logging/issues/1853)) ([c21a635](https://github.com/googleapis/java-logging/commit/c21a635f054b1cd8a6e5aea7450017af85ba03c7))
+* Update googleapis/sdk-platform-java action to v2.62.1 ([#1855](https://github.com/googleapis/java-logging/issues/1855)) ([b6ce498](https://github.com/googleapis/java-logging/commit/b6ce4988391dba73e019aa9f597ce6cc23f81a8c))
+
+## [3.23.3](https://github.com/googleapis/java-logging/compare/v3.23.2...v3.23.3) (2025-08-20)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.52.0 ([#1848](https://github.com/googleapis/java-logging/issues/1848)) ([162ef56](https://github.com/googleapis/java-logging/commit/162ef563793270c236ecf7ca2524ad3b560d7a12))
+
+## [3.23.2](https://github.com/googleapis/java-logging/compare/v3.23.1...v3.23.2) (2025-08-05)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.61.0 ([0a21b83](https://github.com/googleapis/java-logging/commit/0a21b83377e6e6a2f4cf98149424a47dcd490c1c))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.51.0 ([#1843](https://github.com/googleapis/java-logging/issues/1843)) ([975d8ae](https://github.com/googleapis/java-logging/commit/975d8aeca38ff2f2f8317df93a661910969c5fc1))
+
+## [3.23.1](https://github.com/googleapis/java-logging/compare/v3.23.0...v3.23.1) (2025-07-28)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.60.2 ([6a268f8](https://github.com/googleapis/java-logging/commit/6a268f8dbb33b38fa5e4d35d8dfcd196f8fcf9db))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.50.2 ([#1834](https://github.com/googleapis/java-logging/issues/1834)) ([2e46f6e](https://github.com/googleapis/java-logging/commit/2e46f6ef44278af5031167106c216dcdb0a16357))
+
+## [3.23.0](https://github.com/googleapis/java-logging/compare/v3.22.6...v3.23.0) (2025-07-11)
+
+
+### Features
+
+* Next release from main branch is 3.23.0 ([#1826](https://github.com/googleapis/java-logging/issues/1826)) ([f0ef15f](https://github.com/googleapis/java-logging/commit/f0ef15f609a3400460bd8074bdd05014cc388743))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.50.1 ([#1828](https://github.com/googleapis/java-logging/issues/1828)) ([44c3094](https://github.com/googleapis/java-logging/commit/44c3094e23450f1a8e6bb397f209b17cf37a4345))
+
+## [3.22.6](https://github.com/googleapis/java-logging/compare/v3.22.5...v3.22.6) (2025-06-25)
+
+
+### Bug Fixes
+
+* Regenerate gapic yaml and service yaml for logging by augmentation configs ([9023895](https://github.com/googleapis/java-logging/commit/9023895fd56381c1f4309843a269975763a89d40))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.50.0 ([#1821](https://github.com/googleapis/java-logging/issues/1821)) ([af4edc5](https://github.com/googleapis/java-logging/commit/af4edc5b1399b3563d9cf07e171c4281fde2bb79))
+* Update googleapis/sdk-platform-java action to v2.60.0 ([#1822](https://github.com/googleapis/java-logging/issues/1822)) ([0a96dd5](https://github.com/googleapis/java-logging/commit/0a96dd52dc1594767b7dd60da99a17bac8ac14ba))
+
+## [3.22.5](https://github.com/googleapis/java-logging/compare/v3.22.4...v3.22.5) (2025-06-05)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.59.0 ([f2362fb](https://github.com/googleapis/java-logging/commit/f2362fb4c05d34fda4a1c9788ea87822ac887d9e))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.49.0 ([#1813](https://github.com/googleapis/java-logging/issues/1813)) ([c15da84](https://github.com/googleapis/java-logging/commit/c15da84716d6d554ae26919412e8d4313fd980bc))
+
+## [3.22.4](https://github.com/googleapis/java-logging/compare/v3.22.3...v3.22.4) (2025-05-20)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.58.0 ([45b4878](https://github.com/googleapis/java-logging/commit/45b4878eeec35f8c19a3cd3cd33331e9ece6b5c6))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.48.0 ([#1808](https://github.com/googleapis/java-logging/issues/1808)) ([6327c51](https://github.com/googleapis/java-logging/commit/6327c51f3a8ecfb7af678c8c040b066e7f938863))
+* Update googleapis/sdk-platform-java action to v2.58.0 ([#1806](https://github.com/googleapis/java-logging/issues/1806)) ([b94da77](https://github.com/googleapis/java-logging/commit/b94da779d8263ce6c1845bb8baa6a9e9aedc2ccf))
+
+## [3.22.3](https://github.com/googleapis/java-logging/compare/v3.22.2...v3.22.3) (2025-05-06)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.56.3 ([844f4fa](https://github.com/googleapis/java-logging/commit/844f4fa48f878a7da77ff9ab13652dc93f079920))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.46.3 ([#1801](https://github.com/googleapis/java-logging/issues/1801)) ([d7aa7bc](https://github.com/googleapis/java-logging/commit/d7aa7bcd4e1235491f30ab4dd88ff80c07966185))
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.47.0 ([#1803](https://github.com/googleapis/java-logging/issues/1803)) ([5967ffe](https://github.com/googleapis/java-logging/commit/5967ffe459d9e1d00a36727ae433303005bf15d8))
+* Update googleapis/sdk-platform-java action to v2.57.0 ([#1804](https://github.com/googleapis/java-logging/issues/1804)) ([e9a27ec](https://github.com/googleapis/java-logging/commit/e9a27ec2a1b148c40ea13d541b4c7a96cef07901))
+
+## [3.22.2](https://github.com/googleapis/java-logging/compare/v3.22.1...v3.22.2) (2025-04-25)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.46.2 ([#1796](https://github.com/googleapis/java-logging/issues/1796)) ([1f88271](https://github.com/googleapis/java-logging/commit/1f882712aeb7e48a2339ffbad783813e11e74401))
+
+## [3.22.1](https://github.com/googleapis/java-logging/compare/v3.22.0...v3.22.1) (2025-04-25)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.56.2 ([7cce5b5](https://github.com/googleapis/java-logging/commit/7cce5b509c904209f0a92e239e836afac4169ec4))
+
+## [3.22.0](https://github.com/googleapis/java-logging/compare/v3.21.4...v3.22.0) (2025-03-18)
+
+
+### Features
+
+* Next release from main branch is 3.22.0 ([#1776](https://github.com/googleapis/java-logging/issues/1776)) ([7736073](https://github.com/googleapis/java-logging/commit/773607312a1dc6f5f569f2518587ffba4743bb43))
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.55.1 ([dd25992](https://github.com/googleapis/java-logging/commit/dd259929b01a2dd50ca2d09005fedf1631b97877))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.45.1 ([#1779](https://github.com/googleapis/java-logging/issues/1779)) ([a643ab0](https://github.com/googleapis/java-logging/commit/a643ab03600fa25cee41df23b2daf65c0fc4e70a))
+* Update googleapis/sdk-platform-java action to v2.55.1 ([#1780](https://github.com/googleapis/java-logging/issues/1780)) ([505557e](https://github.com/googleapis/java-logging/commit/505557e1b9b14c910aec402335bf9fc9ca96975c))
+
+## [3.21.4](https://github.com/googleapis/java-logging/compare/v3.21.3...v3.21.4) (2025-02-26)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.54.0 ([67fa9fb](https://github.com/googleapis/java-logging/commit/67fa9fbbc48dd8df9c176ba0bb3d1acf6b975bfc))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.44.0 ([#1768](https://github.com/googleapis/java-logging/issues/1768)) ([a69e699](https://github.com/googleapis/java-logging/commit/a69e6990e5cc7ab920382599510bb14f29a12d7d))
+* Update googleapis/sdk-platform-java action to v2.54.0 ([#1762](https://github.com/googleapis/java-logging/issues/1762)) ([d50a8d2](https://github.com/googleapis/java-logging/commit/d50a8d2fbef588138b4d47cbd3440d7217d690b0))
+
+## [3.21.3](https://github.com/googleapis/java-logging/compare/v3.21.2...v3.21.3) (2025-02-12)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.52.0 ([888a885](https://github.com/googleapis/java-logging/commit/888a885dc229960c26fae5098c4b43b7b0ef4fa6))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.43.0 ([#1763](https://github.com/googleapis/java-logging/issues/1763)) ([e0f9f27](https://github.com/googleapis/java-logging/commit/e0f9f271be10cec0d9400bc464bcc0a175078d97))
+
+## [3.21.2](https://github.com/googleapis/java-logging/compare/v3.21.1...v3.21.2) (2025-01-29)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.42.0 ([#1755](https://github.com/googleapis/java-logging/issues/1755)) ([d404381](https://github.com/googleapis/java-logging/commit/d4043815246423efe542356dc50ba663092b8df0))
+* Update dependency io.opentelemetry:opentelemetry-bom to v1.46.0 ([#1747](https://github.com/googleapis/java-logging/issues/1747)) ([5ef2853](https://github.com/googleapis/java-logging/commit/5ef285387d63b79bff7e43b233c7f9770f378dba))
+* Update googleapis/sdk-platform-java action to v2.52.0 ([#1753](https://github.com/googleapis/java-logging/issues/1753)) ([3dcf86a](https://github.com/googleapis/java-logging/commit/3dcf86adc3e1ef3d5866cd043149808601c213b8))
+
+## [3.21.1](https://github.com/googleapis/java-logging/compare/v3.21.0...v3.21.1) (2025-01-13)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.51.1 ([705dba2](https://github.com/googleapis/java-logging/commit/705dba2d6c12bd9f9e281c962cfb232ab28b31a9))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.41.1 ([#1745](https://github.com/googleapis/java-logging/issues/1745)) ([6a7280d](https://github.com/googleapis/java-logging/commit/6a7280d0851024c1b44457fa7064a7f3d6fc2d5b))
+* Update dependency org.easymock:easymock to v5.5.0 ([#1639](https://github.com/googleapis/java-logging/issues/1639)) ([f559d89](https://github.com/googleapis/java-logging/commit/f559d89bf36201fce609ef752f27baa0c5f6f1c1))
+* Update googleapis/sdk-platform-java action to v2.51.1 ([#1742](https://github.com/googleapis/java-logging/issues/1742)) ([3c7a2c7](https://github.com/googleapis/java-logging/commit/3c7a2c70fd46cc7196ef7b037d6017971e8a020a))
+
+## [3.21.0](https://github.com/googleapis/java-logging/compare/v3.20.7...v3.21.0) (2024-12-13)
+
+
+### Features
+
+* Introduce `java.time` methods ([#1729](https://github.com/googleapis/java-logging/issues/1729)) ([323eb33](https://github.com/googleapis/java-logging/commit/323eb332a65f39c5588cf65ecae0a3454903a1c6))
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.51.0 ([04d8868](https://github.com/googleapis/java-logging/commit/04d886849a4b41fad17f501f2c40ae54e6daa71a))
+
+
+### Dependencies
+
+* Update dependency io.opentelemetry:opentelemetry-bom to v1.45.0 ([#1638](https://github.com/googleapis/java-logging/issues/1638)) ([7e007d4](https://github.com/googleapis/java-logging/commit/7e007d4f966ed7e9c75cbf0ce951441052e8735c))
+* Update sdk platform java dependencies ([#1736](https://github.com/googleapis/java-logging/issues/1736)) ([88b4cdf](https://github.com/googleapis/java-logging/commit/88b4cdf71463285e50a815e0635d36301d583e4c))
+
+## [3.20.7](https://github.com/googleapis/java-logging/compare/v3.20.6...v3.20.7) (2024-11-18)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.49.0 ([a1ec68d](https://github.com/googleapis/java-logging/commit/a1ec68d539e4d0720fb2cf72314deb4f485f3d4a))
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.50.0 ([afcf63c](https://github.com/googleapis/java-logging/commit/afcf63cc063c4e0f5159c3ac5dbe2d372c335beb))
+* Fixed outdated link to X-Cloud-Trace-Context header description ([#1713](https://github.com/googleapis/java-logging/issues/1713)) ([d474313](https://github.com/googleapis/java-logging/commit/d4743138b9e5c9fd4e9c59b0793028f1e424e6e4))
+
+
+### Dependencies
+
+* Update sdk platform java dependencies ([#1725](https://github.com/googleapis/java-logging/issues/1725)) ([531f8c5](https://github.com/googleapis/java-logging/commit/531f8c5089a260840eee7ff97d315307f074f5e6))
+
+## [3.20.6](https://github.com/googleapis/java-logging/compare/v3.20.5...v3.20.6) (2024-10-26)
+
+
+### Dependencies
+
+* Update sdk platform java dependencies ([#1717](https://github.com/googleapis/java-logging/issues/1717)) ([ee9ef91](https://github.com/googleapis/java-logging/commit/ee9ef91a9ebaed9faa5870a29be40b0c1531a226))
+
+## [3.20.5](https://github.com/googleapis/java-logging/compare/v3.20.4...v3.20.5) (2024-10-23)
+
+
+### Dependencies
+
+* Update sdk platform java dependencies ([#1707](https://github.com/googleapis/java-logging/issues/1707)) ([2359040](https://github.com/googleapis/java-logging/commit/23590409f5c4aaff5c741e860fc0916f7ec4c963))
+
+## [3.20.4](https://github.com/googleapis/java-logging/compare/v3.20.3...v3.20.4) (2024-10-07)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.47.0 ([90b88ee](https://github.com/googleapis/java-logging/commit/90b88ee70ee84bdcb0af4aced50b5ee61e0a706c))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.37.0 ([#1702](https://github.com/googleapis/java-logging/issues/1702)) ([1f7da17](https://github.com/googleapis/java-logging/commit/1f7da17810fa22b8437edc88e4f95b3ed5cb8349))
+
+## [3.20.3](https://github.com/googleapis/java-logging/compare/v3.20.2...v3.20.3) (2024-10-01)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.36.1 ([#1698](https://github.com/googleapis/java-logging/issues/1698)) ([9491512](https://github.com/googleapis/java-logging/commit/94915125fd2425ffba5ef86da0c54af3c1d2c138))
+* Update dependency org.apache.maven.plugins:maven-deploy-plugin to v3.1.3 ([2b6ea70](https://github.com/googleapis/java-logging/commit/2b6ea703aad05e714f5634fbd74e0b9bca0c51f9))
+
+## [3.20.2](https://github.com/googleapis/java-logging/compare/v3.20.1...v3.20.2) (2024-09-12)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.35.0 ([#1683](https://github.com/googleapis/java-logging/issues/1683)) ([31ec2b9](https://github.com/googleapis/java-logging/commit/31ec2b972d5e11e12fe0432f42e3e5b8f23312c6))
+
+## [3.20.1](https://github.com/googleapis/java-logging/compare/v3.20.0...v3.20.1) (2024-08-22)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.34.0 ([#1677](https://github.com/googleapis/java-logging/issues/1677)) ([dbd050c](https://github.com/googleapis/java-logging/commit/dbd050c354cee5272c37dd323358b222cea5e87e))
+
+## [3.20.0](https://github.com/googleapis/java-logging/compare/v3.19.0...v3.20.0) (2024-08-02)
+
+
+### Features
+
+* Enable hermetic library generation ([#1620](https://github.com/googleapis/java-logging/issues/1620)) ([034b9c4](https://github.com/googleapis/java-logging/commit/034b9c42ac8ba12f20dbde9e90ae8e59ea4c5748))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.33.0 ([#1664](https://github.com/googleapis/java-logging/issues/1664)) ([cb6de76](https://github.com/googleapis/java-logging/commit/cb6de767ba726a1178b4ebd0b481a4fc2454b910))
+
+
+### Documentation
+
+* Documentation update for OpenTelemetry and tracing ([#1657](https://github.com/googleapis/java-logging/issues/1657)) ([e3c6670](https://github.com/googleapis/java-logging/commit/e3c667094170ac7d404addc797facbe997ca51d3))
+
+## [3.19.0](https://github.com/googleapis/java-logging/compare/v3.18.0...v3.19.0) (2024-06-26)
+
+
+### Features
+
+* **logging:** OpenTelemetry trace/span ID integration for Java logging library ([#1596](https://github.com/googleapis/java-logging/issues/1596)) ([67db829](https://github.com/googleapis/java-logging/commit/67db829621fd1c4a876d158fe1afb4927821fa54))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.32.0 ([#1649](https://github.com/googleapis/java-logging/issues/1649)) ([cb428d1](https://github.com/googleapis/java-logging/commit/cb428d19a1ea750520d336c9d1042d50f3801f15))
+
+## [3.18.0](https://github.com/googleapis/java-logging/compare/v3.17.2...v3.18.0) (2024-06-04)
+
+
+### Features
+
+* [java] allow passing libraries_bom_version from env ([#1967](https://github.com/googleapis/java-logging/issues/1967)) ([#1615](https://github.com/googleapis/java-logging/issues/1615)) ([dc00cd0](https://github.com/googleapis/java-logging/commit/dc00cd0da891b59f3c22cd7ce281868f5ce8b433))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.31.0 ([#1625](https://github.com/googleapis/java-logging/issues/1625)) ([9db8f3b](https://github.com/googleapis/java-logging/commit/9db8f3b948e20fa406f315b670341da2b00f0856))
+
+## [3.17.2](https://github.com/googleapis/java-logging/compare/v3.17.1...v3.17.2) (2024-05-16)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.30.1 ([#1611](https://github.com/googleapis/java-logging/issues/1611)) ([e7a0904](https://github.com/googleapis/java-logging/commit/e7a0904a1faf04b0de400c1778f976494246e39e))
+
+## [3.17.1](https://github.com/googleapis/java-logging/compare/v3.17.0...v3.17.1) (2024-05-06)
+
+
+### Dependencies
+
+* Update actions/checkout action to v4 ([#1570](https://github.com/googleapis/java-logging/issues/1570)) ([ea0db35](https://github.com/googleapis/java-logging/commit/ea0db3579da6e965e778233b3cba4862b3fff65c))
+* Update actions/github-script action to v7 ([#1571](https://github.com/googleapis/java-logging/issues/1571)) ([16d6192](https://github.com/googleapis/java-logging/commit/16d61928b6d4887faebbdd48a694a2edff8cb752))
+* Update actions/setup-java action to v4 ([#1572](https://github.com/googleapis/java-logging/issues/1572)) ([9eb8834](https://github.com/googleapis/java-logging/commit/9eb88346fac9688c0e56bec83f7407c5690a5b7f))
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.30.0 ([#1603](https://github.com/googleapis/java-logging/issues/1603)) ([16967e5](https://github.com/googleapis/java-logging/commit/16967e5ba704a75419904ba2aaabce0cbc116352))
+
+## [3.17.0](https://github.com/googleapis/java-logging/compare/v3.16.3...v3.17.0) (2024-04-25)
+
+
+### Features
+
+* Add Cloud Run Jobs support ([#1574](https://github.com/googleapis/java-logging/issues/1574)) ([1dd64d0](https://github.com/googleapis/java-logging/commit/1dd64d078e0d4cbb1e16cb1d050ba192492d6a60))
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.39.0 ([#1587](https://github.com/googleapis/java-logging/issues/1587)) ([848418b](https://github.com/googleapis/java-logging/commit/848418b426c2e93e636dbd9de71985c386ccb9d2))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.29.0 ([#1586](https://github.com/googleapis/java-logging/issues/1586)) ([edcaf8d](https://github.com/googleapis/java-logging/commit/edcaf8de643a7f7f419ee6059c706d0ef0ef4873))
+
+## [3.16.3](https://github.com/googleapis/java-logging/compare/v3.16.2...v3.16.3) (2024-04-17)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.28.1 ([#1569](https://github.com/googleapis/java-logging/issues/1569)) ([8eb0781](https://github.com/googleapis/java-logging/commit/8eb0781b1e1e6e369a6ff0a03d1db4cd0462a6a7))
+
+## [3.16.2](https://github.com/googleapis/java-logging/compare/v3.16.1...v3.16.2) (2024-03-20)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.28.0 ([#1560](https://github.com/googleapis/java-logging/issues/1560)) ([d52e623](https://github.com/googleapis/java-logging/commit/d52e62343aa814183baa4fa8ea39d41a5e7c423f))
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.28.1 ([#1563](https://github.com/googleapis/java-logging/issues/1563)) ([81aa3e6](https://github.com/googleapis/java-logging/commit/81aa3e6b6662d62844b289a22e8aba50dff36a51))
+
+## [3.16.1](https://github.com/googleapis/java-logging/compare/v3.16.0...v3.16.1) (2024-03-07)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.37.0 ([#1553](https://github.com/googleapis/java-logging/issues/1553)) ([15b05fc](https://github.com/googleapis/java-logging/commit/15b05fc4a8e6c4069414110b749525082821e509))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.27.0 ([#1552](https://github.com/googleapis/java-logging/issues/1552)) ([6c5464d](https://github.com/googleapis/java-logging/commit/6c5464d1c5a74962fcd459a1e03282747e148a44))
+
+## [3.16.0](https://github.com/googleapis/java-logging/compare/v3.15.17...v3.16.0) (2024-02-20)
+
+
+### Features
+
+* Add an API method for reordering firewall policies ([#1538](https://github.com/googleapis/java-logging/issues/1538)) ([9cd6b96](https://github.com/googleapis/java-logging/commit/9cd6b96d9946828c02ccff2ff846a06cc6fff329))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.25.0 ([#1535](https://github.com/googleapis/java-logging/issues/1535)) ([7fde779](https://github.com/googleapis/java-logging/commit/7fde7795f03ac96353912829b42adc0035a41d26))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.10.0 ([#1528](https://github.com/googleapis/java-logging/issues/1528)) ([b3e4f9b](https://github.com/googleapis/java-logging/commit/b3e4f9b77bffc49a4f9569d4b7a9318a0d5ea5c0))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.10.0 ([#1456](https://github.com/googleapis/java-logging/issues/1456)) ([f27713e](https://github.com/googleapis/java-logging/commit/f27713ed55159754715cca5ff205364e315a7c05))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.10.1 ([#1542](https://github.com/googleapis/java-logging/issues/1542)) ([af784bc](https://github.com/googleapis/java-logging/commit/af784bce7c5272a346ce5016464c87af7d69b442))
+* Update dependency org.junit.vintage:junit-vintage-engine to v5.10.2 ([#1530](https://github.com/googleapis/java-logging/issues/1530)) ([20981dc](https://github.com/googleapis/java-logging/commit/20981dc90ca1b73b74d9f5a0c7f0dfa4d9960ab9))
+
+## [3.15.17](https://github.com/googleapis/java-logging/compare/v3.15.16...v3.15.17) (2024-02-07)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:sdk-platform-java-config to v3.24.0 ([#1526](https://github.com/googleapis/java-logging/issues/1526)) ([235f1aa](https://github.com/googleapis/java-logging/commit/235f1aa380d4f34f65d4cc957b3d26fa6a35e226))
+
+
+### Documentation
+
+* Fix typo in code comments ([#1520](https://github.com/googleapis/java-logging/issues/1520)) ([0440fc6](https://github.com/googleapis/java-logging/commit/0440fc6dfa3c5cd19f0d7d941af242872da1bbd3))
+
+## [3.15.16](https://github.com/googleapis/java-logging/compare/v3.15.15...v3.15.16) (2024-01-25)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.32.0 ([#1511](https://github.com/googleapis/java-logging/issues/1511)) ([e2f574c](https://github.com/googleapis/java-logging/commit/e2f574caa0b8c2a2cdb3b186fbf2d599d6ef4c2b))
+* Enable v2.LogEntry Protobufs converter functions ([#1509](https://github.com/googleapis/java-logging/issues/1509)) ([9ef4d90](https://github.com/googleapis/java-logging/commit/9ef4d9048b1ecdc887ebc9cb4898a4bfe3f6c154))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.22.0 ([#1510](https://github.com/googleapis/java-logging/issues/1510)) ([b40e846](https://github.com/googleapis/java-logging/commit/b40e8465590dadec7c9ff26eb27e92c16b059489))
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.23.0 ([#1518](https://github.com/googleapis/java-logging/issues/1518)) ([30ba9ed](https://github.com/googleapis/java-logging/commit/30ba9ed687f5469d36138a138f68cd998cf60b53))
+
+## [3.15.15](https://github.com/googleapis/java-logging/compare/v3.15.14...v3.15.15) (2024-01-10)
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.31.0 ([#1502](https://github.com/googleapis/java-logging/issues/1502)) ([c7a20de](https://github.com/googleapis/java-logging/commit/c7a20de29bf6fae079f8d73e3062025a79c220c9))
+* Replace internal Structs class with google-cloud-core version ([#1501](https://github.com/googleapis/java-logging/issues/1501)) ([21e1929](https://github.com/googleapis/java-logging/commit/21e19295923a33759229e2e992d003409ab1feb3))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.21.0 ([#1500](https://github.com/googleapis/java-logging/issues/1500)) ([6cce3c9](https://github.com/googleapis/java-logging/commit/6cce3c9bbe051180789c7ff4fbdde4c45fe46888))
+
+## [3.15.14](https://github.com/googleapis/java-logging/compare/v3.15.13...v3.15.14) (2023-12-01)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.20.0 ([#1484](https://github.com/googleapis/java-logging/issues/1484)) ([f3227db](https://github.com/googleapis/java-logging/commit/f3227dbbb6ef7f8b16ff4a6d39882f57868915f1))
+
+## [3.15.13](https://github.com/googleapis/java-logging/compare/v3.15.12...v3.15.13) (2023-11-06)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.19.0 ([#1468](https://github.com/googleapis/java-logging/issues/1468)) ([5835a7d](https://github.com/googleapis/java-logging/commit/5835a7dc1c839eb3bc379470846451bd51fdfc24))
+* Update dependency org.junit.vintage:junit-vintage-engine to v5.10.1 ([#1471](https://github.com/googleapis/java-logging/issues/1471)) ([debc77f](https://github.com/googleapis/java-logging/commit/debc77f4ce57d768474c27eb6c056f7c10c7d743))
+
+## [3.15.12](https://github.com/googleapis/java-logging/compare/v3.15.11...v3.15.12) (2023-10-25)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.18.0 ([#1454](https://github.com/googleapis/java-logging/issues/1454)) ([dc25a87](https://github.com/googleapis/java-logging/commit/dc25a87cb6e1d64c2e2c811a928ea2553a684daa))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.28 ([#1455](https://github.com/googleapis/java-logging/issues/1455)) ([3080cec](https://github.com/googleapis/java-logging/commit/3080cec373f8d9d61ce57363553925a07702d552))
+
+## [3.15.11](https://github.com/googleapis/java-logging/compare/v3.15.10...v3.15.11) (2023-10-10)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.17.0 ([#1444](https://github.com/googleapis/java-logging/issues/1444)) ([748e8a2](https://github.com/googleapis/java-logging/commit/748e8a29026b6eb782a559df207a70555289f906))
+
+## [3.15.10](https://github.com/googleapis/java-logging/compare/v3.15.9...v3.15.10) (2023-09-27)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.16.1 ([#1434](https://github.com/googleapis/java-logging/issues/1434)) ([e9e9835](https://github.com/googleapis/java-logging/commit/e9e9835e6c7b52364104a1e4a503027efb722422))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.27 ([#1430](https://github.com/googleapis/java-logging/issues/1430)) ([9e750a3](https://github.com/googleapis/java-logging/commit/9e750a3c3685671ee573a7e8190622d7f9002b51))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.27 ([#1431](https://github.com/googleapis/java-logging/issues/1431)) ([7c2aa2c](https://github.com/googleapis/java-logging/commit/7c2aa2cc3b5651674591dc4e6cb89774d14e6513))
+
+## [3.15.9](https://github.com/googleapis/java-logging/compare/v3.15.8...v3.15.9) (2023-09-11)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.15.0 ([#1424](https://github.com/googleapis/java-logging/issues/1424)) ([4f82f33](https://github.com/googleapis/java-logging/commit/4f82f339e47014821eca217f5200080e6b78e03f))
+* Update dependency org.easymock:easymock to v5.2.0 ([#1421](https://github.com/googleapis/java-logging/issues/1421)) ([f931544](https://github.com/googleapis/java-logging/commit/f9315443ba97104f1a23e5695ed72cb4bd2dfa10))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.26 ([#1420](https://github.com/googleapis/java-logging/issues/1420)) ([ff581a6](https://github.com/googleapis/java-logging/commit/ff581a67270777fe15e291794df3b49041c111e3))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.26 ([#1412](https://github.com/googleapis/java-logging/issues/1412)) ([bd9be4e](https://github.com/googleapis/java-logging/commit/bd9be4e8aecd5b7a532a6f2eb91151201a41334f))
+
+## [3.15.8](https://github.com/googleapis/java-logging/compare/v3.15.7...v3.15.8) (2023-08-08)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.14.0 ([#1409](https://github.com/googleapis/java-logging/issues/1409)) ([f9af381](https://github.com/googleapis/java-logging/commit/f9af381b302aeefa401e5bc2f51d97c09f1484e5))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.24 ([#1411](https://github.com/googleapis/java-logging/issues/1411)) ([0487cdf](https://github.com/googleapis/java-logging/commit/0487cdff06c0ce9529d4c662991cf84ad25b9f40))
+
+## [3.15.7](https://github.com/googleapis/java-logging/compare/v3.15.6...v3.15.7) (2023-07-24)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.13.1 ([#1395](https://github.com/googleapis/java-logging/issues/1395)) ([1a29b9d](https://github.com/googleapis/java-logging/commit/1a29b9da803238ff1dee0c69d9449d97d4324477))
+* Update dependency org.junit.vintage:junit-vintage-engine to v5.10.0 ([#1397](https://github.com/googleapis/java-logging/issues/1397)) ([f15d246](https://github.com/googleapis/java-logging/commit/f15d2462962c261be5726d5a68b6a1d31aa916fc))
+
+## [3.15.6](https://github.com/googleapis/java-logging/compare/v3.15.5...v3.15.6) (2023-07-17)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.13.0 ([#1388](https://github.com/googleapis/java-logging/issues/1388)) ([03179b0](https://github.com/googleapis/java-logging/commit/03179b0697f17bfc114ff114e454464ed76f8d5b))
+
+## [3.15.5](https://github.com/googleapis/java-logging/compare/v3.15.4...v3.15.5) (2023-06-22)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.12.0 ([#1382](https://github.com/googleapis/java-logging/issues/1382)) ([8241302](https://github.com/googleapis/java-logging/commit/824130227897ed17c5b8a1becf32a695d844b2bb))
+
+## [3.15.4](https://github.com/googleapis/java-logging/compare/v3.15.3...v3.15.4) (2023-06-22)
+
+
+### Dependencies
+
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.23 ([#1374](https://github.com/googleapis/java-logging/issues/1374)) ([dce3c4c](https://github.com/googleapis/java-logging/commit/dce3c4c9413c2d1674b6ddaf6fe9351a28f0673a))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.23 ([#1375](https://github.com/googleapis/java-logging/issues/1375)) ([a15c73c](https://github.com/googleapis/java-logging/commit/a15c73cbf8c22971f690d38fa87b6b349851d5c8))
+
+## [3.15.3](https://github.com/googleapis/java-logging/compare/v3.15.2...v3.15.3) (2023-06-08)
+
+
+### Bug Fixes
+
+* Remove org.jspecify dependency ([#1364](https://github.com/googleapis/java-logging/issues/1364)) ([8138f46](https://github.com/googleapis/java-logging/commit/8138f463e170f1927280d3c083fa403b184fca47))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.11.0 ([#1367](https://github.com/googleapis/java-logging/issues/1367)) ([8cd2a53](https://github.com/googleapis/java-logging/commit/8cd2a53b396d4671514bf8cca1b4c2a62cfb457c))
+
+## [3.15.2](https://github.com/googleapis/java-logging/compare/v3.15.1...v3.15.2) (2023-05-30)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.10.1 ([#1354](https://github.com/googleapis/java-logging/issues/1354)) ([b2f1111](https://github.com/googleapis/java-logging/commit/b2f1111fc8df71b40a85505e1b8209d315cc2c90))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.22 ([#1340](https://github.com/googleapis/java-logging/issues/1340)) ([b3b9d5f](https://github.com/googleapis/java-logging/commit/b3b9d5ffe078a3203725f3709c1840cb88f6e9ea))
+
+## [3.15.1](https://github.com/googleapis/java-logging/compare/v3.15.0...v3.15.1) (2023-05-12)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.9.0 ([#1342](https://github.com/googleapis/java-logging/issues/1342)) ([8b14ae1](https://github.com/googleapis/java-logging/commit/8b14ae17514481a5925ae3ff079cc4f1b4ad6d94))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.22 ([#1341](https://github.com/googleapis/java-logging/issues/1341)) ([cfc0106](https://github.com/googleapis/java-logging/commit/cfc0106c359c153031bddcac7dadc292a9bb561e))
+
+## [3.15.0](https://github.com/googleapis/java-logging/compare/v3.14.9...v3.15.0) (2023-05-06)
+
+
+### Features
+
+* Log Analytics features of the Cloud Logging API ([#1335](https://github.com/googleapis/java-logging/issues/1335)) ([7d43b80](https://github.com/googleapis/java-logging/commit/7d43b8049c71187fffcde39274db38ebb54cddfa))
+
+
+### Dependencies
+
+* Update dependency org.junit.vintage:junit-vintage-engine to v5.9.3 ([#1329](https://github.com/googleapis/java-logging/issues/1329)) ([dfb98f4](https://github.com/googleapis/java-logging/commit/dfb98f47098d4560fc3ef93f126af1770ae4faf6))
+
+## [3.14.9](https://github.com/googleapis/java-logging/compare/v3.14.8...v3.14.9) (2023-04-25)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.8.0 ([#1326](https://github.com/googleapis/java-logging/issues/1326)) ([5a56f1b](https://github.com/googleapis/java-logging/commit/5a56f1b5087e65bc097d5c8a85d000d12bbbca8c))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.21 ([#1319](https://github.com/googleapis/java-logging/issues/1319)) ([5aef8d6](https://github.com/googleapis/java-logging/commit/5aef8d6492c9ebf8e989ee652dcf4a1d82cac8a4))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.21 ([#1320](https://github.com/googleapis/java-logging/issues/1320)) ([fc2d065](https://github.com/googleapis/java-logging/commit/fc2d0655e5b3d2ea9aedf1a4fd65fad8cf815462))
+
+## [3.14.8](https://github.com/googleapis/java-logging/compare/v3.14.7...v3.14.8) (2023-04-14)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.7.0 ([#1318](https://github.com/googleapis/java-logging/issues/1318)) ([973d260](https://github.com/googleapis/java-logging/commit/973d2601bc1639b09d4dd89dd2b6f90cd1b779e9))
+
+## [3.14.7](https://github.com/googleapis/java-logging/compare/v3.14.6...v3.14.7) (2023-03-28)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.6.0 ([#1308](https://github.com/googleapis/java-logging/issues/1308)) ([febcf49](https://github.com/googleapis/java-logging/commit/febcf49085ed0fb6be02aaf9108805dd4cce31b8))
+
+## [3.14.6](https://github.com/googleapis/java-logging/compare/v3.14.5...v3.14.6) (2023-03-20)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.5.0 ([#1301](https://github.com/googleapis/java-logging/issues/1301)) ([9fa6f05](https://github.com/googleapis/java-logging/commit/9fa6f05a9ea1444d9abad4e0eae5fd854bb2608c))
+
+## [3.14.5](https://github.com/googleapis/java-logging/compare/v3.14.4...v3.14.5) (2023-03-02)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.4.0 ([#1290](https://github.com/googleapis/java-logging/issues/1290)) ([84d42ae](https://github.com/googleapis/java-logging/commit/84d42ae6da926785462088de23947bc742f9dc0a))
+
+## [3.14.4](https://github.com/googleapis/java-logging/compare/v3.14.3...v3.14.4) (2023-02-21)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.3.0 ([#1282](https://github.com/googleapis/java-logging/issues/1282)) ([58ac608](https://github.com/googleapis/java-logging/commit/58ac608ddbf5803bb394bb4833cf8af0bbb22e91))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.20 ([#1279](https://github.com/googleapis/java-logging/issues/1279)) ([296cce1](https://github.com/googleapis/java-logging/commit/296cce153cbd263e620c1fbb028466f62f7251dd))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.20 ([#1280](https://github.com/googleapis/java-logging/issues/1280)) ([6363196](https://github.com/googleapis/java-logging/commit/63631966432aac89883dd80c0087576454616cc2))
+
+## [3.14.3](https://github.com/googleapis/java-logging/compare/v3.14.2...v3.14.3) (2023-02-06)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.2.0 ([#1269](https://github.com/googleapis/java-logging/issues/1269)) ([e196a80](https://github.com/googleapis/java-logging/commit/e196a802d0d004dcec2ddfb352ed9aebebe68810))
+
+## [3.14.2](https://github.com/googleapis/java-logging/compare/v3.14.1...v3.14.2) (2023-01-24)
+
+
+### Bug Fixes
+
+* **java:** Skip fixing poms for special modules ([#1744](https://github.com/googleapis/java-logging/issues/1744)) ([#1256](https://github.com/googleapis/java-logging/issues/1256)) ([09eeff0](https://github.com/googleapis/java-logging/commit/09eeff0b4608bad1e854252ff73688a867a071f1))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.1.2 ([#1258](https://github.com/googleapis/java-logging/issues/1258)) ([d4bc663](https://github.com/googleapis/java-logging/commit/d4bc663a0a0295594fb6333cf9bf2a6fd7a7b7e8))
+
+## [3.14.1](https://github.com/googleapis/java-logging/compare/v3.14.0...v3.14.1) (2023-01-10)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.1.1 ([#1243](https://github.com/googleapis/java-logging/issues/1243)) ([fdf6b7a](https://github.com/googleapis/java-logging/commit/fdf6b7a44435286a47e1143a53a8307bb5b8fc63))
+* Update dependency org.junit.vintage:junit-vintage-engine to v5.9.2 ([#1245](https://github.com/googleapis/java-logging/issues/1245)) ([e73a704](https://github.com/googleapis/java-logging/commit/e73a704fa92d8f2abfe3b979e741b7f00ab89bca))
+
+## [3.14.0](https://github.com/googleapis/java-logging/compare/v3.13.7...v3.14.0) (2022-12-31)
+
+
+### Features
+
+* Next release from main branch is 3.14.0 ([#1236](https://github.com/googleapis/java-logging/issues/1236)) ([125d94c](https://github.com/googleapis/java-logging/commit/125d94c9e88196ddd02d4a4acb49bf124cbda81a))
+
+
+### Dependencies
+
+* Update dependency org.easymock:easymock to v5.1.0 ([#1238](https://github.com/googleapis/java-logging/issues/1238)) ([d9a381a](https://github.com/googleapis/java-logging/commit/d9a381a1f2418e2d9a16afa110459e90a3c53d00))
+
+## [3.13.7](https://github.com/googleapis/java-logging/compare/v3.13.6...v3.13.7) (2022-12-19)
+
+
+### Bug Fixes
+
+* Install auth plugin on gke environment tests ([#1232](https://github.com/googleapis/java-logging/issues/1232)) ([d18bbba](https://github.com/googleapis/java-logging/commit/d18bbba07bc44e1bdc231a9ad0eaa258fb94081d))
+
+## [3.13.6](https://github.com/googleapis/java-logging/compare/v3.13.5...v3.13.6) (2022-12-07)
+
+
+### Bug Fixes
+
+* Retrieving logentries pagewise always results in an exception ([#1220](https://github.com/googleapis/java-logging/issues/1220)) ([662a439](https://github.com/googleapis/java-logging/commit/662a4394688661e7da2da51446cb3a73658ead62))
+
+## [3.13.5](https://github.com/googleapis/java-logging/compare/v3.13.4...v3.13.5) (2022-12-06)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.1.0 ([#1219](https://github.com/googleapis/java-logging/issues/1219)) ([b54e015](https://github.com/googleapis/java-logging/commit/b54e015b13b52bfae0f57242a08c452a74cbfb29))
+
+## [3.13.4](https://github.com/googleapis/java-logging/compare/v3.13.3...v3.13.4) (2022-12-03)
+
+
+### Dependencies
+
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.19 ([#1214](https://github.com/googleapis/java-logging/issues/1214)) ([f104203](https://github.com/googleapis/java-logging/commit/f1042031e5f2ef2fd1c008e9d15a1c14d4831435))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.19 ([#1215](https://github.com/googleapis/java-logging/issues/1215)) ([7785a7c](https://github.com/googleapis/java-logging/commit/7785a7c9c1e1b975cd9ee723076983268631a50d))
+
+## [3.13.3](https://github.com/googleapis/java-logging/compare/v3.13.2...v3.13.3) (2022-12-01)
+
+
+### Bug Fixes
+
+* Add a partner team as approvers for PRs ([#1211](https://github.com/googleapis/java-logging/issues/1211)) ([a69fd5e](https://github.com/googleapis/java-logging/commit/a69fd5e02b41e8818493797f8d4f64f75fdfb5e0))
+* Need a way to disable flushing ([#1206](https://github.com/googleapis/java-logging/issues/1206)) ([aa0c176](https://github.com/googleapis/java-logging/commit/aa0c176418534c1f07054ab10d66006fd88f6c39))
+
+## [3.13.2](https://github.com/googleapis/java-logging/compare/v3.13.1...v3.13.2) (2022-11-21)
+
+
+### Dependencies
+
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.18 ([#1201](https://github.com/googleapis/java-logging/issues/1201)) ([8b00108](https://github.com/googleapis/java-logging/commit/8b001089f2b0c387134f5fda7cea762433be1198))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.18 ([#1202](https://github.com/googleapis/java-logging/issues/1202)) ([c884361](https://github.com/googleapis/java-logging/commit/c884361df06a4eb42712d41e1cfeaa9cf75792b1))
+
+## [3.13.1](https://github.com/googleapis/java-logging/compare/v3.13.0...v3.13.1) (2022-11-16)
+
+
+### Bug Fixes
+
+* Fix failing instrumentation test preventing release ([#1187](https://github.com/googleapis/java-logging/issues/1187)) ([04bb6c0](https://github.com/googleapis/java-logging/commit/04bb6c013f9e6f61976df43d6ebfc679524221af))
+* Test failures due to RESOURCE_EXHAUSTED ([#1197](https://github.com/googleapis/java-logging/issues/1197)) ([f74b86d](https://github.com/googleapis/java-logging/commit/f74b86d69db714884959dee7c1f4851df0a0c916))
+* Wrong order of libraries info in instrumentation ([#1196](https://github.com/googleapis/java-logging/issues/1196)) ([c3942ea](https://github.com/googleapis/java-logging/commit/c3942ea6a7ba3fe094e7971010cd30840675aacf))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.0.6 ([#1190](https://github.com/googleapis/java-logging/issues/1190)) ([01ebe33](https://github.com/googleapis/java-logging/commit/01ebe33363c9dd131de8ff90b87552934dfdd5a6))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.17 ([#1182](https://github.com/googleapis/java-logging/issues/1182)) ([d4f17ab](https://github.com/googleapis/java-logging/commit/d4f17ab247a9761632eb4b7503be3376c7353a29))
+
+## [3.13.0](https://github.com/googleapis/java-logging/compare/v3.12.1...v3.13.0) (2022-11-04)
+
+
+### Features
+
+* Add support for instrumentation version annotations ([#1179](https://github.com/googleapis/java-logging/issues/1179)) ([0931446](https://github.com/googleapis/java-logging/commit/09314464f5170c5c261c3676c55bd28d9ee1b27f))
+* Update release-please.yml with correct path ([#1184](https://github.com/googleapis/java-logging/issues/1184)) ([9e75fe4](https://github.com/googleapis/java-logging/commit/9e75fe4c991db88a39cf5a865c2de081068a6f8f))
+
+
+### Dependencies
+
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.17 ([#1181](https://github.com/googleapis/java-logging/issues/1181)) ([1830525](https://github.com/googleapis/java-logging/commit/18305255917815a859e5957f1b835e7f6a919925))
+
+## [3.12.1](https://github.com/googleapis/java-logging/compare/v3.12.0...v3.12.1) (2022-11-02)
+
+
+### Bug Fixes
+
+* Make partialSuccess to be true by default ([#1173](https://github.com/googleapis/java-logging/issues/1173)) ([123960a](https://github.com/googleapis/java-logging/commit/123960ad31f9258d2dadd788029941bb984ae0fa))
+
+## [3.12.0](https://github.com/googleapis/java-logging/compare/v3.11.10...v3.12.0) (2022-10-27)
+
+
+### Features
+
+* Add support for batching configuration ([#1164](https://github.com/googleapis/java-logging/issues/1164)) ([35be8d1](https://github.com/googleapis/java-logging/commit/35be8d1e931a8784c3263299033fc24d623087b5))
+
+## [3.11.10](https://github.com/googleapis/java-logging/compare/v3.11.9...v3.11.10) (2022-10-26)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.0.5 ([#1156](https://github.com/googleapis/java-logging/issues/1156)) ([413fa54](https://github.com/googleapis/java-logging/commit/413fa54ee4f38d5c28e91f54f4a5cd8e0407b08a))
+* Update dependency org.easymock:easymock to v5.0.1 ([#1159](https://github.com/googleapis/java-logging/issues/1159)) ([df8bfbe](https://github.com/googleapis/java-logging/commit/df8bfbeca6827e7d124a7880ae13e8bf6ec9c24c))
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.16 ([#1144](https://github.com/googleapis/java-logging/issues/1144)) ([4836c7e](https://github.com/googleapis/java-logging/commit/4836c7e037bf6b15cb87d96770a12197cae9e57b))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.16 ([#1154](https://github.com/googleapis/java-logging/issues/1154)) ([a13ef9f](https://github.com/googleapis/java-logging/commit/a13ef9fa9c7d59a719534881cb4a995ead7e827d))
+
+## [3.11.9](https://github.com/googleapis/java-logging/compare/v3.11.8...v3.11.9) (2022-10-17)
+
+
+### Dependencies
+
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.15 ([#1145](https://github.com/googleapis/java-logging/issues/1145)) ([5bd000c](https://github.com/googleapis/java-logging/commit/5bd000c55e24d53667eca0bcb22ee3cbb9f13fe0))
+
+## [3.11.8](https://github.com/googleapis/java-logging/compare/v3.11.7...v3.11.8) (2022-10-15)
+
+
+### Dependencies
+
+* Update dependency org.easymock:easymock to v5 ([#1139](https://github.com/googleapis/java-logging/issues/1139)) ([ad33e92](https://github.com/googleapis/java-logging/commit/ad33e92641907226004c82de2266afa99111a7d5))
+
+## [3.11.7](https://github.com/googleapis/java-logging/compare/v3.11.6...v3.11.7) (2022-10-12)
+
+
+### Bug Fixes
+
+* Add safe directory for environment tests ([#1131](https://github.com/googleapis/java-logging/issues/1131)) ([a6ff3c6](https://github.com/googleapis/java-logging/commit/a6ff3c663647bb92ee542a60a3eb25b1392a5457))
+
+## [3.11.6](https://github.com/googleapis/java-logging/compare/v3.11.5...v3.11.6) (2022-10-07)
+
+
+### Bug Fixes
+
+* Logging SDK not applying quota limits for project set using quotaProjectId ([#1125](https://github.com/googleapis/java-logging/issues/1125)) ([70fc6ee](https://github.com/googleapis/java-logging/commit/70fc6ee9c0fdc845a06e031ca82c50b8def2bb3b))
+
+## [3.11.5](https://github.com/googleapis/java-logging/compare/v3.11.4...v3.11.5) (2022-10-03)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.0.4 ([#1120](https://github.com/googleapis/java-logging/issues/1120)) ([17a6e26](https://github.com/googleapis/java-logging/commit/17a6e26d955d9e8d6de9e7b68473f3d09a779d82))
+
+## [3.11.4](https://github.com/googleapis/java-logging/compare/v3.11.3...v3.11.4) (2022-10-01)
+
+
+### Bug Fixes
+
+* Add flush() calls in samples ([#1116](https://github.com/googleapis/java-logging/issues/1116)) ([6d3cb5b](https://github.com/googleapis/java-logging/commit/6d3cb5bf787409d44ba8c0d4c20fb6810a8d1d88))
+
+## [3.11.3](https://github.com/googleapis/java-logging/compare/v3.11.2...v3.11.3) (2022-09-22)
+
+
+### Dependencies
+
+* Update dependency org.graalvm.buildtools:junit-platform-native to v0.9.14 ([#1079](https://github.com/googleapis/java-logging/issues/1079)) ([c08c4da](https://github.com/googleapis/java-logging/commit/c08c4da8cf91e4d168ad16038a460ac9ab2bed8e))
+* Update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.14 ([#1080](https://github.com/googleapis/java-logging/issues/1080)) ([50c979b](https://github.com/googleapis/java-logging/commit/50c979b8d83f2b5f9c74bbb115b7c30e0326211d))
+
+## [3.11.2](https://github.com/googleapis/java-logging/compare/v3.11.1...v3.11.2) (2022-09-21)
+
+
+### Dependencies
+
+* Update dependency org.junit.vintage:junit-vintage-engine to v5.9.1 ([#1075](https://github.com/googleapis/java-logging/issues/1075)) ([d38e9e0](https://github.com/googleapis/java-logging/commit/d38e9e0a8a9b4faa487a4ce169d0189e8718a88b))
+
+## [3.11.1](https://github.com/googleapis/java-logging/compare/v3.11.0...v3.11.1) (2022-09-15)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.0.3 ([#1067](https://github.com/googleapis/java-logging/issues/1067)) ([6d36ffc](https://github.com/googleapis/java-logging/commit/6d36ffc9f4f7d7411df5fa17b770fba8c6402894))
+
+## [3.11.0](https://github.com/googleapis/java-logging/compare/v3.10.8...v3.11.0) (2022-09-14)
+
+
+### Features
+
+* Apply Google style recommendations ([#1057](https://github.com/googleapis/java-logging/issues/1057)) ([bfef3d1](https://github.com/googleapis/java-logging/commit/bfef3d1a26b499c67d064dcdfd071ea8b6f1eb1b))
+
+
+### Bug Fixes
+
+* Fix a couple linter issues on my stderr update ([#1061](https://github.com/googleapis/java-logging/issues/1061)) ([fa1a18f](https://github.com/googleapis/java-logging/commit/fa1a18f6f6c0924c1dba51d8796a5bb3f43c40a7))
+
+## [3.10.8](https://github.com/googleapis/java-logging/compare/v3.10.7...v3.10.8) (2022-09-09)
+
+
+### Dependencies
+
+* Update dependency com.google.cloud:google-cloud-shared-dependencies to v3.0.2 ([#1060](https://github.com/googleapis/java-logging/issues/1060)) ([b5dea1b](https://github.com/googleapis/java-logging/commit/b5dea1b65e32859d84be76a242fc5aadb4a28277))
+
+## [3.10.7](https://github.com/googleapis/java-logging/compare/v3.10.6...v3.10.7) (2022-09-07)
+
+
+### Bug Fixes
+
+* Apply Google Java Code Clarity suggestions ([#1044](https://github.com/googleapis/java-logging/issues/1044)) ([79e9d8d](https://github.com/googleapis/java-logging/commit/79e9d8d00b0b9be10a12d6bb37f387f6f8b356f2))
+
+## [3.10.6](https://github.com/googleapis/java-logging/compare/v3.10.5...v3.10.6) (2022-08-29)
+
+
+### Dependencies
+
+* use error_prone_annotation via shared deps ([#1049](https://github.com/googleapis/java-logging/issues/1049)) ([0998b9b](https://github.com/googleapis/java-logging/commit/0998b9b83bc20a867dc22a68e103e4d3cac0f403))
+
+## [3.10.5](https://github.com/googleapis/java-logging/compare/v3.10.4...v3.10.5) (2022-08-25)
+
+
+### Bug Fixes
+
+* resource detection for 2nd gen of Cloud Functions works incorrectly ([#1045](https://github.com/googleapis/java-logging/issues/1045)) ([dda1d0a](https://github.com/googleapis/java-logging/commit/dda1d0a48c3db18b46b8306c3304a79054e9b49c))
+
+## [3.10.4](https://github.com/googleapis/java-logging/compare/v3.10.3...v3.10.4) (2022-08-19)
+
+
+### Dependencies
+
+* update dependency com.google.errorprone:error_prone_annotations to v2.15.0 ([#1037](https://github.com/googleapis/java-logging/issues/1037)) ([b2731c7](https://github.com/googleapis/java-logging/commit/b2731c70d1cdb3825e40fd80c771ea56777a1d27))
+
+## [3.10.3](https://github.com/googleapis/java-logging/compare/v3.10.2...v3.10.3) (2022-08-19)
+
+
+### Bug Fixes
+
+* Add explicit RunWith annotations on all tests ([#1004](https://github.com/googleapis/java-logging/issues/1004)) ([342157f](https://github.com/googleapis/java-logging/commit/342157fc0b5819e50a7c53ddb03f6016042272a3))
+* Apply fixes from Google error-prone ([#1010](https://github.com/googleapis/java-logging/issues/1010)) ([2d57d78](https://github.com/googleapis/java-logging/commit/2d57d7886f4281e779c8a1dd54aa056c5a8be46a))
+* Correct the JSON time field name ([#1020](https://github.com/googleapis/java-logging/issues/1020)) ([8c9a218](https://github.com/googleapis/java-logging/commit/8c9a2184bc5f5a697345d9dc1f2afc9b8fd759b7))
+* Fix flakiness in JSON test ([#1006](https://github.com/googleapis/java-logging/issues/1006)) ([cafafe4](https://github.com/googleapis/java-logging/commit/cafafe44531001254e014da07211cc6694df97cc))
+* Fix some typos ([#1008](https://github.com/googleapis/java-logging/issues/1008)) ([5666ee0](https://github.com/googleapis/java-logging/commit/5666ee0dea87bba9eda9d48afee8924a074db6dd))
+* Make LoggingHandler.logEntryFor extensible ([#1021](https://github.com/googleapis/java-logging/issues/1021)) ([79baac6](https://github.com/googleapis/java-logging/commit/79baac68a60cca699088723864bf2de23fca0580))
+* Replace Date with LocalDateTime ([#1012](https://github.com/googleapis/java-logging/issues/1012)) ([765dd89](https://github.com/googleapis/java-logging/commit/765dd895df201966e7dea5851e29638dde115ce2))
+* Supress unchecked conversion warnings ([#1014](https://github.com/googleapis/java-logging/issues/1014)) ([a93ee23](https://github.com/googleapis/java-logging/commit/a93ee233112b28f21d9cc1ed724638455ece4dc0))
+* Update the stub to avoid the deprecated *Map method ([#1002](https://github.com/googleapis/java-logging/issues/1002)) ([49bf5b4](https://github.com/googleapis/java-logging/commit/49bf5b41c354089ad213ff1ce5d3f42aa3d1d02e))
+
+
+### Dependencies
+
+* update dependency org.junit.vintage:junit-vintage-engine to v5.9.0 ([#1016](https://github.com/googleapis/java-logging/issues/1016)) ([e5f0b55](https://github.com/googleapis/java-logging/commit/e5f0b55acdcfb12e79a69eb213c60e237c9e630a))
+
+## [3.10.2](https://github.com/googleapis/java-logging/compare/v3.10.1...v3.10.2) (2022-08-08)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v3 ([#1018](https://github.com/googleapis/java-logging/issues/1018)) ([17efd5c](https://github.com/googleapis/java-logging/commit/17efd5cdcd84ef894afc27afc665661eefb5a22b))
+* update dependency org.graalvm.buildtools:junit-platform-native to v0.9.13 ([#992](https://github.com/googleapis/java-logging/issues/992)) ([3856e4f](https://github.com/googleapis/java-logging/commit/3856e4fa5105f1da37c98a2fbb5ff5dc9166d41b))
+* update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.13 ([#993](https://github.com/googleapis/java-logging/issues/993)) ([a94e428](https://github.com/googleapis/java-logging/commit/a94e42820261caf063b7a8f43df594b873084d7b))
+
+## [3.10.1](https://github.com/googleapis/java-logging/compare/v3.10.0...v3.10.1) (2022-07-13)
+
+
+### Bug Fixes
+
+* enable longpaths support for windows test ([#1485](https://github.com/googleapis/java-logging/issues/1485)) ([#995](https://github.com/googleapis/java-logging/issues/995)) ([b2f68cb](https://github.com/googleapis/java-logging/commit/b2f68cb46d56521eeddcd63a0daea1abd85b70ae))
+
+
+### Dependencies
+
+* update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.12 ([#977](https://github.com/googleapis/java-logging/issues/977)) ([71dc1ee](https://github.com/googleapis/java-logging/commit/71dc1ee5ee98532958ea89f4ee7e3dd801d57501))
+
+## [3.10.0](https://github.com/googleapis/java-logging/compare/v3.9.0...v3.10.0) (2022-06-25)
+
+
+### Features
+
+* Add support for library instrumentation ([#979](https://github.com/googleapis/java-logging/issues/979)) ([2749974](https://github.com/googleapis/java-logging/commit/27499744f37a5fddcc2d6825c69481374e78829c))
+
+
+### Documentation
+
+* **sample:** update README for native image sample ([#974](https://github.com/googleapis/java-logging/issues/974)) ([1512487](https://github.com/googleapis/java-logging/commit/1512487e60141ed5c61a3a60fcca29f52f4ec141))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.13.0 ([#980](https://github.com/googleapis/java-logging/issues/980)) ([18acf1f](https://github.com/googleapis/java-logging/commit/18acf1f64d836ca3fb1b8f4b558ef21d728c391f))
+* update dependency org.graalvm.buildtools:junit-platform-native to v0.9.12 ([#976](https://github.com/googleapis/java-logging/issues/976)) ([01d3213](https://github.com/googleapis/java-logging/commit/01d3213b9e010c3ae3843e5a05bbd01b2961b454))
+
+## [3.9.0](https://github.com/googleapis/java-logging/compare/v3.8.0...v3.9.0) (2022-05-19)
+
+
+### Features
+
+* add build scripts for native image testing in Java 17 ([#1440](https://github.com/googleapis/java-logging/issues/1440)) ([#962](https://github.com/googleapis/java-logging/issues/962)) ([4edb7e4](https://github.com/googleapis/java-logging/commit/4edb7e46e313db88f5400ccada019ac01a51dee4))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.11.0 ([#960](https://github.com/googleapis/java-logging/issues/960)) ([c969b4c](https://github.com/googleapis/java-logging/commit/c969b4cddb54a4b7f25e7a5f8a4c665fde1ece47))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.12.0 ([#966](https://github.com/googleapis/java-logging/issues/966)) ([c95840b](https://github.com/googleapis/java-logging/commit/c95840bc83316c6064f99908da38952179ce4a54))
+
+## [3.8.0](https://github.com/googleapis/java-logging/compare/v3.7.6...v3.8.0) (2022-05-16)
+
+
+### Features
+
+* next release from main branch is 3.7.0 ([#957](https://github.com/googleapis/java-logging/issues/957)) ([576a93e](https://github.com/googleapis/java-logging/commit/576a93e2bba9939425e6fce22b13b6580565689c))
+
+### [3.7.6](https://github.com/googleapis/java-logging/compare/v3.7.5...v3.7.6) (2022-05-03)
+
+
+### Documentation
+
+* Add link to interactive tutorial ([#952](https://github.com/googleapis/java-logging/issues/952)) ([934df5a](https://github.com/googleapis/java-logging/commit/934df5ad5b29f11e781b8b8a4660f89198bb06d1))
+* Add link to interactive walkthrough ([#950](https://github.com/googleapis/java-logging/issues/950)) ([33ae197](https://github.com/googleapis/java-logging/commit/33ae197627d63d6c153f9bbb0076a071029cf686))
+* **sample:** removing unnecessary native-image-support dependency ([#947](https://github.com/googleapis/java-logging/issues/947)) ([75331a6](https://github.com/googleapis/java-logging/commit/75331a6aa754ed93171832f59a5c0012e7cb7e05))
+
+### [3.7.5](https://github.com/googleapis/java-logging/compare/v3.7.4...v3.7.5) (2022-04-15)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.10.0 ([#930](https://github.com/googleapis/java-logging/issues/930)) ([074c6c7](https://github.com/googleapis/java-logging/commit/074c6c791059f4503a4103d8387f6b0b062db3a3))
+* update dependency com.google.cloud:native-image-support to v0.13.1 ([#931](https://github.com/googleapis/java-logging/issues/931)) ([2e4b4d0](https://github.com/googleapis/java-logging/commit/2e4b4d09192a75f3e9107c143c9e74fa05201e1a))
+
+### [3.7.4](https://github.com/googleapis/java-logging/compare/v3.7.3...v3.7.4) (2022-03-31)
+
+
+### Bug Fixes
+
+* Async logging should not rethrow error in onFailure callback ([#923](https://github.com/googleapis/java-logging/issues/923)) ([1adf867](https://github.com/googleapis/java-logging/commit/1adf86722361ce946c733de87cb217fa2f65bfd5))
+* Async logging should not rethrow error in onFailure callback correction ([#925](https://github.com/googleapis/java-logging/issues/925)) ([da92518](https://github.com/googleapis/java-logging/commit/da925189d808833f1b7cc7a1934bcf66f51663be))
+
+### [3.7.3](https://github.com/googleapis/java-logging/compare/v3.7.2...v3.7.3) (2022-03-29)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.9.0 ([#917](https://github.com/googleapis/java-logging/issues/917)) ([b42717e](https://github.com/googleapis/java-logging/commit/b42717e8e2d825cee9918c48ae4b7628f225f6be))
+* update dependency com.google.cloud:native-image-support to v0.12.11 ([#916](https://github.com/googleapis/java-logging/issues/916)) ([6d6bbef](https://github.com/googleapis/java-logging/commit/6d6bbef4bfb0802677e2773ffd95047c71814613))
+
+### [3.7.2](https://github.com/googleapis/java-logging/compare/v3.7.1...v3.7.2) (2022-03-24)
+
+
+### Documentation
+
+* **sample:** Add sample for Native Image support in Logging ([#880](https://github.com/googleapis/java-logging/issues/880)) ([7e59bf3](https://github.com/googleapis/java-logging/commit/7e59bf3c3676ebc6bfcdf6e951d3d8f0b6c1589f))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:native-image-support to v0.12.10 ([#903](https://github.com/googleapis/java-logging/issues/903)) ([b692e02](https://github.com/googleapis/java-logging/commit/b692e0247ea61b290aad0f0245184fd3c026629b))
+* update dependency org.graalvm.buildtools:junit-platform-native to v0.9.10 ([#904](https://github.com/googleapis/java-logging/issues/904)) ([d834a0a](https://github.com/googleapis/java-logging/commit/d834a0a5f10cda8a1327714f8a93c0c6e41143df))
+* update dependency org.graalvm.buildtools:junit-platform-native to v0.9.11 ([#912](https://github.com/googleapis/java-logging/issues/912)) ([c1d6559](https://github.com/googleapis/java-logging/commit/c1d65597ee8ce95dc6276c4f19d13a922c819f0d))
+* update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.10 ([#905](https://github.com/googleapis/java-logging/issues/905)) ([3c44e3e](https://github.com/googleapis/java-logging/commit/3c44e3ed51c52a84b5a5a517a8b8a105f083532c))
+* update dependency org.graalvm.buildtools:native-maven-plugin to v0.9.11 ([#911](https://github.com/googleapis/java-logging/issues/911)) ([3721ef5](https://github.com/googleapis/java-logging/commit/3721ef53305e27afb5bad685a10eb8901988c7b9))
+
+### [3.7.1](https://github.com/googleapis/java-logging/compare/v3.7.0...v3.7.1) (2022-03-03)
+
+
+### Bug Fixes
+
+* do not use GAE_RUNTIME for GAE environment detection ([#891](https://github.com/googleapis/java-logging/issues/891)) ([19e9abb](https://github.com/googleapis/java-logging/commit/19e9abb389ed98cdcca7ef0dfa5b07e69568f6f9))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.8.0 ([#889](https://github.com/googleapis/java-logging/issues/889)) ([4885440](https://github.com/googleapis/java-logging/commit/48854405838151a4179f6d1727fc925b06d1727d))
+
+## [3.7.0](https://github.com/googleapis/java-logging/compare/v3.6.4...v3.7.0) (2022-02-28)
+
+
+### Features
+
+* KMS configuration in settings ([#877](https://github.com/googleapis/java-logging/issues/877)) ([27c199b](https://github.com/googleapis/java-logging/commit/27c199ba91b8423934788cbd6cb8e449dfc7b115))
+* Update Logging API with latest changes ([27c199b](https://github.com/googleapis/java-logging/commit/27c199ba91b8423934788cbd6cb8e449dfc7b115))
+
+
+### Bug Fixes
+
+* **deps:** set gson via java-shared-deps ([#878](https://github.com/googleapis/java-logging/issues/878)) ([5c97fea](https://github.com/googleapis/java-logging/commit/5c97feadf1d4fd80618cdcee19e02e4cbabfb1ea))
+
+### [3.6.4](https://github.com/googleapis/java-logging/compare/v3.6.3...v3.6.4) (2022-02-15)
+
+
+### Dependencies
+
+* update dependency com.google.code.gson:gson to v2.9.0 ([#868](https://github.com/googleapis/java-logging/issues/868)) ([f3d6f3f](https://github.com/googleapis/java-logging/commit/f3d6f3f0d29d1b56f8c8fd191b4b946bc31f6e10))
+
+### [3.6.3](https://github.com/googleapis/java-logging/compare/v3.6.2...v3.6.3) (2022-02-11)
+
+
+### Dependencies
+
+* update actions/github-script action to v6 ([#865](https://github.com/googleapis/java-logging/issues/865)) ([2d05dc8](https://github.com/googleapis/java-logging/commit/2d05dc81b3b56ae6b5205c26719bfd3985c5b9d7))
+
+### [3.6.2](https://github.com/googleapis/java-logging/compare/v3.6.1...v3.6.2) (2022-02-03)
+
+
+### Dependencies
+
+* **java:** update actions/github-script action to v5 ([#1339](https://github.com/googleapis/java-logging/issues/1339)) ([#851](https://github.com/googleapis/java-logging/issues/851)) ([7a5ee11](https://github.com/googleapis/java-logging/commit/7a5ee11ab17aaa36c688e1c631a4c9a65eae6352))
+* update actions/github-script action to v5 ([#849](https://github.com/googleapis/java-logging/issues/849)) ([286728a](https://github.com/googleapis/java-logging/commit/286728a941b34a67e3dccb119d6d2c13830e5c38))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.7.0 ([#852](https://github.com/googleapis/java-logging/issues/852)) ([eb2eef5](https://github.com/googleapis/java-logging/commit/eb2eef553ee6e9f9880f06fd6185e90367063d86))
+
+### [3.6.1](https://github.com/googleapis/java-logging/compare/v3.6.0...v3.6.1) (2022-01-18)
+
+
+### Bug Fixes
+
+* use initialized logging option in constructor ([#843](https://github.com/googleapis/java-logging/issues/843)) ([99fb678](https://github.com/googleapis/java-logging/commit/99fb6782f2a37be569309cc37591ce7b9c86092b))
+
+
+### Dependencies
+
+* update dependency org.easymock:easymock to v4 ([#830](https://github.com/googleapis/java-logging/issues/830)) ([21c2436](https://github.com/googleapis/java-logging/commit/21c243619e3b00891a0ff828e0f3e087b6e17d4b))
+
+## [3.6.0](https://www.github.com/googleapis/java-logging/compare/v3.5.3...v3.6.0) (2022-01-07)
+
+
+### Features
+
+* enable auto-population of missing metadata in logs and opting logs redirection to stdout in JUL handler ([#808](https://www.github.com/googleapis/java-logging/issues/808)) ([bb25d5d](https://www.github.com/googleapis/java-logging/commit/bb25d5def9de42fa6e0de5658154fbf2e72e8fba))
+
+### [3.5.3](https://www.github.com/googleapis/java-logging/compare/v3.5.2...v3.5.3) (2022-01-07)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.6.0 ([#823](https://www.github.com/googleapis/java-logging/issues/823)) ([2816bb3](https://www.github.com/googleapis/java-logging/commit/2816bb37fc57be241b78d85a8862d8e7c9c47221))
+
+### [3.5.2](https://www.github.com/googleapis/java-logging/compare/v3.5.1...v3.5.2) (2021-12-28)
+
+
+### Bug Fixes
+
+* enforce w3c trace context value validation ([#777](https://www.github.com/googleapis/java-logging/issues/777)) ([0150655](https://www.github.com/googleapis/java-logging/commit/0150655891537a8de3f3debb5ec5c49f4a6de146))
+* **java:** add -ntp flag to native image testing command ([#1299](https://www.github.com/googleapis/java-logging/issues/1299)) ([#780](https://www.github.com/googleapis/java-logging/issues/780)) ([3f70b62](https://www.github.com/googleapis/java-logging/commit/3f70b6261b606c03307eb8ca5dbea14526d1b054))
+* Rename LogDestinationName.getId() to LogDestinationName.getDestinationId() ([#797](https://www.github.com/googleapis/java-logging/issues/797)) ([62e7838](https://www.github.com/googleapis/java-logging/commit/62e783839b9a7c29a05bfeac55189bd8ea1bdfd6))
+* Rename staleness.critical config parameter to staleness.extraold ([#781](https://www.github.com/googleapis/java-logging/issues/781)) ([3083bca](https://www.github.com/googleapis/java-logging/commit/3083bca8fb388092c5abfbe5efc58d1de757bb00))
+
+### [3.5.1](https://www.github.com/googleapis/java-logging/compare/v3.5.0...v3.5.1) (2021-12-03)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.5.1 ([#773](https://www.github.com/googleapis/java-logging/issues/773)) ([56907a4](https://www.github.com/googleapis/java-logging/commit/56907a4b1d3a529655f3845bd1e46f308977b436))
+
+## [3.5.0](https://www.github.com/googleapis/java-logging/compare/v3.4.0...v3.5.0) (2021-11-24)
+
+
+### Features
+
+* Enable auto-label bot to mark stale pull requests ([#758](https://www.github.com/googleapis/java-logging/issues/758)) ([23f7fa5](https://www.github.com/googleapis/java-logging/commit/23f7fa559add710b96bad90002fcebef8ac0e5c9))
+* implement context handler to store HTTP request and tracing information ([#752](https://www.github.com/googleapis/java-logging/issues/752)) ([86223ff](https://www.github.com/googleapis/java-logging/commit/86223ff36f9c4b147f322ba646607727b92fbe7b))
+
+
+### Bug Fixes
+
+* handle null pointer when parsing metadata attributes ([#759](https://www.github.com/googleapis/java-logging/issues/759)) ([e8cf6f9](https://www.github.com/googleapis/java-logging/commit/e8cf6f91b56529d28cc002cedb0976ce952e0e0e))
+* modify list log entries example documentation ([#740](https://www.github.com/googleapis/java-logging/issues/740)) ([790fb1a](https://www.github.com/googleapis/java-logging/commit/790fb1a342d63704298d16a576f6cce15bfd4398))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.5.0 ([#743](https://www.github.com/googleapis/java-logging/issues/743)) ([c003417](https://www.github.com/googleapis/java-logging/commit/c003417aade41e025082f47f2185e66707bffcff))
+
+## [3.4.0](https://www.github.com/googleapis/java-logging/compare/v3.3.0...v3.4.0) (2021-11-06)
+
+
+### Features
+
+* Add an ability to delete logs based on project, folder, organization or billing account resource names ([#731](https://www.github.com/googleapis/java-logging/issues/731)) ([25673fd](https://www.github.com/googleapis/java-logging/commit/25673fdc2622f19926e3634ae187182f64efec18))
+* Add destination property into LogEntry ([#720](https://www.github.com/googleapis/java-logging/issues/720)) ([43ea0b4](https://www.github.com/googleapis/java-logging/commit/43ea0b465b29c22e7eb439811f19ada90b9d23dd))
+* add population of the SourceLocation from context ([#721](https://www.github.com/googleapis/java-logging/issues/721)) ([1fa3a6e](https://www.github.com/googleapis/java-logging/commit/1fa3a6e286336a861f83d9b59f28f309fc846d70))
+* Extend a set of options in WriteOption to allow defining the log location as custom project, folder, organization or billing account ([#727](https://www.github.com/googleapis/java-logging/issues/727)) ([1996cb4](https://www.github.com/googleapis/java-logging/commit/1996cb49fa0dc3dd4d35d7d2876c9ac3698a450b))
+
+
+### Bug Fixes
+
+* **java:** java 17 dependency arguments ([#1266](https://www.github.com/googleapis/java-logging/issues/1266)) ([#724](https://www.github.com/googleapis/java-logging/issues/724)) ([5a8cedf](https://www.github.com/googleapis/java-logging/commit/5a8cedfcd30b59c0630edb5769c850bc26467bb3))
+
+## [3.3.0](https://www.github.com/googleapis/java-logging/compare/v3.2.0...v3.3.0) (2021-10-20)
+
+
+### Features
+
+* implement revised version of the monitored resource type discovery and metadata population ([#708](https://www.github.com/googleapis/java-logging/issues/708)) ([0592c96](https://www.github.com/googleapis/java-logging/commit/0592c96bc697a983f521c7ac51df53661c801975))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.4.0 ([#714](https://www.github.com/googleapis/java-logging/issues/714)) ([6ba9df7](https://www.github.com/googleapis/java-logging/commit/6ba9df7e0f36ea4c41d8bd45a67fa671c41d9db6))
+
+## [3.2.0](https://www.github.com/googleapis/java-logging/compare/v3.1.2...v3.2.0) (2021-09-27)
+
+
+### Features
+
+* Add a sample snippet for use of the tailLogEntries API ([8115888](https://www.github.com/googleapis/java-logging/commit/81158885911e6c150fa04053fc41f95640329548))
+* add support for tailLogEntry API ([5a7845a](https://www.github.com/googleapis/java-logging/commit/5a7845a8c6476ca2d80e6fffdcb2f5f061f6260b))
+
+
+### Bug Fixes
+
+* add space to fix embedding exclusion in docs ([#615](https://www.github.com/googleapis/java-logging/issues/615)) ([9d70b96](https://www.github.com/googleapis/java-logging/commit/9d70b96914ae6217cbe58ab1af93e1d5dfe67ce1))
+* fix samples region tags and test flakiness ([#680](https://www.github.com/googleapis/java-logging/issues/680)) ([53481bd](https://www.github.com/googleapis/java-logging/commit/53481bde1e455037cd8102bc1b404ea2c491c235))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.3.0 ([#681](https://www.github.com/googleapis/java-logging/issues/681)) ([9be4047](https://www.github.com/googleapis/java-logging/commit/9be4047f5631c824e3f07cfc8c21211168bd51d4))
+
+### [3.1.2](https://www.github.com/googleapis/java-logging/compare/v3.1.1...v3.1.2) (2021-09-16)
+
+
+### Bug Fixes
+
+* Change timestamp type to support nanosecond resolution ([#654](https://www.github.com/googleapis/java-logging/issues/654)) ([7ae1537](https://www.github.com/googleapis/java-logging/commit/7ae153789268629539cf1ea5246597aae7aa8d19)), closes [#598](https://www.github.com/googleapis/java-logging/issues/598)
+* Return Resource.K8sContainer when autodetecting resource type ([#641](https://www.github.com/googleapis/java-logging/issues/641)) ([6103560](https://www.github.com/googleapis/java-logging/commit/6103560c1c59c3c1ba83a4c9f2be5b5781640c36))
+* update CI to use maven 3.8.1 ([#662](https://www.github.com/googleapis/java-logging/issues/662)) ([9beb2ed](https://www.github.com/googleapis/java-logging/commit/9beb2ed44e3b7ad3eeaf6710b2195e50ac39016f))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.2.1 ([#667](https://www.github.com/googleapis/java-logging/issues/667)) ([8190656](https://www.github.com/googleapis/java-logging/commit/8190656732d3d388569b02dbd0aeefe0e0c7fdff))
+
+### [3.1.1](https://www.github.com/googleapis/java-logging/compare/v3.1.0...v3.1.1) (2021-08-31)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.2.0 ([#649](https://www.github.com/googleapis/java-logging/issues/649)) ([8af8d14](https://www.github.com/googleapis/java-logging/commit/8af8d142eb3d90cd5fba5b3e34d388db1867a56a))
+
+## [3.1.0](https://www.github.com/googleapis/java-logging/compare/v3.0.1...v3.1.0) (2021-08-24)
+
+
+### Features
+
+* implement listLogs API and provide sample snippet ([#602](https://www.github.com/googleapis/java-logging/issues/602)) ([9359569](https://www.github.com/googleapis/java-logging/commit/935956944200d978738d86ae4adff6107532531c))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.1.0 ([#636](https://www.github.com/googleapis/java-logging/issues/636)) ([fb9ac95](https://www.github.com/googleapis/java-logging/commit/fb9ac954293f5a281024e122d06e8487cb3a62c1))
+
+### [3.0.1](https://www.github.com/googleapis/java-logging/compare/v3.0.0...v3.0.1) (2021-08-11)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2.0.1 ([#616](https://www.github.com/googleapis/java-logging/issues/616)) ([02a00a2](https://www.github.com/googleapis/java-logging/commit/02a00a2a417445bb12389e278288c5bac4fd3c81))
+
+## [3.0.0](https://www.github.com/googleapis/java-logging/compare/v2.3.2...v3.0.0) (2021-08-04)
+
+
+### âš BREAKING CHANGES
+
+* release gapic-generator-java v2.0.0 (#605)
+
+### Features
+
+* deprecate methods ([#587](https://www.github.com/googleapis/java-logging/issues/587)) ([85e496d](https://www.github.com/googleapis/java-logging/commit/85e496d5884143ecc6cd1757fcce31d5b83ecda5))
+* release gapic-generator-java v2.0.0 ([#605](https://www.github.com/googleapis/java-logging/issues/605)) ([8fa5c5a](https://www.github.com/googleapis/java-logging/commit/8fa5c5ae1d76d9a0959add1036300a799918dcb4))
+
+
+### Bug Fixes
+
+* describe authorization required for service object ([#582](https://www.github.com/googleapis/java-logging/issues/582)) ([4fd3cdc](https://www.github.com/googleapis/java-logging/commit/4fd3cdc4b4c564da026a0a424ba8d49c8390982e))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v2 ([#606](https://www.github.com/googleapis/java-logging/issues/606)) ([99cb3a0](https://www.github.com/googleapis/java-logging/commit/99cb3a005f2775034d2df207dcb1a6c7f19b6fd4))
+
+### [2.3.2](https://www.github.com/googleapis/java-logging/compare/v2.3.1...v2.3.2) (2021-07-01)
+
+
+### Bug Fixes
+
+* Add `shopt -s nullglob` to dependencies script ([#564](https://www.github.com/googleapis/java-logging/issues/564)) ([5a5f737](https://www.github.com/googleapis/java-logging/commit/5a5f7371569f3e5656a3e40fcc2d72b7a8e0e916))
+* Update dependencies.sh to not break on mac ([#559](https://www.github.com/googleapis/java-logging/issues/559)) ([5877a06](https://www.github.com/googleapis/java-logging/commit/5877a068ae466b0e61d240674263ddb772b43cb2))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v1.4.0 ([#568](https://www.github.com/googleapis/java-logging/issues/568)) ([623a85b](https://www.github.com/googleapis/java-logging/commit/623a85b0ca9ab893b925522fe38f1b03ab822d7e))
+
+### [2.3.1](https://www.github.com/googleapis/java-logging/compare/v2.3.0...v2.3.1) (2021-06-04)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v1.3.0 ([#549](https://www.github.com/googleapis/java-logging/issues/549)) ([b6a7de0](https://www.github.com/googleapis/java-logging/commit/b6a7de0c8d698f33b261b5392f888022c0877000))
+
+## [2.3.0](https://www.github.com/googleapis/java-logging/compare/v2.2.3...v2.3.0) (2021-05-26)
+
+
+### Features
+
+* add `gcf-owl-bot[bot]` to `ignoreAuthors` ([#534](https://www.github.com/googleapis/java-logging/issues/534)) ([5e8a13f](https://www.github.com/googleapis/java-logging/commit/5e8a13f64ef29f2541aa246771ac1659c9f29e97))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v1.2.0 ([#532](https://www.github.com/googleapis/java-logging/issues/532)) ([8a30a36](https://www.github.com/googleapis/java-logging/commit/8a30a365310f07378e65e8e75e70b4fcbb920e17))
+
+### [2.2.3](https://www.github.com/googleapis/java-logging/compare/v2.2.2...v2.2.3) (2021-05-11)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v1.1.0 ([#522](https://www.github.com/googleapis/java-logging/issues/522)) ([12fdf2a](https://www.github.com/googleapis/java-logging/commit/12fdf2afa2090bee0d23b30761561d2215ca13a3))
+
+### [2.2.2](https://www.github.com/googleapis/java-logging/compare/v2.2.1...v2.2.2) (2021-04-24)
+
+
+### Bug Fixes
+
+* release scripts from issuing overlapping phases ([#496](https://www.github.com/googleapis/java-logging/issues/496)) ([e3c1e84](https://www.github.com/googleapis/java-logging/commit/e3c1e84244b5f8cc4a792fd8c6346757f114d186))
+* typo ([#491](https://www.github.com/googleapis/java-logging/issues/491)) ([9b0423f](https://www.github.com/googleapis/java-logging/commit/9b0423fdad66368be15c2fa28f783f31964d5d9a))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.21.1 ([#500](https://www.github.com/googleapis/java-logging/issues/500)) ([f5581a5](https://www.github.com/googleapis/java-logging/commit/f5581a55dfe99812f0538ad19f9a3a259401323a))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v1 ([#507](https://www.github.com/googleapis/java-logging/issues/507)) ([b15d59b](https://www.github.com/googleapis/java-logging/commit/b15d59bea99a6c840b6316f5e25487cc8f057515))
+
+### [2.2.1](https://www.github.com/googleapis/java-logging/compare/v2.2.0...v2.2.1) (2021-04-09)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.21.0 ([#481](https://www.github.com/googleapis/java-logging/issues/481)) ([944e190](https://www.github.com/googleapis/java-logging/commit/944e19060b6e1f47567783365e80a54b153d472c))
+
+## [2.2.0](https://www.github.com/googleapis/java-logging/compare/v2.1.5...v2.2.0) (2021-03-11)
+
+
+### Features
+
+* **generator:** update protoc to v3.15.3 ([#454](https://www.github.com/googleapis/java-logging/issues/454)) ([1e61adb](https://www.github.com/googleapis/java-logging/commit/1e61adb4b817ff099e17ccc9a4433fc5061a4826))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.20.1 ([#465](https://www.github.com/googleapis/java-logging/issues/465)) ([676d0ba](https://www.github.com/googleapis/java-logging/commit/676d0baea2c591f477c0036191874c3d40288251))
+
+### [2.1.5](https://www.github.com/googleapis/java-logging/compare/v2.1.4...v2.1.5) (2021-02-25)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.20.0 ([#449](https://www.github.com/googleapis/java-logging/issues/449)) ([921553a](https://www.github.com/googleapis/java-logging/commit/921553a44e04afed95d6482eda210df43baf177d))
+
+### [2.1.4](https://www.github.com/googleapis/java-logging/compare/v2.1.3...v2.1.4) (2021-02-22)
+
+
+### Documentation
+
+* generate sample code in the Java microgenerator ([#423](https://www.github.com/googleapis/java-logging/issues/423)) ([8649f2f](https://www.github.com/googleapis/java-logging/commit/8649f2fa8d8d730422ea426142fba2bf3ebfec94))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.19.0 ([#439](https://www.github.com/googleapis/java-logging/issues/439)) ([9cd8474](https://www.github.com/googleapis/java-logging/commit/9cd8474fdcd313f08216642254d72de9ce1a3214))
+
+### [2.1.3](https://www.github.com/googleapis/java-logging/compare/v2.1.2...v2.1.3) (2021-01-22)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.17.1 ([#390](https://www.github.com/googleapis/java-logging/issues/390)) ([3054f17](https://www.github.com/googleapis/java-logging/commit/3054f17bb23f9ac99e373d5368f5e18b9668b917))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.18.0 ([#392](https://www.github.com/googleapis/java-logging/issues/392)) ([219a7f8](https://www.github.com/googleapis/java-logging/commit/219a7f85d06327fe0bac4b7c1a36bda17bbb3382))
+
+### [2.1.2](https://www.github.com/googleapis/java-logging/compare/v2.1.1...v2.1.2) (2020-12-15)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.17.0 ([#373](https://www.github.com/googleapis/java-logging/issues/373)) ([af43940](https://www.github.com/googleapis/java-logging/commit/af439404fb7786e8bc1856ee4b03796110677c98))
+
+### [2.1.1](https://www.github.com/googleapis/java-logging/compare/v2.1.0...v2.1.1) (2020-12-14)
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.16.1 ([84c8865](https://www.github.com/googleapis/java-logging/commit/84c88659d1a47633bcd545609262f71e747aaaed))
+
+## [2.1.0](https://www.github.com/googleapis/java-logging/compare/v2.0.1...v2.1.0) (2020-12-10)
+
+
+### Features
+
+* add support for k8s_container resource type ([#207](https://www.github.com/googleapis/java-logging/issues/207)) ([233efcc](https://www.github.com/googleapis/java-logging/commit/233efcce7d08cc66088d367b7fb6c104cb2f3a46))
+* fix resourceNames ([#24](https://www.github.com/googleapis/java-logging/issues/24)) ([70242d5](https://www.github.com/googleapis/java-logging/commit/70242d525dc3164c043f86d720e9210af40c6af5))
+* Makes remaining LogBucket and LogViews methods public ([#336](https://www.github.com/googleapis/java-logging/issues/336)) ([f3472c2](https://www.github.com/googleapis/java-logging/commit/f3472c27c79740cb62f83eaff66bb48f3e4ac723))
+
+
+### Dependencies
+
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.16.0 ([#350](https://www.github.com/googleapis/java-logging/issues/350)) ([ea92588](https://www.github.com/googleapis/java-logging/commit/ea9258838c66be244c440c76f84e5db729661791))
+
+
+### Documentation
+
+* specify current version ([#356](https://www.github.com/googleapis/java-logging/issues/356)) ([729b650](https://www.github.com/googleapis/java-logging/commit/729b650ff6a5f5022e5e5a32b0ef7b2c1642858f))
+
+### [2.0.1](https://www.github.com/googleapis/java-logging/compare/v2.0.0...v2.0.1) (2020-11-12)
+
+
+### Dependencies
+
+* update googleapis/code-suggester action to v1.8.1 ([#321](https://www.github.com/googleapis/java-logging/issues/321)) ([cc303c3](https://www.github.com/googleapis/java-logging/commit/cc303c3494cf10dc611ddd1901b2befcf54f32a4))
+
+## [2.0.0](https://www.github.com/googleapis/java-logging/compare/v1.101.2...v2.0.0) (2020-11-11)
+
+
+### âš BREAKING CHANGES
+
+* previously if the user called listLogEntries API with no parameters, the query would try to retrieve all log entries, taking up time and eventually crashing on projects with high volume logs. The new behavior complies with gcloud: if no timestamp filter was specified, it appends a filter covering last 24 hours.
+* remove Start/EndTime from LogSink, Metadata from LogEntry, implement multipattern resource names (#174)
+
+### Features
+
+* add logging bucket destination for log sinks ([#226](https://www.github.com/googleapis/java-logging/issues/226)) ([ef97aae](https://www.github.com/googleapis/java-logging/commit/ef97aae71c550c4501b231c32d6d58746af4d130))
+* expose log exclusion apis ([#162](https://www.github.com/googleapis/java-logging/issues/162)) ([0038828](https://www.github.com/googleapis/java-logging/commit/00388289e2dc379b65d790d3af1fc3520b6843e9))
+* remove Start/EndTime from LogSink, Metadata from LogEntry, implement multipattern resource names ([#174](https://www.github.com/googleapis/java-logging/issues/174)) ([d3d2370](https://www.github.com/googleapis/java-logging/commit/d3d2370a5b2ffcf012faba0a1b893a2321d58ba0))
+* update retry settings ([#201](https://www.github.com/googleapis/java-logging/issues/201)) ([6b9d382](https://www.github.com/googleapis/java-logging/commit/6b9d3824a1dde94ac6c4b05627737d8605340f1f))
+* **deps:** adopt flatten plugin and google-cloud-shared-dependencies ([#191](https://www.github.com/googleapis/java-logging/issues/191)) ([e1ece40](https://www.github.com/googleapis/java-logging/commit/e1ece4063dc1f022b043ed3209cfcae3f8323c71))
+
+
+### Bug Fixes
+
+* add default time range filter for ListLogEntries API ([#304](https://www.github.com/googleapis/java-logging/issues/304)) ([c2f40df](https://www.github.com/googleapis/java-logging/commit/c2f40df6ed815e2229e0381a993e7e94e2e651fc))
+* make TransportChannel autocloseable ([#212](https://www.github.com/googleapis/java-logging/issues/212)) ([e4853b1](https://www.github.com/googleapis/java-logging/commit/e4853b180193f8e5a5c1151917a74745b5dd4427))
+* remove usage of deprecated newInstance() method ([#203](https://www.github.com/googleapis/java-logging/issues/203)) ([039d9ba](https://www.github.com/googleapis/java-logging/commit/039d9ba17fff6f9851091166eeba1e7c8d0cd4bc))
+
+
+### Dependencies
+
+* update core dependencies ([#170](https://www.github.com/googleapis/java-logging/issues/170)) ([5ab9181](https://www.github.com/googleapis/java-logging/commit/5ab9181dd0774a631cd6997cb9d15bff1b83592f))
+* update dependency com.google.api:api-common to v1.9.2 ([#169](https://www.github.com/googleapis/java-logging/issues/169)) ([288a894](https://www.github.com/googleapis/java-logging/commit/288a894f3ec0bda774b1fbc6c81690a92c387757))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.10.0 ([#254](https://www.github.com/googleapis/java-logging/issues/254)) ([d63b4b4](https://www.github.com/googleapis/java-logging/commit/d63b4b4198235af54ed84d153be8229469690afa))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.10.2 ([#273](https://www.github.com/googleapis/java-logging/issues/273)) ([870d7d7](https://www.github.com/googleapis/java-logging/commit/870d7d72a8938472354008fc9ea11bc36b5789ad))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.13.0 ([#289](https://www.github.com/googleapis/java-logging/issues/289)) ([1488370](https://www.github.com/googleapis/java-logging/commit/148837000588892f8c92a9d9354a3c30f0b0faad))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.14.1 ([#310](https://www.github.com/googleapis/java-logging/issues/310)) ([cc4b57f](https://www.github.com/googleapis/java-logging/commit/cc4b57f2e50df23bd85045fbd4b00462eb77969a))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.15.0 ([#320](https://www.github.com/googleapis/java-logging/issues/320)) ([e97dda7](https://www.github.com/googleapis/java-logging/commit/e97dda77029ed7cde83b4499e417468adc34ef58))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.8.6 ([#200](https://www.github.com/googleapis/java-logging/issues/200)) ([a4f19e8](https://www.github.com/googleapis/java-logging/commit/a4f19e8afa78ced9de5b2d2f96231373493e4ca8))
+* update dependency com.google.cloud:google-cloud-shared-dependencies to v0.9.0 ([#224](https://www.github.com/googleapis/java-logging/issues/224)) ([506738c](https://www.github.com/googleapis/java-logging/commit/506738c61b1415edff0cec9970e2f7905b661059))
+* update dependency com.google.protobuf:protobuf-bom to v3.12.2 ([#168](https://www.github.com/googleapis/java-logging/issues/168)) ([2732f81](https://www.github.com/googleapis/java-logging/commit/2732f81d932410bc3e39d4add76bac542325a575))
+
+### [1.101.2](https://www.github.com/googleapis/java-logging/compare/v1.101.1...v1.101.2) (2020-06-10)
+
+
+### Bug Fixes
+
+* remove duplicate classes provided by proto-google-common-protos ([#177](https://www.github.com/googleapis/java-logging/issues/177)) ([08d8639](https://www.github.com/googleapis/java-logging/commit/08d86391250642cbe4bac27b3853fe7f40458cdc))
+
+
+### Dependencies
+
+* update dependency com.google.api.grpc:proto-google-common-protos to v1.18.0 ([#156](https://www.github.com/googleapis/java-logging/issues/156)) ([84a6ccd](https://www.github.com/googleapis/java-logging/commit/84a6ccde0cf01fc0d7c331300abadfcf4e004b7a))
+* update dependency com.google.guava:guava-bom to v29 ([#136](https://www.github.com/googleapis/java-logging/issues/136)) ([8c261a0](https://www.github.com/googleapis/java-logging/commit/8c261a0d3386bf3867fda7cc0eac2e6821639359))
+* update dependency com.google.http-client:google-http-client-bom to v1.35.0 ([#153](https://www.github.com/googleapis/java-logging/issues/153)) ([181447a](https://www.github.com/googleapis/java-logging/commit/181447a6b33ed34de16926da008e789ac5570043))
+* update dependency com.google.protobuf:protobuf-bom to v3.12.0 ([#165](https://www.github.com/googleapis/java-logging/issues/165)) ([62ec11d](https://www.github.com/googleapis/java-logging/commit/62ec11d0f4be627a291567d356b0912d35b00f99))
+* update dependency io.grpc:grpc-bom to v1.29.0 ([#149](https://www.github.com/googleapis/java-logging/issues/149)) ([5841918](https://www.github.com/googleapis/java-logging/commit/5841918619873f500efe000d60bd8d3c5f5ab0d8))
+* update dependency org.threeten:threetenbp to v1.4.4 ([#151](https://www.github.com/googleapis/java-logging/issues/151)) ([abeac81](https://www.github.com/googleapis/java-logging/commit/abeac81a3117eb42ec3bfa9bfa1b934a303bc90e))
+
+### [1.101.1](https://www.github.com/googleapis/java-logging/compare/v1.101.0...v1.101.1) (2020-04-07)
+
+
+### Dependencies
+
+* update core dependencies ([#115](https://www.github.com/googleapis/java-logging/issues/115)) ([cc89e00](https://www.github.com/googleapis/java-logging/commit/cc89e00a7a3d6b1339c73f4de7651da0eebdf411))
+* update core dependencies to v1.93.4 ([#131](https://www.github.com/googleapis/java-logging/issues/131)) ([77c5cf6](https://www.github.com/googleapis/java-logging/commit/77c5cf6175936c51acaa3e441baf91e629475ae2))
+* update dependency org.threeten:threetenbp to v1.4.3 ([#117](https://www.github.com/googleapis/java-logging/issues/117)) ([1a4ad46](https://www.github.com/googleapis/java-logging/commit/1a4ad461f5e2ac3252b9e287bbc9015eae00e0fa))
+
+## [1.101.0](https://www.github.com/googleapis/java-logging/compare/v1.100.0...v1.101.0) (2020-03-25)
+
+
+### Features
+
+* add CmekSettings options ([#89](https://www.github.com/googleapis/java-logging/issues/89)) ([f76206d](https://www.github.com/googleapis/java-logging/commit/f76206d6d137fec9e73ef7e93a8b77193d71166c))
+
+
+### Bug Fixes
+
+* **regen:** undeprecate resourcenames until multi-pattern resource names are available ([#108](https://www.github.com/googleapis/java-logging/issues/108)) ([4ca5895](https://www.github.com/googleapis/java-logging/commit/4ca5895f2bb83fcf1c7ecf908aae1c50d9cd89d9))
+
+
+### Dependencies
+
+* update core dependencies ([#61](https://www.github.com/googleapis/java-logging/issues/61)) ([a73322c](https://www.github.com/googleapis/java-logging/commit/a73322cb0e8f43eb253a4004189f1e4d387dcb1c))
+* update core dependencies ([#85](https://www.github.com/googleapis/java-logging/issues/85)) ([5e61aa7](https://www.github.com/googleapis/java-logging/commit/5e61aa7180934af6b63e845f2d172c6e6d08d0ee))
+* update core dependencies ([#92](https://www.github.com/googleapis/java-logging/issues/92)) ([4fe64cc](https://www.github.com/googleapis/java-logging/commit/4fe64cc5fa0c680733e42cfc6d40c9e7aaac77a6))
+* update core dependencies to v1.93.1 ([#113](https://www.github.com/googleapis/java-logging/issues/113)) ([2d68fe9](https://www.github.com/googleapis/java-logging/commit/2d68fe9a9653d08eec5427f877848cbc25c47c4b))
+* update core deps ([#109](https://www.github.com/googleapis/java-logging/issues/109)) ([75d38f1](https://www.github.com/googleapis/java-logging/commit/75d38f1d6d56605f5d446cc581a5abf96256c3f4))
+* update dependency com.google.api:api-common to v1.9.0 ([#120](https://www.github.com/googleapis/java-logging/issues/120)) ([87ebf36](https://www.github.com/googleapis/java-logging/commit/87ebf36b455478357ea1c0185584d5813244ade8))
+* update dependency com.google.http-client:google-http-client-bom to v1.34.1 ([#81](https://www.github.com/googleapis/java-logging/issues/81)) ([dacc7db](https://www.github.com/googleapis/java-logging/commit/dacc7db6775a5489f1d43467bbece7fd781e14ba))
+* update dependency com.google.http-client:google-http-client-bom to v1.34.2 ([#94](https://www.github.com/googleapis/java-logging/issues/94)) ([55f6936](https://www.github.com/googleapis/java-logging/commit/55f6936f9933d17d29ea5244d93b9460837a7c70))
+* update dependency com.google.protobuf:protobuf-bom to v3.11.3 ([#87](https://www.github.com/googleapis/java-logging/issues/87)) ([dee31b3](https://www.github.com/googleapis/java-logging/commit/dee31b386b7b930419013a17cb1ae0399d7a5bdf))
+* update dependency com.google.protobuf:protobuf-bom to v3.11.4 ([#95](https://www.github.com/googleapis/java-logging/issues/95)) ([954897e](https://www.github.com/googleapis/java-logging/commit/954897e43c746961d69550644f1dd5a2936d50e5))
+
+
+### Documentation
+
+* **regen:** update sample code to set total timeout, add API client header test ([#91](https://www.github.com/googleapis/java-logging/issues/91)) ([133a762](https://www.github.com/googleapis/java-logging/commit/133a762a93f0bd2725edc5342eada77459c78896))
+
+## [1.100.0](https://www.github.com/googleapis/java-logging/compare/v1.99.0...v1.100.0) (2020-01-23)
+
+
+### Features
+
+* add label fullStacktrace ([#40](https://www.github.com/googleapis/java-logging/issues/40)) ([43e1953](https://www.github.com/googleapis/java-logging/commit/43e19533f969d0e2a2c0c31669a4de191e8cd67e))
+
+
+### Bug Fixes
+
+* support for Cloud Run monitored resource ([#78](https://www.github.com/googleapis/java-logging/issues/78)) ([b3c1b68](https://www.github.com/googleapis/java-logging/commit/b3c1b68712060299c9df5928ec011f556b8340ad)), closes [#71](https://www.github.com/googleapis/java-logging/issues/71)
+
+
+### Dependencies
+
+* update core dependencies ([#54](https://www.github.com/googleapis/java-logging/issues/54)) ([9ae3410](https://www.github.com/googleapis/java-logging/commit/9ae341087e99edce79d30ddc7d8aa33e347f20d5))
+* update dependency com.google.http-client:google-http-client-bom to v1.34.0 ([#45](https://www.github.com/googleapis/java-logging/issues/45)) ([6bab25b](https://www.github.com/googleapis/java-logging/commit/6bab25b334405278de3bae6c9c2b3a88d872f9bd))
+* update dependency com.google.protobuf:protobuf-java to v3.11.1 ([eb0befc](https://www.github.com/googleapis/java-logging/commit/eb0befc97a838b2c003851973d53e8530b54b7a7))
+* update dependency org.threeten:threetenbp to v1.4.1 ([f560dca](https://www.github.com/googleapis/java-logging/commit/f560dca9466ce13a634da430ff2209234f22096e))
+* update libraries-bom to 3.3.0 ([#59](https://www.github.com/googleapis/java-logging/issues/59)) ([91c2a4e](https://www.github.com/googleapis/java-logging/commit/91c2a4e993ae2b60cd6c21ec271e805401724cc1))
+
+
+### Documentation
+
+* **regen:** updated javadocs from protoc update ([#41](https://www.github.com/googleapis/java-logging/issues/41)) ([63d626c](https://www.github.com/googleapis/java-logging/commit/63d626cb458aeb631fe2e87d83141bfb6e50e2d4))
+
+## [1.99.0](https://www.github.com/googleapis/java-logging/compare/1.98.0...v1.99.0) (2019-11-20)
+
+
+### Features
+
+* make repo releasable, add parent/bom ([#1](https://www.github.com/googleapis/java-logging/issues/1)) ([1249ea7](https://www.github.com/googleapis/java-logging/commit/1249ea764f2531ad7fc6958fc3df47da5bc004d9))
+
+
+### Dependencies
+
+* update dependency io.grpc:grpc-bom to v1.25.0 ([#7](https://www.github.com/googleapis/java-logging/issues/7)) ([f602d3b](https://www.github.com/googleapis/java-logging/commit/f602d3b9096e6121a3f776ac50615461af826053))
+* use google-cloud-core-bom and update to v1.91.3 ([#15](https://www.github.com/googleapis/java-logging/issues/15)) ([f2c9cb8](https://www.github.com/googleapis/java-logging/commit/f2c9cb86ffd6c604b57e8744de19d4b801f2cf00))
diff --git a/java-logging/README.md b/java-logging/README.md
new file mode 100644
index 000000000000..cf1b3059659e
--- /dev/null
+++ b/java-logging/README.md
@@ -0,0 +1,468 @@
+# Google Cloud Logging Client for Java
+
+Java idiomatic client for [Cloud Logging][product-docs].
+
+[![Maven][maven-version-image]][maven-version-link]
+![Stability][stability-image]
+
+- [Product Documentation][product-docs]
+- [Client Library Documentation][javadocs]
+
+
+## Quickstart
+
+If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file:
+
+```xml
+
+
+
+ com.google.cloud
+ libraries-bom
+ 26.55.0
+ pom
+ import
+
+
+
+
+
+
+ com.google.cloud
+ google-cloud-logging
+
+
+
+
+```
+
+If you are using Maven without the BOM, add this to your dependencies:
+
+
+```xml
+
+ com.google.cloud
+ google-cloud-logging
+ 3.21.3
+
+
+```
+
+If you are using Gradle 5.x or later, add this to your dependencies:
+
+```Groovy
+implementation platform('com.google.cloud:libraries-bom:26.73.0')
+
+implementation 'com.google.cloud:google-cloud-logging'
+```
+If you are using Gradle without BOM, add this to your dependencies:
+
+```Groovy
+implementation 'com.google.cloud:google-cloud-logging:3.23.10'
+```
+
+If you are using SBT, add this to your dependencies:
+
+```Scala
+libraryDependencies += "com.google.cloud" % "google-cloud-logging" % "3.23.10"
+```
+
+## Authentication
+
+See the [Authentication][authentication] section in the base directory's README.
+
+## Authorization
+
+The client application making API calls must be granted [authorization scopes][auth-scopes] required for the desired Cloud Logging APIs, and the authenticated principal must have the [IAM role(s)][predefined-iam-roles] required to access GCP resources using the Cloud Logging API calls.
+
+## Getting Started
+
+### Prerequisites
+
+You will need a [Google Cloud Platform Console][developer-console] project with the Cloud Logging [API enabled][enable-api].
+You will need to [enable billing][enable-billing] to use Google Cloud Logging.
+[Follow these instructions][create-project] to get your project set up. You will also need to set up the local development environment by
+[installing the Google Cloud Command Line Interface][cloud-cli] and running the following commands in command line:
+`gcloud auth login` and `gcloud config set project [YOUR PROJECT ID]`.
+
+### Installation and setup
+
+You'll need to obtain the `google-cloud-logging` library. See the [Quickstart](#quickstart) section
+to add `google-cloud-logging` as a dependency in your code.
+
+## About Cloud Logging
+
+
+[Cloud Logging][product-docs] allows you to store, search, analyze, monitor, and alert on log data and events from Google Cloud and Amazon Web Services. Using the BindPlane service, you can also collect this data from over 150 common application components, on-premises systems, and hybrid cloud systems. BindPlane is included with your Google Cloud project at no additional cost.
+
+See the [Cloud Logging client library docs][javadocs] to learn how to
+use this Cloud Logging Client Library.
+
+
+#### Creating an authorized service object
+
+To make requests to Cloud Logging, you must create a service object with valid credentials.
+You can then make API calls by calling methods on the Logging service object.
+You can obtain credentials by using [Application Default Credentials](https://developers.google.com/identity/protocols/application-default-credentials).
+Or you can use a [Service Account](https://cloud.google.com/iam/docs/service-accounts) which is a recommended way to obtain credentials.
+The credentials can be automatically inferred from your [environment](https://cloud.google.com/docs/authentication/getting-started#setting_the_environment_variable).
+Then you only need the following code to create your service object:
+
+```java
+import com.google.cloud.logging.Logging;
+import com.google.cloud.logging.LoggingOptions;
+
+LoggingOptions options = LoggingOptions.getDefaultInstance();
+try(Logging logging = options.getService()) {
+ // use logging here
+}
+```
+
+For other options, see the [Authentication](https://github.com/googleapis/google-cloud-java#authentication) page.
+The service object should be granted permissions to make API calls.
+Each API call describes the permissions under Authorized Scopes section.
+See [Logging API](https://cloud.google.com/logging/docs/reference/v2/rest) to find the required list of permissions or consult with [Access control guide](https://cloud.google.com/logging/docs/access-control) for predefined IAM roles that can be granted to the Logging service object.
+
+#### Creating a metric
+With Logging you can create logs-based metrics. Logs-based metrics allow to keep track of the number
+of log messages associated to specific events. Add the following imports at the top of your file:
+
+```java
+import com.google.cloud.logging.Metric;
+import com.google.cloud.logging.MetricInfo;
+```
+
+Then, to create the metric, use the following code:
+
+```java
+MetricInfo metricInfo = MetricInfo.newBuilder("test-metric", "severity >= ERROR")
+ .setDescription("Log entries with severity higher or equal to ERROR")
+ .build();
+logging.create(metricInfo);
+```
+
+#### Writing log entries
+For an interactive tutorial click
+
+[](https://console.cloud.google.com/?walkthrough_id=logging__logging-java)
+
+With Logging you can also write custom log entries. Add the following imports at the top of your
+file:
+
+```java
+import com.google.cloud.MonitoredResource;
+import com.google.cloud.logging.LogEntry;
+import com.google.cloud.logging.Logging;
+import com.google.cloud.logging.Payload.StringPayload;
+
+import java.util.Collections;
+```
+
+Then, to write the log entries, use the following code:
+
+```java
+LogEntry firstEntry = LogEntry.newBuilder(StringPayload.of("message"))
+ .setLogName("test-log")
+ .setResource(MonitoredResource.newBuilder("global")
+ .addLabel("project_id", options.getProjectId())
+ .build())
+ .build();
+logging.write(Collections.singleton(firstEntry));
+```
+
+The library supports writing log entries synchronously and asynchronously.
+In the synchronous mode each call to `write()` method results in a consequent call to Logging API to write a log entry.
+In the asynchronous mode the call(s) to Logging API takes place asynchronously and few calls to `write()` method may be batched together to compose a single call to Logging API.
+The default mode of writing is asynchronous.
+It can be configured in the `java.util.logging` handler [configuration file](https://cloud.google.com/logging/docs/setup/java#javautillogging_configuration):
+
+```
+com.google.cloud.logging.LoggingHandler.synchronicity=SYNC
+```
+
+or in the code after initiating an instance of `Logging` by calling:
+
+```java
+logging.setWriteSynchronicity(Synchronicity.SYNC);
+```
+
+NOTE:
+> Writing log entries asynchronously in some Google Cloud managed environments (e.g. Cloud Functions)
+> may lead to unexpected results such as absense of expected log entries or abnormal program execution.
+> To avoid these unexpected results, it is recommended to use synchronous mode.
+
+#### Controlling the batching settings
+As mentioned before, in the asynchronous mode the call(s) to Logging API takes place asynchronously and few calls to `write()`
+method may be batched together to compose a single call to Logging API. In order to control the batching settings, the `LoggingOptions`
+is enhanced with `BatchingSettings` which can be set as shown in example below:
+
+```java
+import com.google.api.gax.batching.BatchingSettings;
+import com.google.api.gax.batching.FlowControlSettings;
+import com.google.api.gax.batching.FlowController;
+
+LoggingOptions actual =
+ LoggingOptions.newBuilder()
+ .setBatchingSettings(
+ BatchingSettings.newBuilder()
+ .setIsEnabled(true)
+ .setElementCountThreshold(1000L)
+ .setRequestByteThreshold(1048576L)
+ .setDelayThreshold(Duration.ofMillis(50L))
+ .setFlowControlSettings(
+ FlowControlSettings.newBuilder()
+ .setMaxOutstandingElementCount(100000L)
+ .setMaxOutstandingRequestBytes(10485760L)
+ .setLimitExceededBehavior(
+ FlowController.LimitExceededBehavior.ThrowException)
+ .build())
+ .build())
+ .setProjectId('Your project ID')
+ .build();
+```
+
+You can find more information about batching parameters see [BatchingSettings](https://cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.batching.BatchingSettings).
+
+#### Listing log entries
+
+With Logging you can also list log entries that have been previously written. Add the following
+imports at the top of your file:
+
+```java
+import com.google.api.gax.paging.Page;
+import com.google.cloud.logging.LogEntry;
+import com.google.cloud.logging.Logging.EntryListOption;
+```
+
+Then, to list the log entries, use the following code:
+
+``` java
+Page entries = logging.listLogEntries(
+ EntryListOption.filter("logName=projects/" + options.getProjectId() + "/logs/test-log"));
+while (entries != null) {
+ for (LogEntry logEntry : entries.iterateAll()) {
+ System.out.println(logEntry);
+ }
+ entries = entries.getNextPage();
+}
+```
+#### Add a Cloud Logging handler to a logger
+
+You can also register a `LoggingHandler` to a `java.util.logging.Logger` that publishes log entries
+to Cloud Logging. Given the following logger:
+
+```java
+private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());
+```
+
+You can register a `LoggingHandler` with the code:
+
+```java
+LoggingHandler.addHandler(LOGGER, new LoggingHandler());
+```
+
+After that, logs generated using `LOGGER` will be also directed to Cloud Logging.
+
+Notice that you can also register a `LoggingHandler` via the `logging.properties` configuration
+file. Adding, for instance, the following line:
+
+```
+com.google.cloud.examples.logging.snippets.AddLoggingHandler.handlers=com.google.cloud.logging.LoggingHandler
+```
+
+#### Alternative way to ingest logs in Google Cloud managed environments
+
+If you use Java logger with the Cloud Logging Handler, you can configure the handler to output logs to `stdout` using
+the [structured logging Json format](https://cloud.google.com/logging/docs/structured-logging#special-payload-fields).
+To do this, add `com.google.cloud.logging.LoggingHandler.redirectToStdout=true` to the logger configuration file.
+You can use this configuration when running applications in Google Cloud managed environments such as AppEngine, Cloud Run,
+Cloud Function or GKE. The logger agent installed on these environments can capture STDOUT and ingest it into Cloud Logging.
+The agent can parse structured logs printed to STDOUT and capture additional log metadata beside the log payload.
+The parsed information includes severity, source location, user labels, http request and tracing information.
+
+#### Auto-population of log entrys' metadata
+
+LogEntry object metadata information such as [monitored resource](https://cloud.google.com/logging/docs/reference/v2/rest/v2/MonitoredResource),
+[Http request](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#HttpRequest) or
+[source location](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogEntrySourceLocation)
+are automatically populated with information that the library retrieves from the execution context.
+The library populates only empty (set to `null`) LogEntry fields.
+This behavior in the `Logging` instance can be opted out via `LoggingOptions`.
+Call `LoggingOptions.Builder.setAutoPopulateMetadata(false)` to configure logging options to opt-out the metadata auto-population.
+Cloud Logging handler can be configured to opt-out automatic population of the metadata using the logger configuration.
+To disable the metadata auto-population add `com.google.cloud.logging.LoggingHandler.autoPopulateMetadata=false`
+to the logger configuration file.
+
+The auto-population logic populates source location _only_ for log entries with `Severity.DEBUG` severity.
+The execution context of the Http request and tracing information is maintained by `ContextHandler` class.
+The context is managed in the scope of the thread.
+If you do not use thread pools for multi-threading the `ContextHandler` can be configured to propagate the context
+to the scope of the child threads.
+To enable this add `com.google.cloud.logging.ContextHandler.useInheritedContext=true` to the logger configuration file.
+The library provides two methods to update the context:
+
+* Manually set the context. You can use the following methods of the `Context.Builder` to set the context information.
+Use the method `setRequest()` to setup the `HttpRequest` instance or `setRequestUrl()`, `setRequestMethod()`,
+`setReferer() `, `setRemoteIp()` and `setServerIp()` to setup the fields of the `HttpRequest`.
+The trace and span Ids can be set directly using `setTraceId()` and `setSpanId()` respectively.
+Alternatively it can be parsed from the W3C tracing context header using `loadW3CTraceParentContext()` or
+from the Google Cloud tracing context header using `loadCloudTraceContext()`.
+
+ ```java
+ Context context = Context.newBuilder().setHttpRequest(request).setTrace(traceId).setSpanId(spanId).build();
+ (new ContextHandler()).setCurrentContext(context);
+ ```
+
+* Using [servlet initializer](https://github.com/googleapis/java-logging-servlet-initializer).
+If your application uses a Web server based on Jakarta servlets (e.g. Jetty or Tomcat), you can add the servlet initializer
+package to your WAR. The package implements a service provider interface (SPI) for
+[javax.servlet.ServletContainerInitializer](https://docs.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.html)
+and filters all servlet requests to automatically capture the execution context of the servlet request and store it using
+`ContextHandler` class. The stored `Context` class instances are used to populate Http request and tracing information.
+If you use Maven, to use the servlet initializer add the following dependency to your BOM:
+
+ ```xml
+
+ com.google.cloud
+ google-cloud-logging-servlet-initializer
+
+ ```
+#### Population of Trace/Span ID fields in a LogEntry
+Cloud Logging libraries use [trace fields within LogEntry](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.trace) to capture trace contexts, which enables the [correlation of logs and traces](https://cloud.google.com/logging/docs/view/correlate-logs), and distributed tracing troubleshooting.
+These tracing fields, including [trace](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.trace), [spanId](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.span_id), and [traceSampled](https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.trace_sampled), define the trace context for a `LogEntry`.
+
+Tracing information set manually takes precedence over information set by the following methods:
+
+* Auto-populate Trace/Span ID from OpenTelemetry Context
+If you are using OpenTelemetry and there is an active span in the OpenTelemetry Context, the `trace`, `span_id`, and `trace_sampled` fields in the log entry are populated from the active span. More information about OpenTelemetry can be found [here](https://opentelemetry.io/docs/languages/java/).
+
+* Use the [servlet initializer](https://github.com/googleapis/java-logging-servlet-initializer) to Populate Trace/Span ID from HTTP Headers
+If trace/span Id are not manually set or auto-populated from OpenTelemetry context, you can use the [servlet initializer](https://github.com/googleapis/java-logging-servlet-initializer) to populate trace/span Id from HTTP headers.
+This package filters all servlet requests to automatically capture the execution context of the servlet request and stores it by using ContextHandler class. Http request and trace/span Id information are populated from the stored Context class instances.
+Using this method, trace/span Id can be automatically populated from either the [W3C Traceparent](https://www.w3.org/TR/trace-context) or [X-Cloud-Trace-Context](https://cloud.google.com/trace/docs/trace-context#legacy-http-header) headers.
+
+
+
+
+## Samples
+
+Samples are in the [`samples/`](https://github.com/googleapis/google-cloud-java/tree/main/samples) directory.
+
+| Sample | Source Code | Try it |
+| --------------------------- | --------------------------------- | ------ |
+| Native Image Logging Sample | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/native-image-sample/src/main/java/com/example/logging/NativeImageLoggingSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/native-image-sample/src/main/java/com/example/logging/NativeImageLoggingSample.java) |
+| Get Sink Metadata | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/snippets/src/main/java/com/example/logging/GetSinkMetadata.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/GetSinkMetadata.java) |
+| List Log Entries | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/snippets/src/main/java/com/example/logging/ListLogEntries.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/ListLogEntries.java) |
+| List Logs | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/snippets/src/main/java/com/example/logging/ListLogs.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/ListLogs.java) |
+| Log Entry Write Http Request | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/snippets/src/main/java/com/example/logging/LogEntryWriteHttpRequest.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/LogEntryWriteHttpRequest.java) |
+| Quickstart Sample | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/snippets/src/main/java/com/example/logging/QuickstartSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/QuickstartSample.java) |
+| Tail Log Entries | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/snippets/src/main/java/com/example/logging/TailLogEntries.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/TailLogEntries.java) |
+| Write Log Entry | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/snippets/src/main/java/com/example/logging/WriteLogEntry.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/WriteLogEntry.java) |
+| Quickstart | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/snippets/src/main/java/com/example/logging/jul/Quickstart.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/jul/Quickstart.java) |
+| Example Enhancer | [source code](https://github.com/googleapis/google-cloud-java/blob/main/samples/snippets/src/main/java/com/example/logging/jul/enhancers/ExampleEnhancer.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/google-cloud-java&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/jul/enhancers/ExampleEnhancer.java) |
+
+
+
+## Troubleshooting
+
+To get help, follow the instructions in the [shared Troubleshooting document][troubleshooting].
+
+## Transport
+
+Cloud Logging uses gRPC for the transport layer.
+
+## Supported Java Versions
+
+Java 8 or above is required for using this client.
+
+Google's Java client libraries,
+[Google Cloud Client Libraries][cloudlibs]
+and
+[Google Cloud API Libraries][apilibs],
+follow the
+[Oracle Java SE support roadmap][oracle]
+(see the Oracle Java SE Product Releases section).
+
+### For new development
+
+In general, new feature development occurs with support for the lowest Java
+LTS version covered by Oracle's Premier Support (which typically lasts 5 years
+from initial General Availability). If the minimum required JVM for a given
+library is changed, it is accompanied by a [semver][semver] major release.
+
+Java 11 and (in September 2021) Java 17 are the best choices for new
+development.
+
+### Keeping production systems current
+
+Google tests its client libraries with all current LTS versions covered by
+Oracle's Extended Support (which typically lasts 8 years from initial
+General Availability).
+
+#### Legacy support
+
+Google's client libraries support legacy versions of Java runtimes with long
+term stable libraries that don't receive feature updates on a best efforts basis
+as it may not be possible to backport all patches.
+
+Google provides updates on a best efforts basis to apps that continue to use
+Java 7, though apps might need to upgrade to current versions of the library
+that supports their JVM.
+
+#### Where to find specific information
+
+The latest versions and the supported Java versions are identified on
+the individual GitHub repository `github.com/GoogleAPIs/java-SERVICENAME`
+and on [google-cloud-java][g-c-j].
+
+## Versioning
+
+
+This library follows [Semantic Versioning](http://semver.org/).
+
+
+
+## Contributing
+
+
+Contributions to this library are always welcome and highly encouraged.
+
+See [CONTRIBUTING][contributing] for more information how to get started.
+
+Please note that this project is released with a Contributor Code of Conduct. By participating in
+this project you agree to abide by its terms. See [Code of Conduct][code-of-conduct] for more
+information.
+
+
+## License
+
+Apache 2.0 - See [LICENSE][license] for more information.
+
+Java is a registered trademark of Oracle and/or its affiliates.
+
+[product-docs]: https://cloud.google.com/logging/docs
+[javadocs]: https://cloud.google.com/java/docs/reference/google-cloud-logging/latest/history
+[stability-image]: https://img.shields.io/badge/stability-stable-green
+[maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-logging.svg
+[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-logging/3.23.10
+[authentication]: https://github.com/googleapis/google-cloud-java#authentication
+[auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes
+[predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles
+[iam-policy]: https://cloud.google.com/iam/docs/overview#cloud-iam-policy
+[developer-console]: https://console.developers.google.com/
+[create-project]: https://cloud.google.com/resource-manager/docs/creating-managing-projects
+[cloud-cli]: https://cloud.google.com/cli
+[troubleshooting]: https://github.com/googleapis/google-cloud-java/blob/main/TROUBLESHOOTING.md
+[contributing]: https://github.com/googleapis/google-cloud-java/blob/main/CONTRIBUTING.md
+[code-of-conduct]: https://github.com/googleapis/google-cloud-java/blob/main/CODE_OF_CONDUCT.md#contributor-code-of-conduct
+[license]: https://github.com/googleapis/google-cloud-java/blob/main/LICENSE
+[enable-billing]: https://cloud.google.com/apis/docs/getting-started#enabling_billing
+[enable-api]: https://console.cloud.google.com/flows/enableapi?apiid=logging.googleapis.com
+[libraries-bom]: https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM
+[shell_img]: https://gstatic.com/cloudssh/images/open-btn.png
+
+[semver]: https://semver.org/
+[cloudlibs]: https://cloud.google.com/apis/docs/client-libraries-explained
+[apilibs]: https://cloud.google.com/apis/docs/client-libraries-explained#google_api_client_libraries
+[oracle]: https://www.oracle.com/java/technologies/java-se-support-roadmap.html
+[g-c-j]: http://github.com/googleapis/google-cloud-java
diff --git a/java-logging/_static/guide-me.svg b/java-logging/_static/guide-me.svg
new file mode 100644
index 000000000000..f6017fc50ad7
--- /dev/null
+++ b/java-logging/_static/guide-me.svg
@@ -0,0 +1,45 @@
+
diff --git a/java-logging/env-tests-logging b/java-logging/env-tests-logging
new file mode 160000
index 000000000000..b2f060f30170
--- /dev/null
+++ b/java-logging/env-tests-logging
@@ -0,0 +1 @@
+Subproject commit b2f060f30170d95a0fd813dc39cdaa6abca69ca9
diff --git a/java-logging/google-cloud-logging-bom/pom.xml b/java-logging/google-cloud-logging-bom/pom.xml
new file mode 100644
index 000000000000..25f4e4496957
--- /dev/null
+++ b/java-logging/google-cloud-logging-bom/pom.xml
@@ -0,0 +1,82 @@
+
+
+ 4.0.0
+ com.google.cloud
+ google-cloud-logging-bom
+ 3.23.10
+ pom
+
+ com.google.cloud
+ google-cloud-pom-parent
+ 1.77.0-SNAPSHOT
+ ../../google-cloud-pom-parent/pom.xml
+
+
+ Google Cloud logging BOM
+ https://github.com/googleapis/google-cloud-java
+
+ BOM for Google Cloud Logging
+
+
+
+ Google LLC
+
+
+
+
+ chingor13
+ Jeff Ching
+ chingor@google.com
+ Google LLC
+
+ Developer
+
+
+
+
+
+ scm:git:https://github.com/googleapis/google-cloud-java.git
+ scm:git:git@github.com:googleapis/google-cloud-java.git
+ https://github.com/googleapis/google-cloud-java
+
+
+
+
+ The Apache Software License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+
+
+ com.google.cloud
+ google-cloud-logging
+ 3.23.10
+
+
+ com.google.api.grpc
+ grpc-google-cloud-logging-v2
+ 0.112.10
+
+
+ com.google.api.grpc
+ proto-google-cloud-logging-v2
+ 0.112.10
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+
+ true
+
+
+
+
+
diff --git a/java-logging/google-cloud-logging/clirr-ignored-differences.xml b/java-logging/google-cloud-logging/clirr-ignored-differences.xml
new file mode 100644
index 000000000000..aff67cbada0b
--- /dev/null
+++ b/java-logging/google-cloud-logging/clirr-ignored-differences.xml
@@ -0,0 +1,12 @@
+
+
+
+ 3003
+ com/google/cloud/logging/Instrumentation
+
+
+ 7009
+ com/google/cloud/logging/Instrumentation
+ Instrumentation()
+
+
diff --git a/java-logging/google-cloud-logging/pom.xml b/java-logging/google-cloud-logging/pom.xml
new file mode 100644
index 000000000000..08e8816620aa
--- /dev/null
+++ b/java-logging/google-cloud-logging/pom.xml
@@ -0,0 +1,182 @@
+
+
+ 4.0.0
+ com.google.cloud
+ google-cloud-logging
+ 3.23.10
+ jar
+ Google Cloud Logging
+ https://github.com/googleapis/java-logging
+ Java idiomatic client for Cloud Logging
+
+ com.google.cloud
+ google-cloud-logging-parent
+ 3.23.10
+
+
+ google-cloud-logging
+
+
+
+ io.opentelemetry
+ opentelemetry-api
+
+
+ io.opentelemetry
+ opentelemetry-context
+
+
+ com.google.guava
+ guava
+
+
+ com.google.code.gson
+ gson
+
+
+ io.grpc
+ grpc-api
+
+
+ io.grpc
+ grpc-stub
+
+
+ io.grpc
+ grpc-protobuf
+
+
+ com.google.api
+ api-common
+
+
+ com.google.protobuf
+ protobuf-java
+
+
+ com.google.protobuf
+ protobuf-java-util
+
+
+ com.google.api.grpc
+ proto-google-common-protos
+
+
+
+ com.google.api.grpc
+ proto-google-cloud-logging-v2
+
+
+ com.google.api
+ gax
+
+
+ com.google.api
+ gax-grpc
+
+
+ org.threeten
+ threetenbp
+
+
+ com.google.cloud
+ google-cloud-core-grpc
+
+
+ com.google.auth
+ google-auth-library-oauth2-http
+
+
+ com.google.http-client
+ google-http-client
+
+
+ io.grpc
+ grpc-inprocess
+
+
+ com.google.cloud
+ google-cloud-core
+
+
+ com.google.errorprone
+ error_prone_annotations
+
+
+ com.google.auth
+ google-auth-library-credentials
+
+
+
+
+ junit
+ junit
+ test
+
+
+ org.easymock
+ easymock
+ test
+
+
+ org.objenesis
+ objenesis
+ test
+
+
+ com.google.truth
+ truth
+ test
+
+
+ com.google.cloud
+ google-cloud-core
+ test-jar
+ test
+
+
+ com.google.guava
+ guava-testlib
+ test
+
+
+
+ com.google.api.grpc
+ grpc-google-cloud-logging-v2
+ test
+
+
+
+ io.opentelemetry
+ opentelemetry-sdk
+ test
+
+
+ io.opentelemetry
+ opentelemetry-sdk-testing
+ test
+
+
+ io.opentelemetry
+ opentelemetry-sdk-trace
+ test
+
+
+
+
+ com.google.api
+ gax-grpc
+ testlib
+ test
+
+
+
+
+
+
+ org.codehaus.mojo
+ flatten-maven-plugin
+
+
+
+
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Context.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Context.java
new file mode 100644
index 000000000000..9f424369e28b
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Context.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import com.google.cloud.logging.HttpRequest.RequestMethod;
+import com.google.common.base.Ascii;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.api.trace.SpanContext;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/** Class to hold context attributes including information about {@see HttpRequest} and tracing. */
+public class Context {
+ // validate W3C trace context value on load according to the existing version format.
+ // see https://www.w3.org/TR/trace-context/#traceparent-header-field-values for details.
+ private static final Pattern W3C_TRACE_CONTEXT_FORMAT =
+ Pattern.compile(
+ "^00-(?!00000000000000000000000000000000)[0-9a-f]{32}-(?!0000000000000000)[0-9a-f]{16}-[0-9a-f]{2}$");
+ // Trace sampled flag for bit masking
+ // see https://www.w3.org/TR/trace-context/#trace-flags for details
+ private static final byte FLAG_SAMPLED = 1; // 00000001
+ private final HttpRequest request;
+ private final String traceId;
+ private final String spanId;
+ private final boolean traceSampled;
+
+ /** A builder for {@see Context} objects. */
+ public static final class Builder {
+ private HttpRequest.Builder requestBuilder = HttpRequest.newBuilder();
+ private String traceId;
+ private String spanId;
+ private boolean traceSampled;
+
+ Builder() {}
+
+ Builder(Context context) {
+ this.requestBuilder = context.request.toBuilder();
+ this.traceId = context.traceId;
+ this.spanId = context.spanId;
+ this.traceSampled = context.traceSampled;
+ }
+
+ /** Sets the HTTP request. */
+ @CanIgnoreReturnValue
+ public Builder setRequest(HttpRequest request) {
+ this.requestBuilder = request != null ? request.toBuilder() : HttpRequest.newBuilder();
+ return this;
+ }
+
+ @CanIgnoreReturnValue
+ public Builder setRequestUrl(String url) {
+ this.requestBuilder.setRequestUrl(url);
+ return this;
+ }
+
+ /** Sets the HTTP request method. */
+ @CanIgnoreReturnValue
+ public Builder setRequestMethod(RequestMethod method) {
+ this.requestBuilder.setRequestMethod(method);
+ return this;
+ }
+
+ /**
+ * Sets the referer URL of the request, as defined in HTTP/1.1 Header Field Definitions.
+ *
+ * @see HTTP/1.1 Header Field
+ * Definitions
+ */
+ @CanIgnoreReturnValue
+ public Builder setReferer(String referer) {
+ this.requestBuilder.setReferer(referer);
+ return this;
+ }
+
+ /**
+ * Sets the IP address (IPv4 or IPv6) of the client that issued the HTTP request. Examples:
+ * {@code 192.168.1.1}, {@code FE80::0202:B3FF:FE1E:8329}.
+ */
+ @CanIgnoreReturnValue
+ public Builder setRemoteIp(String remoteIp) {
+ this.requestBuilder.setRemoteIp(remoteIp);
+ return this;
+ }
+
+ /**
+ * Sets the IP address (IPv4 or IPv6) of the origin server that the request was sent to.
+ * Examples: {@code 192.168.1.1}, {@code FE80::0202:B3FF:FE1E:8329}.
+ */
+ @CanIgnoreReturnValue
+ public Builder setServerIp(String serverIp) {
+ this.requestBuilder.setServerIp(serverIp);
+ return this;
+ }
+
+ /** Sets the string as a trace id value. */
+ @CanIgnoreReturnValue
+ public Builder setTraceId(String traceId) {
+ this.traceId = traceId;
+ return this;
+ }
+
+ /** Sets the string as a span id value. */
+ @CanIgnoreReturnValue
+ public Builder setSpanId(String spanId) {
+ this.spanId = spanId;
+ return this;
+ }
+
+ /** Sets the boolean as trace sampled flag. */
+ @CanIgnoreReturnValue
+ public Builder setTraceSampled(boolean traceSampled) {
+ this.traceSampled = traceSampled;
+ return this;
+ }
+
+ /**
+ * Sets the trace id, span id and trace sampled flag values by parsing the string which
+ * represents xCloud Trace Context. The Cloud Trace Context is passed as {@code
+ * x-cloud-trace-context} header (can be in Pascal case format). The string format is
+ * TRACE_ID/SPAN_ID;o=TRACE_TRUE.
+ *
+ * @see Cloud
+ * Trace header format.
+ */
+ @CanIgnoreReturnValue
+ public Builder loadCloudTraceContext(String cloudTrace) {
+ if (cloudTrace != null) {
+ if (cloudTrace.indexOf("o=") >= 0) {
+ setTraceSampled(Iterables.get(Splitter.on("o=").split(cloudTrace), 1).equals("1"));
+ }
+ cloudTrace = Iterables.get(Splitter.on(';').split(cloudTrace), 0);
+ int split = cloudTrace.indexOf('/');
+ if (split >= 0) {
+ String traceId = cloudTrace.substring(0, split);
+ String spanId = cloudTrace.substring(split + 1);
+ if (!traceId.isEmpty()) {
+ setTraceId(traceId);
+ // do not set span Id without trace Id
+ if (!spanId.isEmpty()) {
+ setSpanId(spanId);
+ }
+ }
+ } else if (!cloudTrace.isEmpty()) {
+ setTraceId(cloudTrace);
+ }
+ }
+ return this;
+ }
+
+ /**
+ * Sets the trace id, span id and trace sampled flag values by parsing the string which
+ * represents the standard W3C trace context propagation header. The context propagation header
+ * is passed as {@code traceparent} header. The method currently supports ONLY version {@code
+ * "00"}. The string format is 00-TRACE_ID-SPAN_ID-FLAGS. field of the {@code
+ * version-format} value.
+ *
+ * @see traceparent header
+ * value format
+ * @throws IllegalArgumentException if passed argument does not follow the @W3C trace format or
+ * the format version is not supported.
+ */
+ @CanIgnoreReturnValue
+ public Builder loadW3CTraceParentContext(String traceParent) {
+ if (traceParent != null) {
+ Matcher validator = W3C_TRACE_CONTEXT_FORMAT.matcher(Ascii.toLowerCase(traceParent));
+ if (!validator.matches()) {
+ throw new IllegalArgumentException(
+ "Invalid format of the header value. The value does not match W3C Trace Context"
+ + " version \"00\"");
+ }
+ List fields = Splitter.on('-').splitToList(traceParent);
+ setTraceId(fields.get(1));
+ setSpanId(fields.get(2));
+ boolean sampled = (Integer.parseInt(fields.get(3), 16) & FLAG_SAMPLED) == FLAG_SAMPLED;
+ setTraceSampled(sampled);
+ }
+ return this;
+ }
+
+ /**
+ * Sets the trace id, span id and trace sampled flag values by parsing detected OpenTelemetry
+ * span context.
+ *
+ * @see OpenTelemetry
+ * SpanContext.
+ */
+ @CanIgnoreReturnValue
+ public Builder loadOpenTelemetryContext() {
+ io.opentelemetry.context.Context currentContext = io.opentelemetry.context.Context.current();
+ SpanContext spanContext = Span.fromContext(currentContext).getSpanContext();
+ if (spanContext != null && spanContext.isValid()) {
+ setTraceId(spanContext.getTraceId());
+ setSpanId(spanContext.getSpanId());
+ setTraceSampled(spanContext.isSampled());
+ }
+ return this;
+ }
+
+ /** Creates a {@see Context} object for this builder. */
+ public Context build() {
+ return new Context(this);
+ }
+ }
+
+ Context(Builder builder) {
+ HttpRequest request = builder.requestBuilder.build();
+ if (!HttpRequest.EMPTY.equals(request)) {
+ this.request = request;
+ } else {
+ this.request = null;
+ }
+ this.traceId = builder.traceId;
+ this.spanId = builder.spanId;
+ this.traceSampled = builder.traceSampled;
+ }
+
+ public HttpRequest getHttpRequest() {
+ return this.request;
+ }
+
+ public String getTraceId() {
+ return this.traceId;
+ }
+
+ public String getSpanId() {
+ return this.spanId;
+ }
+
+ public boolean getTraceSampled() {
+ return this.traceSampled;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(request, traceId, spanId);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("request", request)
+ .add("traceId", traceId)
+ .add("spanId", spanId)
+ .add("traceSampled", traceSampled)
+ .toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof Context)) {
+ return false;
+ }
+ Context other = (Context) obj;
+ return Objects.equals(request, other.request)
+ && Objects.equals(traceId, other.traceId)
+ && Objects.equals(spanId, other.spanId)
+ && Objects.equals(traceSampled, other.traceSampled);
+ }
+
+ /** Returns a builder for this object. */
+ public Builder toBuilder() {
+ return new Builder(this);
+ }
+
+ /** Returns a builder for {@code HttpRequest} objects. */
+ public static Builder newBuilder() {
+ return new Builder();
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/ContextHandler.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/ContextHandler.java
new file mode 100644
index 000000000000..5223b8f981d6
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/ContextHandler.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+/** Class provides a per-thread storage of the {@see Context} instances. */
+public class ContextHandler {
+
+ public enum ContextPriority {
+ NO_INPUT,
+ XCLOUD_HEADER,
+ W3C_HEADER,
+ OTEL_EXTRACTED
+ }
+
+ private static final ThreadLocal contextHolder = initContextHolder();
+ private static final ThreadLocal currentPriority =
+ ThreadLocal.withInitial(() -> ContextPriority.NO_INPUT);
+
+ /**
+ * Initializes the context holder to {@link InheritableThreadLocal} if {@link LogManager}
+ * configuration property {@code com.google.cloud.logging.ContextHandler.useInheritedContext} is
+ * set to {@code true} or to {@link ThreadLocal} otherwise.
+ *
+ * @return instance of the context holder.
+ */
+ private static ThreadLocal initContextHolder() {
+ LoggingConfig config = new LoggingConfig(ContextHandler.class.getName());
+ if (config.getUseInheritedContext()) {
+ return new InheritableThreadLocal<>();
+ } else {
+ return new ThreadLocal<>();
+ }
+ }
+
+ public Context getCurrentContext() {
+ return contextHolder.get();
+ }
+
+ public void setCurrentContext(Context context) {
+ setCurrentContext(context, ContextPriority.NO_INPUT);
+ }
+
+ public ContextPriority getCurrentContextPriority() {
+ return currentPriority.get();
+ }
+
+ /**
+ * Sets the context based on the priority. Overrides traceId, spanId and TraceSampled if the
+ * passed priority is higher. HttpRequest values will be retrieved and combined from existing
+ * context if HttpRequest in the new context is empty .
+ */
+ public void setCurrentContext(Context context, ContextPriority priority) {
+ if (priority != null && priority.compareTo(currentPriority.get()) >= 0 && context != null) {
+ Context.Builder combinedContextBuilder =
+ Context.newBuilder()
+ .setTraceId(context.getTraceId())
+ .setSpanId(context.getSpanId())
+ .setTraceSampled(context.getTraceSampled());
+ Context currentContext = getCurrentContext();
+
+ if (context.getHttpRequest() != null) {
+ combinedContextBuilder.setRequest(context.getHttpRequest());
+ }
+ // Combines HttpRequest from the existing context if HttpRequest in new context is empty.
+ else if (currentContext != null && currentContext.getHttpRequest() != null) {
+ combinedContextBuilder.setRequest(currentContext.getHttpRequest());
+ }
+
+ contextHolder.set(combinedContextBuilder.build());
+ currentPriority.set(priority);
+ }
+ }
+
+ public void removeCurrentContext() {
+ contextHolder.remove();
+ }
+
+ public void removeCurrentContextPriority() {
+ currentPriority.remove();
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Exclusion.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Exclusion.java
new file mode 100644
index 000000000000..c8aba63a1291
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Exclusion.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.cloud.logging;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.common.base.Function;
+import com.google.common.base.MoreObjects;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.logging.v2.LogExclusion;
+import com.google.protobuf.Timestamp;
+import java.util.Objects;
+
+/**
+ * Specifies a set of log entries that are not to be stored in Logging. If your GCP resource
+ * receives a large volume of logs, you can use exclusions to reduce your chargeable logs.
+ * Exclusions are processed after log sinks, so you can export log entries before they are excluded.
+ * Note that organization-level and folder-level exclusions don't apply to child resources, and that
+ * you can't exclude audit log entries.
+ */
+public class Exclusion {
+
+ static final Function FROM_PROTOBUF_FUNCTION =
+ (LogExclusion exclusionPb) -> {
+ return exclusionPb != null ? Exclusion.fromProtobuf(exclusionPb) : null;
+ };
+
+ static final Function TO_PROTOBUF_FUNCTION =
+ (Exclusion exclusion) -> {
+ return exclusion != null ? exclusion.toProtobuf() : null;
+ };
+
+ private final String name;
+ private final String description;
+ private final String filter;
+ private final boolean disabled;
+ private final Timestamp createTime;
+ private final Timestamp updateTime;
+
+ /** A builder for {@code Exclusion} objects. */
+ public static class Builder {
+
+ private String name;
+ private String description;
+ private String filter;
+ private boolean disabled;
+ private Timestamp createTime;
+ private Timestamp updateTime;
+
+ private Builder(String name, String filter) {
+ this.name = checkNotNull(name);
+ this.filter = checkNotNull(filter);
+ }
+
+ private Builder(Exclusion exclusion) {
+ this.name = exclusion.name;
+ this.description = exclusion.description;
+ this.filter = exclusion.filter;
+ this.disabled = exclusion.disabled;
+ this.createTime = exclusion.createTime;
+ this.updateTime = exclusion.updateTime;
+ }
+
+ /**
+ * [Required] A client-assigned identifier, such as "load-balancer-exclusion". Identifiers are
+ * limited to 100 characters and can include only letters, digits, underscores, hyphens, and
+ * periods. First character has to be alphanumeric.
+ */
+ @CanIgnoreReturnValue
+ public Builder setName(String name) {
+ this.name = checkNotNull(name);
+ return this;
+ }
+
+ /** [Optional] A description of this exclusion. */
+ @CanIgnoreReturnValue
+ public Builder setDescription(String description) {
+ this.description = description;
+ return this;
+ }
+
+ /**
+ * [Required] An advanced logs filter that matches the log entries to be excluded. By using the
+ * sample function, you can exclude less than 100% of the matching log entries.
+ */
+ @CanIgnoreReturnValue
+ public Builder setFilter(String filter) {
+ this.filter = checkNotNull(filter);
+ return this;
+ }
+
+ /**
+ * [Optional] If set to True, then this exclusion is disabled and it does not exclude any log
+ * entries.
+ */
+ @CanIgnoreReturnValue
+ public Builder setDisabled(boolean disabled) {
+ this.disabled = disabled;
+ return this;
+ }
+
+ /** [Output only] The creation timestamp of the exclusion. */
+ @CanIgnoreReturnValue
+ public Builder setCreateTime(Timestamp createTime) {
+ this.createTime = createTime;
+ return this;
+ }
+
+ /** [Output only] The last update timestamp of the exclusion. */
+ @CanIgnoreReturnValue
+ public Builder setUpdateTime(Timestamp updateTime) {
+ this.updateTime = updateTime;
+ return this;
+ }
+
+ /** Creates a {@code Exclusion} object. */
+ public Exclusion build() {
+ return new Exclusion(this);
+ }
+ }
+
+ Exclusion(Builder builder) {
+ this.name = checkNotNull(builder.name);
+ this.description = builder.description;
+ this.filter = checkNotNull(builder.filter);
+ this.disabled = builder.disabled;
+ this.createTime = builder.createTime;
+ this.updateTime = builder.updateTime;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("name", name)
+ .add("description", description)
+ .add("filter", filter)
+ .add("disabled", disabled)
+ .add("createTime", createTime)
+ .add("updateTime", updateTime)
+ .toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof Exclusion)) {
+ return false;
+ }
+ Exclusion exclusion = (Exclusion) o;
+ return disabled == exclusion.disabled
+ && Objects.equals(name, exclusion.name)
+ && Objects.equals(description, exclusion.description)
+ && Objects.equals(filter, exclusion.filter)
+ && Objects.equals(createTime, exclusion.createTime)
+ && Objects.equals(updateTime, exclusion.updateTime);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, description, filter, disabled, createTime, updateTime);
+ }
+
+ /** Returns the name of log exclusion. */
+ public String getName() {
+ return name;
+ }
+
+ /** Returns an optional description of an exclusion. Used for documentation purpose. */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Returns an advanced logs filter. Example: {@code resource.type=gcs_bucket severityAdvanced Log
+ * Filters
+ */
+ public String getFilter() {
+ return filter;
+ }
+
+ /** If set to True, then this exclusion is disabled and it does not exclude any log entries. */
+ public boolean isDisabled() {
+ return disabled;
+ }
+
+ /** Returns the creation timestamp of the exclusion. */
+ public Timestamp getCreateTime() {
+ return createTime;
+ }
+
+ /** Returns the last update timestamp of the exclusion. */
+ public Timestamp getUpdateTime() {
+ return updateTime;
+ }
+
+ /** Returns a builder for this {@code Exclusion} object. */
+ public Builder toBuilder() {
+ return new Builder(this);
+ }
+
+ /**
+ * Returns a builder for {@code Exclusion} objects given the name of the exclusion and its filter.
+ */
+ public static Builder newBuilder(String name, String filter) {
+ return new Builder(name, filter);
+ }
+
+ /** Creates a {@code Exclusion} object given the name of the exclusion and its filter. */
+ public static Exclusion of(String name, String filter) {
+ return new Builder(name, filter).build();
+ }
+
+ LogExclusion toProtobuf() {
+ LogExclusion.Builder builder =
+ LogExclusion.newBuilder().setName(name).setFilter(filter).setDisabled(disabled);
+ if (description != null) {
+ builder.setDescription(description);
+ }
+ if (createTime != null) {
+ builder.setCreateTime(createTime);
+ }
+ if (updateTime != null) {
+ builder.setUpdateTime(updateTime);
+ }
+ return builder.build();
+ }
+
+ static Exclusion fromProtobuf(LogExclusion exclusionPb) {
+ Exclusion.Builder builder = newBuilder(exclusionPb.getName(), exclusionPb.getFilter());
+ builder.setDisabled(exclusionPb.getDisabled());
+ if (!exclusionPb.getDescription().isEmpty()) {
+ builder.setDescription(exclusionPb.getDescription());
+ }
+ if (exclusionPb.hasCreateTime()) {
+ builder.setCreateTime(exclusionPb.getCreateTime());
+ }
+ if (exclusionPb.hasUpdateTime()) {
+ builder.setUpdateTime(exclusionPb.getUpdateTime());
+ }
+ return builder.build();
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/HttpRequest.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/HttpRequest.java
new file mode 100644
index 000000000000..b4e7327b2748
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/HttpRequest.java
@@ -0,0 +1,586 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import static com.google.api.gax.util.TimeConversionUtils.toJavaTimeDuration;
+import static com.google.api.gax.util.TimeConversionUtils.toThreetenDuration;
+
+import com.google.api.core.ApiFunction;
+import com.google.api.core.ObsoleteApi;
+import com.google.cloud.StringEnumType;
+import com.google.cloud.StringEnumValue;
+import com.google.common.base.MoreObjects;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.io.Serializable;
+import java.time.Duration;
+import java.util.Objects;
+
+/**
+ * Objects of this class represent information about the (optional) HTTP request associated with a
+ * log entry.
+ *
+ * @see
+ * Http Request
+ */
+public final class HttpRequest implements Serializable {
+
+ private static final long serialVersionUID = -274998005454709817L;
+ public static final HttpRequest EMPTY = newBuilder().build();
+
+ private final RequestMethod requestMethod;
+ private final String requestUrl;
+ private final Long requestSize;
+ private final Integer status;
+ private final Long responseSize;
+ private final String userAgent;
+ private final String remoteIp;
+ private final String serverIp;
+ private final String referer;
+ private final boolean cacheLookup;
+ private final boolean cacheHit;
+ private final boolean cacheValidatedWithOriginServer;
+ private final Long cacheFillBytes;
+ private final java.time.Duration latency;
+
+ /** The HTTP request method. */
+ public static final class RequestMethod extends StringEnumValue {
+ private static final long serialVersionUID = 2403969065179486996L;
+
+ private RequestMethod(String constant) {
+ super(constant);
+ }
+
+ private static final ApiFunction CONSTRUCTOR =
+ new ApiFunction() {
+ @Override
+ public RequestMethod apply(String constant) {
+ return new RequestMethod(constant);
+ }
+ };
+
+ private static final StringEnumType type =
+ new StringEnumType<>(RequestMethod.class, CONSTRUCTOR);
+
+ public static final RequestMethod GET = type.createAndRegister("GET");
+ public static final RequestMethod HEAD = type.createAndRegister("HEAD");
+ public static final RequestMethod PUT = type.createAndRegister("PUT");
+ public static final RequestMethod POST = type.createAndRegister("POST");
+
+ /**
+ * Get the RequestMethod for the given String constant, and throw an exception if the constant
+ * is not recognized.
+ */
+ public static RequestMethod valueOfStrict(String constant) {
+ return type.valueOfStrict(constant);
+ }
+
+ /** Get the RequestMethod for the given String constant, and allow unrecognized values. */
+ public static RequestMethod valueOf(String constant) {
+ return type.valueOf(constant);
+ }
+
+ /** Return the known values for RequestMethod. */
+ public static RequestMethod[] values() {
+ return type.values();
+ }
+ }
+
+ /** A builder for {@code HttpRequest} objects. */
+ public static final class Builder {
+
+ private RequestMethod requestMethod;
+ private String requestUrl;
+ private Long requestSize;
+ private Integer status;
+ private Long responseSize;
+ private String userAgent;
+ private String remoteIp;
+ private String serverIp;
+ private String referer;
+ private boolean cacheLookup;
+ private boolean cacheHit;
+ private boolean cacheValidatedWithOriginServer;
+ private Long cacheFillBytes;
+ private java.time.Duration latency;
+
+ Builder() {}
+
+ Builder(HttpRequest request) {
+ this.requestMethod = request.requestMethod;
+ this.requestUrl = request.requestUrl;
+ this.requestSize = request.requestSize;
+ this.status = request.status;
+ this.responseSize = request.responseSize;
+ this.userAgent = request.userAgent;
+ this.remoteIp = request.remoteIp;
+ this.serverIp = request.serverIp;
+ this.referer = request.referer;
+ this.cacheLookup = request.cacheLookup;
+ this.cacheHit = request.cacheHit;
+ this.cacheValidatedWithOriginServer = request.cacheValidatedWithOriginServer;
+ this.cacheFillBytes = request.cacheFillBytes;
+ this.latency = request.latency;
+ }
+
+ /** Sets the HTTP request method. */
+ @CanIgnoreReturnValue
+ public Builder setRequestMethod(RequestMethod requestMethod) {
+ this.requestMethod = requestMethod;
+ return this;
+ }
+
+ /**
+ * Sets the requested URL. Request URL contains the scheme ({@code http}, {@code https}), the
+ * host name, the path and the query portion of the URL that was requested. Example: {@code
+ * http://example.com/some/info?color=red}.
+ */
+ @CanIgnoreReturnValue
+ public Builder setRequestUrl(String requestUrl) {
+ this.requestUrl = requestUrl;
+ return this;
+ }
+
+ /**
+ * Sets the size of the HTTP request message in bytes, including the request headers and the
+ * request body.
+ */
+ @CanIgnoreReturnValue
+ public Builder setRequestSize(long requestSize) {
+ this.requestSize = requestSize;
+ return this;
+ }
+
+ /** Sets the response code indicating the status of response. */
+ @CanIgnoreReturnValue
+ public Builder setStatus(int status) {
+ this.status = status;
+ return this;
+ }
+
+ /**
+ * Sets the size of the HTTP response message sent back to the client, in bytes, including the
+ * response headers and the response body.
+ */
+ @CanIgnoreReturnValue
+ public Builder setResponseSize(long responseSize) {
+ this.responseSize = responseSize;
+ return this;
+ }
+
+ /**
+ * Sets the user agent sent by the client. Example: {@code Mozilla/4.0 (compatible; MSIE 6.0;
+ * Windows 98; Q312461; .NET CLR 1.0.3705)}.
+ */
+ @CanIgnoreReturnValue
+ public Builder setUserAgent(String userAgent) {
+ this.userAgent = userAgent;
+ return this;
+ }
+
+ /**
+ * Sets the IP address (IPv4 or IPv6) of the client that issued the HTTP request. Examples:
+ * {@code 192.168.1.1}, {@code FE80::0202:B3FF:FE1E:8329}.
+ */
+ @CanIgnoreReturnValue
+ public Builder setRemoteIp(String remoteIp) {
+ this.remoteIp = remoteIp;
+ return this;
+ }
+
+ /**
+ * Sets the IP address (IPv4 or IPv6) of the origin server that the request was sent to.
+ * Examples: {@code 192.168.1.1}, {@code FE80::0202:B3FF:FE1E:8329}.
+ */
+ @CanIgnoreReturnValue
+ public Builder setServerIp(String serverIp) {
+ this.serverIp = serverIp;
+ return this;
+ }
+
+ /**
+ * Sets the referer URL of the request, as defined in HTTP/1.1 Header Field Definitions.
+ *
+ * @see HTTP/1.1 Header Field
+ * Definitions
+ */
+ @CanIgnoreReturnValue
+ public Builder setReferer(String referer) {
+ this.referer = referer;
+ return this;
+ }
+
+ /** Sets whether or not a cache lookup was attempted. If not set, {@code false} is used. */
+ @CanIgnoreReturnValue
+ public Builder setCacheLookup(boolean cacheLookup) {
+ this.cacheLookup = cacheLookup;
+ return this;
+ }
+
+ /**
+ * Sets whether or not an entity was served from cache (with or without validation). If not set,
+ * {@code false} is used.
+ */
+ @CanIgnoreReturnValue
+ public Builder setCacheHit(boolean cacheHit) {
+ this.cacheHit = cacheHit;
+ return this;
+ }
+
+ /**
+ * Sets whether or not the response was validated with the origin server before being served
+ * from cache. This field is only meaningful if {@link #setCacheHit(boolean)} is set to {@code
+ * true}. If not set, {@code false} is used.
+ */
+ @CanIgnoreReturnValue
+ public Builder setCacheValidatedWithOriginServer(boolean cacheValidatedWithOriginServer) {
+ this.cacheValidatedWithOriginServer = cacheValidatedWithOriginServer;
+ return this;
+ }
+
+ /**
+ * Sets the number of HTTP response bytes inserted into cache. Set only when a cache fill was
+ * attempted.
+ */
+ @CanIgnoreReturnValue
+ public Builder setCacheFillBytes(long cacheFillBytes) {
+ this.cacheFillBytes = cacheFillBytes;
+ return this;
+ }
+
+ /** This method is obsolete. Use {@link #setLatencyDuration(java.time.Duration)} instead. */
+ @ObsoleteApi("Use setLatencyDuration(java.time.Duration) instead")
+ public Builder setLatency(org.threeten.bp.Duration latency) {
+ return setLatencyDuration(toJavaTimeDuration(latency));
+ }
+
+ /**
+ * Sets the latency on the server, from the time the request was received until the response was
+ * sent.
+ */
+ @CanIgnoreReturnValue
+ public Builder setLatencyDuration(java.time.Duration latency) {
+ this.latency = latency;
+ return this;
+ }
+
+ /** Creates a {@code HttpRequest} object for this builder. */
+ public HttpRequest build() {
+ return new HttpRequest(this);
+ }
+ }
+
+ HttpRequest(Builder builder) {
+ this.requestMethod = builder.requestMethod;
+ this.requestUrl = builder.requestUrl;
+ this.requestSize = builder.requestSize;
+ this.status = builder.status;
+ this.responseSize = builder.responseSize;
+ this.userAgent = builder.userAgent;
+ this.remoteIp = builder.remoteIp;
+ this.serverIp = builder.serverIp;
+ this.referer = builder.referer;
+ this.cacheLookup = builder.cacheLookup;
+ this.cacheHit = builder.cacheHit;
+ this.cacheValidatedWithOriginServer = builder.cacheValidatedWithOriginServer;
+ this.cacheFillBytes = builder.cacheFillBytes;
+ this.latency = builder.latency;
+ }
+
+ /** Returns the HTTP request method. */
+ public RequestMethod getRequestMethod() {
+ return requestMethod;
+ }
+
+ /**
+ * Returns the requested URL. Request URL contains the scheme ({@code http}, {@code https}), the
+ * host name, the path and the query portion of the URL that was requested. Example: {@code
+ * http://example.com/some/info?color=red}.
+ */
+ public String getRequestUrl() {
+ return requestUrl;
+ }
+
+ /**
+ * Returns the size of the HTTP request message in bytes, including the request headers and the
+ * request body.
+ */
+ public Long getRequestSize() {
+ return requestSize;
+ }
+
+ /** Returns the response code indicating the status of response. */
+ public Integer getStatus() {
+ return status;
+ }
+
+ /**
+ * Returns the size of the HTTP response message sent back to the client, in bytes, including the
+ * response headers and the response body.
+ */
+ public Long getResponseSize() {
+ return responseSize;
+ }
+
+ /**
+ * Returns the user agent sent by the client. Example: {@code Mozilla/4.0 (compatible; MSIE 6.0;
+ * Windows 98; Q312461; .NET CLR 1.0.3705)}.
+ */
+ public String getUserAgent() {
+ return userAgent;
+ }
+
+ /**
+ * Returns the IP address (IPv4 or IPv6) of the client that issued the HTTP request. Examples:
+ * {@code 192.168.1.1}, {@code FE80::0202:B3FF:FE1E:8329}.
+ */
+ public String getRemoteIp() {
+ return remoteIp;
+ }
+
+ /**
+ * Returns the IP address (IPv4 or IPv6) of the origin server that the request was sent to.
+ * Examples: {@code 192.168.1.1}, {@code FE80::0202:B3FF:FE1E:8329}.
+ */
+ public String getServerIp() {
+ return serverIp;
+ }
+
+ /**
+ * Returns the referer URL of the request, as defined in HTTP/1.1 Header Field Definitions.
+ *
+ * @see HTTP/1.1 Header Field
+ * Definitions
+ */
+ public String getReferer() {
+ return referer;
+ }
+
+ /**
+ * Returns whether or not a cache lookup was attempted. If not set, this method returns {@code
+ * false}.
+ */
+ public boolean cacheLookup() {
+ return cacheLookup;
+ }
+
+ /**
+ * Returns whether or not an entity was served from cache (with or without validation). If not
+ * set, this method returns {@code false}.
+ */
+ public boolean cacheHit() {
+ return cacheHit;
+ }
+
+ /**
+ * Returns whether or not the response was validated with the origin server before being served
+ * from cache. If not set, this method returns {@code false}. This field is only meaningful if
+ * {@link #cacheHit()} is set to {@code true}.
+ */
+ public boolean cacheValidatedWithOriginServer() {
+ return cacheValidatedWithOriginServer;
+ }
+
+ /**
+ * Returns the number of HTTP response bytes inserted into cache. Set only when a cache fill was
+ * attempted.
+ */
+ public Long getCacheFillBytes() {
+ return cacheFillBytes;
+ }
+
+ /** This method is obsolete. Use {@link #getLatencyDuration()} instead. */
+ @ObsoleteApi("Use getLatencyDuration() instead")
+ public org.threeten.bp.Duration getLatency() {
+ return toThreetenDuration(getLatencyDuration());
+ }
+
+ /**
+ * Returns the processing latency on the server, from the time the request was received until the
+ * response was sent.
+ *
+ * @return the latency, for null if not populated.
+ */
+ public Duration getLatencyDuration() {
+ return latency;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ requestMethod,
+ requestUrl,
+ requestSize,
+ status,
+ responseSize,
+ userAgent,
+ serverIp,
+ cacheLookup,
+ cacheFillBytes,
+ remoteIp,
+ referer,
+ cacheHit,
+ cacheValidatedWithOriginServer,
+ latency);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("requestMethod", requestMethod)
+ .add("requestUrl", requestUrl)
+ .add("requestSize", requestSize)
+ .add("status", status)
+ .add("responseSize", responseSize)
+ .add("userAgent", userAgent)
+ .add("remoteIp", remoteIp)
+ .add("serverIp", serverIp)
+ .add("referer", referer)
+ .add("cacheLookup", cacheLookup)
+ .add("cacheHit", cacheHit)
+ .add("cacheValidatedWithOriginServer", cacheValidatedWithOriginServer)
+ .add("cacheFillBytes", cacheFillBytes)
+ .add("latency", latency)
+ .toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof HttpRequest)) {
+ return false;
+ }
+ HttpRequest other = (HttpRequest) obj;
+ return Objects.equals(requestMethod, other.requestMethod)
+ && Objects.equals(requestUrl, other.requestUrl)
+ && Objects.equals(requestSize, other.requestSize)
+ && Objects.equals(status, other.status)
+ && Objects.equals(responseSize, other.responseSize)
+ && Objects.equals(userAgent, other.userAgent)
+ && Objects.equals(remoteIp, other.remoteIp)
+ && Objects.equals(serverIp, other.serverIp)
+ && Objects.equals(referer, other.referer)
+ && Objects.equals(latency, other.latency)
+ && cacheLookup == other.cacheLookup
+ && cacheHit == other.cacheHit
+ && cacheValidatedWithOriginServer == other.cacheValidatedWithOriginServer
+ && Objects.equals(cacheFillBytes, other.cacheFillBytes);
+ }
+
+ /** Returns a builder for this object. */
+ public Builder toBuilder() {
+ return new Builder(this);
+ }
+
+ com.google.logging.type.HttpRequest toPb() {
+ com.google.logging.type.HttpRequest.Builder builder =
+ com.google.logging.type.HttpRequest.newBuilder();
+ if (requestMethod != null) {
+ builder.setRequestMethod(requestMethod.name());
+ }
+ if (requestUrl != null) {
+ builder.setRequestUrl(requestUrl);
+ }
+ if (requestSize != null) {
+ builder.setRequestSize(requestSize);
+ }
+ if (status != null) {
+ builder.setStatus(status);
+ }
+ if (responseSize != null) {
+ builder.setResponseSize(responseSize);
+ }
+ if (userAgent != null) {
+ builder.setUserAgent(userAgent);
+ }
+ if (remoteIp != null) {
+ builder.setRemoteIp(remoteIp);
+ }
+ if (serverIp != null) {
+ builder.setServerIp(serverIp);
+ }
+ if (referer != null) {
+ builder.setReferer(referer);
+ }
+ builder.setCacheLookup(cacheLookup);
+ builder.setCacheHit(cacheHit);
+ builder.setCacheValidatedWithOriginServer(cacheValidatedWithOriginServer);
+ if (cacheFillBytes != null) {
+ builder.setCacheFillBytes(cacheFillBytes);
+ }
+ if (latency != null) {
+ // NOTE(pongad): Don't convert to nano; large durations overflow longs!
+ builder.setLatency(
+ com.google.protobuf.Duration.newBuilder()
+ .setSeconds(latency.getSeconds())
+ .setNanos(latency.getNano())
+ .build());
+ }
+ return builder.build();
+ }
+
+ /** Returns a builder for {@code HttpRequest} objects. */
+ public static Builder newBuilder() {
+ return new Builder();
+ }
+
+ static HttpRequest fromPb(com.google.logging.type.HttpRequest requestPb) {
+ Builder builder = newBuilder();
+ if (!requestPb.getRequestMethod().isEmpty()) {
+ builder.setRequestMethod(RequestMethod.valueOf(requestPb.getRequestMethod()));
+ }
+ if (!requestPb.getRequestUrl().isEmpty()) {
+ builder.setRequestUrl(requestPb.getRequestUrl());
+ }
+ if (requestPb.getRequestSize() != 0L) {
+ builder.setRequestSize(requestPb.getRequestSize());
+ }
+ if (requestPb.getStatus() != 0L) {
+ builder.setStatus(requestPb.getStatus());
+ }
+ if (requestPb.getResponseSize() != 0L) {
+ builder.setResponseSize(requestPb.getResponseSize());
+ }
+ if (!requestPb.getUserAgent().isEmpty()) {
+ builder.setUserAgent(requestPb.getUserAgent());
+ }
+ if (!requestPb.getServerIp().isEmpty()) {
+ builder.setServerIp(requestPb.getServerIp());
+ }
+ if (!requestPb.getRemoteIp().isEmpty()) {
+ builder.setRemoteIp(requestPb.getRemoteIp());
+ }
+ if (!requestPb.getReferer().isEmpty()) {
+ builder.setReferer(requestPb.getReferer());
+ }
+ builder.setCacheLookup(requestPb.getCacheLookup());
+ builder.setCacheHit(requestPb.getCacheHit());
+ builder.setCacheValidatedWithOriginServer(requestPb.getCacheValidatedWithOriginServer());
+ if (requestPb.getCacheFillBytes() != 0L) {
+ builder.setCacheFillBytes(requestPb.getCacheFillBytes());
+ }
+ if (requestPb.hasLatency()) {
+ // NOTE(pongad): Don't convert to nano; large durations overflow longs!
+ builder.setLatencyDuration(
+ Duration.ofSeconds(
+ requestPb.getLatency().getSeconds(), requestPb.getLatency().getNanos()));
+ }
+ return builder.build();
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/ITimestampDefaultFilter.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/ITimestampDefaultFilter.java
new file mode 100644
index 000000000000..f2e23d4c5f21
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/ITimestampDefaultFilter.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+/**
+ * Encapsulates implementation of default time filter. This is needed for testing since we can't
+ * mock static classes with EasyMock
+ */
+public interface ITimestampDefaultFilter {
+
+ /**
+ * Creates a default filter with timestamp to query Cloud Logging
+ *
+ * @return The filter using timestamp field
+ */
+ String createDefaultTimestampFilter();
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Instrumentation.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Instrumentation.java
new file mode 100644
index 000000000000..42bf817d48a5
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Instrumentation.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import com.google.api.client.util.Strings;
+import com.google.api.gax.core.GaxProperties;
+import com.google.cloud.Tuple;
+import com.google.cloud.logging.Logging.WriteOption;
+import com.google.cloud.logging.Payload.JsonPayload;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.protobuf.ListValue;
+import com.google.protobuf.Struct;
+import com.google.protobuf.Value;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class Instrumentation {
+ public static final String DIAGNOSTIC_INFO_KEY = "logging.googleapis.com/diagnostic";
+ public static final String INSTRUMENTATION_SOURCE_KEY = "instrumentation_source";
+ public static final String INSTRUMENTATION_NAME_KEY = "name";
+ public static final String INSTRUMENTATION_VERSION_KEY = "version";
+ public static final String JAVA_LIBRARY_NAME_PREFIX = "java";
+ // Using release-please annotations to update DEFAULT_INSTRUMENTATION_VERSION with latest version.
+ // See
+ // https://github.com/googleapis/release-please/blob/main/docs/customizing.md#updating-arbitrary-files
+ // {x-version-update-start:google-cloud-logging:current}
+ public static final String DEFAULT_INSTRUMENTATION_VERSION = "3.23.10";
+ // {x-version-update-end}
+ public static final String INSTRUMENTATION_LOG_NAME = "diagnostic-log";
+ public static final int MAX_DIAGNOSTIC_VALUE_LENGTH = 14;
+ public static final int MAX_DIAGNOSTIC_ENTIES = 3;
+ private static boolean instrumentationAdded = false;
+ private static final Object instrumentationLock = new Object();
+
+ /**
+ * Populates entries with instrumentation info which is added in separate log entry
+ *
+ * @param logEntries {@code Iterable} The list of entries to be populated
+ * @return {@code Tuple>} containing a flag if instrumentation info
+ * was added or not and a modified list of log entries
+ */
+ public static Tuple> populateInstrumentationInfo(
+ Iterable logEntries) {
+ boolean isWritten = setInstrumentationStatus(true);
+ if (isWritten) {
+ return Tuple.of(false, logEntries);
+ }
+ List entries = new ArrayList<>();
+
+ for (LogEntry logEntry : logEntries) {
+ // Check if LogEntry has a proper payload and also contains a diagnostic entry
+ if (!isWritten
+ && logEntry.getPayload().getType() == Payload.Type.JSON
+ && logEntry
+ .getPayload()
+ .getData()
+ .containsFields(DIAGNOSTIC_INFO_KEY)) {
+ try {
+ ListValue infoList =
+ logEntry
+ .getPayload()
+ .getData()
+ .getFieldsOrThrow(DIAGNOSTIC_INFO_KEY)
+ .getStructValue()
+ .getFieldsOrThrow(INSTRUMENTATION_SOURCE_KEY)
+ .getListValue();
+ entries.add(createDiagnosticEntry(null, null, infoList));
+ isWritten = true;
+ } catch (RuntimeException ex) {
+ System.err.println("ERROR: unexpected exception in populateInstrumentationInfo: " + ex);
+ }
+ } else {
+ entries.add(logEntry);
+ }
+ }
+ if (!isWritten) {
+ entries.add(createDiagnosticEntry(null, null, null));
+ }
+ return Tuple.of(true, entries);
+ }
+
+ /**
+ * Adds a partialSuccess flag option to array of WriteOption
+ *
+ * @param options {WriteOption[]} The options array to be extended
+ * @return The new array of oprions containing WriteOption.OptionType.PARTIAL_SUCCESS flag set to
+ * true
+ */
+ public static WriteOption[] addPartialSuccessOption(WriteOption[] options) {
+ if (options == null) {
+ return options;
+ }
+ List writeOptions = new ArrayList<>();
+ Collections.addAll(writeOptions, options);
+ // Make sure we remove all partial success flags if any exist
+ writeOptions.removeIf(
+ option -> option.getOptionType() == WriteOption.OptionType.PARTIAL_SUCCESS);
+ writeOptions.add(WriteOption.partialSuccess(true));
+ return Iterables.toArray(writeOptions, WriteOption.class);
+ }
+
+ /**
+ * The helper method to generate a log entry with diagnostic instrumentation data.
+ *
+ * @param libraryName {string} The name of the logging library to be reported. Should be prefixed
+ * with 'java'. Will be truncated if longer than 14 characters.
+ * @param libraryVersion {string} The version of the logging library to be reported. Will be
+ * truncated if longer than 14 characters.
+ * @return {LogEntry} The entry with diagnostic instrumentation data.
+ */
+ public static LogEntry createDiagnosticEntry(String libraryName, String libraryVersion) {
+ return createDiagnosticEntry(libraryName, libraryVersion, null);
+ }
+
+ private static LogEntry createDiagnosticEntry(
+ String libraryName, String libraryVersion, ListValue existingLibraryList) {
+ Struct instrumentation =
+ Struct.newBuilder()
+ .putAllFields(
+ ImmutableMap.of(
+ INSTRUMENTATION_SOURCE_KEY,
+ Value.newBuilder()
+ .setListValue(
+ generateLibrariesList(libraryName, libraryVersion, existingLibraryList))
+ .build()))
+ .build();
+ return LogEntry.newBuilder(
+ JsonPayload.of(
+ Struct.newBuilder()
+ .putAllFields(
+ ImmutableMap.of(
+ DIAGNOSTIC_INFO_KEY,
+ Value.newBuilder().setStructValue(instrumentation).build()))
+ .build()))
+ .setLogName(INSTRUMENTATION_LOG_NAME)
+ .build();
+ }
+
+ private static ListValue generateLibrariesList(
+ String libraryName, String libraryVersion, ListValue existingLibraryList) {
+ if (Strings.isNullOrEmpty(libraryName) || !libraryName.startsWith(JAVA_LIBRARY_NAME_PREFIX)) {
+ libraryName = JAVA_LIBRARY_NAME_PREFIX;
+ }
+ if (Strings.isNullOrEmpty(libraryVersion)) {
+ libraryVersion = getLibraryVersion(Instrumentation.class);
+ }
+ Struct libraryInfo = createInfoStruct(libraryName, libraryVersion);
+ ListValue.Builder libraryList = ListValue.newBuilder();
+ // First add instrumentation data of other libraries to a list if any
+ if (existingLibraryList != null) {
+ for (Value val : existingLibraryList.getValuesList()) {
+ if (val.hasStructValue()) {
+ try {
+ String name =
+ val.getStructValue().getFieldsOrThrow(INSTRUMENTATION_NAME_KEY).getStringValue();
+ if (Strings.isNullOrEmpty(name) || !name.startsWith(JAVA_LIBRARY_NAME_PREFIX)) {
+ continue;
+ }
+ String version =
+ val.getStructValue().getFieldsOrThrow(INSTRUMENTATION_VERSION_KEY).getStringValue();
+ if (Strings.isNullOrEmpty(version)) {
+ continue;
+ }
+ libraryList.addValues(
+ Value.newBuilder().setStructValue(createInfoStruct(name, version)).build());
+ if (libraryList.getValuesCount() == MAX_DIAGNOSTIC_ENTIES) {
+ break;
+ }
+ } catch (RuntimeException ex) {
+ System.err.println("ERROR: unexpected exception in generateLibrariesList: " + ex);
+ }
+ }
+ }
+ }
+ // At last, append this library info to a list
+ libraryList.addValues(Value.newBuilder().setStructValue(libraryInfo).build());
+ return libraryList.build();
+ }
+
+ private static Struct createInfoStruct(String libraryName, String libraryVersion) {
+ return Struct.newBuilder()
+ .putAllFields(
+ ImmutableMap.of(
+ INSTRUMENTATION_NAME_KEY,
+ Value.newBuilder().setStringValue(truncateValue(libraryName)).build(),
+ INSTRUMENTATION_VERSION_KEY,
+ Value.newBuilder().setStringValue(truncateValue(libraryVersion)).build()))
+ .build();
+ }
+
+ /**
+ * The package-private helper method used to set the flag which indicates if instrumentation info
+ * already written or not.
+ *
+ * @return The value of the flag before it was set.
+ */
+ static boolean setInstrumentationStatus(boolean value) {
+ if (instrumentationAdded == value) {
+ return instrumentationAdded;
+ }
+ synchronized (instrumentationLock) {
+ boolean current = instrumentationAdded;
+ instrumentationAdded = value;
+ return current;
+ }
+ }
+
+ /**
+ * Returns a library version associated with given class
+ *
+ * @param libraryClass The class to be used to determine a library version
+ * @return The version number string for given class or DEFAULT_INSTRUMENTATION_VERSION if class
+ * library version cannot be detected
+ */
+ public static String getLibraryVersion(Class> libraryClass) {
+ String libraryVersion = GaxProperties.getLibraryVersion(libraryClass);
+ if (Strings.isNullOrEmpty(libraryVersion)) {
+ libraryVersion = DEFAULT_INSTRUMENTATION_VERSION;
+ }
+ return libraryVersion;
+ }
+
+ /**
+ * Trancates given string to MAX_DIAGNOSTIC_VALUE_LENGTH and adds "*" instead of reduced suffix
+ *
+ * @param value {String} Value to be truncated
+ * @return The truncated string
+ */
+ public static String truncateValue(String value) {
+ if (Strings.isNullOrEmpty(value) || value.length() < MAX_DIAGNOSTIC_VALUE_LENGTH) {
+ return value;
+ }
+ return value.substring(0, MAX_DIAGNOSTIC_VALUE_LENGTH) + "*";
+ }
+
+ private Instrumentation() {}
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/JavaTimeConversions.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/JavaTimeConversions.java
new file mode 100644
index 000000000000..45b942b82e1a
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/JavaTimeConversions.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.math.LongMath.checkedAdd;
+import static com.google.common.math.LongMath.checkedSubtract;
+
+import com.google.protobuf.Timestamp;
+import com.google.protobuf.util.Timestamps;
+import java.time.Instant;
+
+/**
+ * A utility class that provides conversions between:
+ *
+ *
+ *
Protobuf's {@link Timestamp} and {@link java.time.Instant}
+ *
+ *
+ * The class complements conversion methods that are currently not supported in the published
+ * protobuf-java-util. After migrating protobuf-java-util to Java 8 this class can be removed.
+ *
+ * @see protobuf-java-util
+ */
+class JavaTimeConversions {
+ static final long NANOS_PER_SECOND = 1000000000;
+
+ private JavaTimeConversions() {}
+
+ /**
+ * Converts a protobuf {@link Timestamp} to a {@link java.time.Instant}.
+ *
+ * @throws IllegalArgumentException if the given {@link Timestamp} is not valid. See {@link
+ * Timestamps#isValid}.
+ */
+ public static Instant toJavaInstant(Timestamp timestamp) {
+ checkNotNull(timestamp);
+ timestamp = normalizedTimestamp(timestamp.getSeconds(), timestamp.getNanos());
+ return Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos());
+ }
+
+ /**
+ * Converts a {@link java.time.Instant} to a protobuf {@link Timestamp}.
+ *
+ * @throws IllegalArgumentException if the given {@link java.time.Instant} cannot legally fit into
+ * a {@link Timestamp}. See {@link Timestamps#isValid}.
+ */
+ public static Timestamp toProtoTimestamp(Instant instant) {
+ checkNotNull(instant);
+ return normalizedTimestamp(instant.getEpochSecond(), instant.getNano());
+ }
+
+ /** Exposes {@link Timestamps#normalizedTimestamp} internal method. */
+ static Timestamp normalizedTimestamp(long seconds, int nanos) {
+ if (nanos <= -NANOS_PER_SECOND || nanos >= NANOS_PER_SECOND) {
+ seconds = checkedAdd(seconds, nanos / NANOS_PER_SECOND);
+ nanos = (int) (nanos % NANOS_PER_SECOND);
+ }
+ if (nanos < 0) {
+ nanos =
+ (int)
+ (nanos + NANOS_PER_SECOND); // no overflow since nanos is negative (and we're adding)
+ seconds = checkedSubtract(seconds, 1);
+ }
+ Timestamp timestamp = Timestamp.newBuilder().setSeconds(seconds).setNanos(nanos).build();
+ return Timestamps.checkValid(timestamp);
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogDestinationName.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogDestinationName.java
new file mode 100644
index 000000000000..bad5bb9af2ea
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogDestinationName.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.logging.v2.LogName;
+import java.util.Map;
+
+/**
+ * Class for specifying resource name of the log to which this log entry belongs (see 'logName'
+ * parameter in https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry)
+ */
+public final class LogDestinationName extends Option {
+ private static final long serialVersionUID = 7944256748441111191L;
+
+ public enum DestinationType implements Option.OptionType {
+ PROJECT,
+ FOLDER,
+ ORGANIZATION,
+ BILLINGACCOUNT;
+
+ @SuppressWarnings("unchecked")
+ T get(Map options) {
+ return (T) options.get(this);
+ }
+ }
+
+ private LogDestinationName(Option.OptionType option, Object value) {
+ super(option, value);
+ checkArgument(!checkNotNull(value).toString().trim().isEmpty());
+ }
+
+ /**
+ * Returns an option which sets and validates project ID resource name for log entries.
+ *
+ * @param id corresponds to PROJECT_ID token in 'logName' field described in
+ * https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
+ */
+ public static LogDestinationName project(String id) {
+ return new LogDestinationName(DestinationType.PROJECT, id);
+ }
+
+ /**
+ * Returns an option which sets and validates project ID resource name for log entries.
+ *
+ * @param id corresponds to FOLDER_ID token in 'logName' field described in
+ * https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
+ */
+ public static LogDestinationName folder(String id) {
+ return new LogDestinationName(DestinationType.FOLDER, id);
+ }
+
+ /**
+ * Returns an option which sets and validates project ID resource name for log entries.
+ *
+ * @param id corresponds to ORGANIZATION_ID token in 'logName' field described in
+ * https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
+ */
+ public static LogDestinationName organization(String id) {
+ return new LogDestinationName(DestinationType.ORGANIZATION, id);
+ }
+
+ /**
+ * Returns an option which sets and validates project ID resource name for log entries.
+ *
+ * @param id corresponds to BILLING_ACCOUNT_ID token in 'logName' field described in
+ * https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
+ */
+ public static LogDestinationName billingAccount(String id) {
+ return new LogDestinationName(DestinationType.BILLINGACCOUNT, id);
+ }
+
+ /** Creates a {@code LogEntry} object for given log ID. */
+ public LogName toLogName(String logId) {
+ if (logId == null) {
+ return null;
+ }
+
+ switch ((DestinationType) getOptionType()) {
+ case PROJECT:
+ return LogName.ofProjectLogName(getValue().toString(), logId);
+
+ case FOLDER:
+ return LogName.ofFolderLogName(getValue().toString(), logId);
+
+ case ORGANIZATION:
+ return LogName.ofOrganizationLogName(getValue().toString(), logId);
+
+ case BILLINGACCOUNT:
+ return LogName.ofBillingAccountLogName(getValue().toString(), logId);
+ }
+
+ return null;
+ }
+
+ /** Returns ID value associated with {@code LogDestinationName} object */
+ public String getDestinationId() {
+ return getValue().toString();
+ }
+
+ /** Returns destination type option value associated with {@code LogDestinationName} object */
+ public DestinationType getDestinationType() {
+ return getOptionType();
+ }
+
+ /** Creates a {@code LogDestinationName} object from given {@code LogName}. */
+ public static LogDestinationName fromLogName(LogName logName) {
+ if (logName == null) {
+ return null;
+ }
+
+ if (logName.getProject() != null) {
+ return project(logName.getProject());
+ } else if (logName.getBillingAccount() != null) {
+ return billingAccount(logName.getBillingAccount());
+ } else if (logName.getFolder() != null) {
+ return folder(logName.getFolder());
+ } else if (logName.getOrganization() != null) {
+ return organization(logName.getOrganization());
+ }
+
+ return null;
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogEntry.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogEntry.java
new file mode 100644
index 000000000000..716fb548cd1f
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogEntry.java
@@ -0,0 +1,824 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.cloud.MonitoredResource;
+import com.google.common.base.Function;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableMap;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import com.google.logging.v2.LogEntryOperation;
+import com.google.logging.v2.LogEntrySourceLocation;
+import com.google.logging.v2.LogName;
+import java.io.Serializable;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * A Cloud Logging log entry. All log entries are represented via objects of this class. Log entries
+ * can have different type of payloads: an UTF-8 string (see {@link Payload.StringPayload}), a JSON
+ * object (see {@link Payload.JsonPayload}, or a protobuf object (see {@link Payload.ProtoPayload}).
+ * Entries can also store additional information about the operation or the HTTP request that
+ * generated the log (see {@link LogEntry#getOperation()} and {@link LogEntry#getHttpRequest()},
+ * respectively).
+ *
+ * @see Log Entries and Logs
+ */
+public class LogEntry implements Serializable {
+
+ private static final long serialVersionUID = -944788159728228219L;
+ static final Function FROM_PB_FUNCTION =
+ (com.google.logging.v2.LogEntry pb) -> {
+ return fromPb(pb);
+ };
+
+ private final String logName;
+ private final MonitoredResource resource;
+ private final Instant timestamp;
+ private final Instant receiveTimestamp;
+ private final Severity severity;
+ private final String insertId;
+ private final HttpRequest httpRequest;
+ private final ImmutableMap labels;
+ private final Operation operation;
+ private final String trace;
+ private final String spanId;
+ private final boolean traceSampled;
+ private final SourceLocation sourceLocation;
+ private final Payload> payload;
+ private final LogDestinationName destination;
+
+ /** A builder for {@code LogEntry} objects. */
+ public static class Builder {
+
+ private String logName;
+ private MonitoredResource resource;
+ private Instant timestamp;
+ private Instant receiveTimestamp;
+ private Severity severity = Severity.DEFAULT;
+ private String insertId;
+ private HttpRequest httpRequest;
+ private Map labels = new HashMap<>();
+ private Operation operation;
+ private String trace;
+ private String spanId;
+ private boolean traceSampled;
+ private SourceLocation sourceLocation;
+ private Payload> payload;
+ private LogDestinationName destination;
+
+ Builder(Payload> payload) {
+ this.payload = payload;
+ }
+
+ Builder(LogEntry entry) {
+ this.logName = entry.logName;
+ this.resource = entry.resource;
+ this.timestamp = entry.timestamp;
+ this.receiveTimestamp = entry.receiveTimestamp;
+ this.severity = entry.severity;
+ this.insertId = entry.insertId;
+ this.httpRequest = entry.httpRequest;
+ this.labels = new HashMap<>(entry.labels);
+ this.operation = entry.operation;
+ this.trace = entry.trace;
+ this.spanId = entry.spanId;
+ this.traceSampled = entry.traceSampled;
+ this.sourceLocation = entry.sourceLocation;
+ this.payload = entry.payload;
+ this.destination = entry.destination;
+ }
+
+ /**
+ * Sets the name of the log to which this log entry belongs. The log name must be less than 512
+ * characters long and can only include the following characters: upper and lower case
+ * alphanumeric characters: {@code [A-Za-z0-9]}; and punctuation characters: {@code _-./}. The
+ * forward-slash ({@code /}) characters in the log name must be URL-encoded. Examples: {@code
+ * syslog}, {@code library.googleapis.com%2Fbook_log}.
+ */
+ @CanIgnoreReturnValue
+ public Builder setLogName(String logName) {
+ this.logName = logName;
+ return this;
+ }
+
+ /**
+ * Sets the monitored resource associated with this log entry. Example: a log entry that reports
+ * a database error would be associated with the monitored resource designating the particular
+ * database that reported the error.
+ */
+ @CanIgnoreReturnValue
+ public Builder setResource(MonitoredResource resource) {
+ this.resource = resource;
+ return this;
+ }
+
+ /**
+ * Sets the time at which the event described by the log entry occurred, in milliseconds. If
+ * omitted, the Logging service will use the time at which the log entry is received.
+ *
+ * @deprecated This method is no longer recommended to setup the entry timestamp.
+ *
Use {@link #setTimestamp(Instant)} instead.
+ */
+ @CanIgnoreReturnValue
+ @Deprecated
+ public Builder setTimestamp(long milliseconds) {
+ this.timestamp = Instant.ofEpochMilli(milliseconds);
+ return this;
+ }
+
+ /**
+ * Sets the time at which the event described by the log entry occurred. If omitted, the Logging
+ * service will use the time at which the log entry is received.
+ */
+ @CanIgnoreReturnValue
+ public Builder setTimestamp(Instant timestamp) {
+ this.timestamp = timestamp;
+ return this;
+ }
+
+ /**
+ * Sets the time the log entry was received by Cloud Logging, in milliseconds. If omitted, the
+ * Logging service will set the time at which the log entry is received.
+ *
+ * @deprecated This method is no longer recommended to setup the receive time timestamp.
+ *
Use {@link setReceiveTimestamp(Instant)} instead.
+ */
+ @CanIgnoreReturnValue
+ @Deprecated
+ public Builder setReceiveTimestamp(long milliseconds) {
+ this.receiveTimestamp = Instant.ofEpochMilli(milliseconds);
+ return this;
+ }
+
+ /**
+ * Sets the time the log entry was received by Cloud Logging. If omitted, the Logging service
+ * will set the time at which the log entry is received.
+ */
+ @CanIgnoreReturnValue
+ public Builder setReceiveTimestamp(Instant receiveTimestamp) {
+ this.receiveTimestamp = receiveTimestamp;
+ return this;
+ }
+
+ /** Sets the severity of the log entry. If not set, {@link Severity#DEFAULT} is used. */
+ @CanIgnoreReturnValue
+ public Builder setSeverity(Severity severity) {
+ this.severity = severity;
+ return this;
+ }
+
+ /**
+ * Sets a unique ID for the log entry. If you provide this field, the Logging service considers
+ * other log entries in the same log with the same ID as duplicates which can be removed. If
+ * omitted, the Logging service will generate a unique ID for this log entry.
+ */
+ @CanIgnoreReturnValue
+ public Builder setInsertId(String insertId) {
+ this.insertId = insertId;
+ return this;
+ }
+
+ /** Sets information about the HTTP request associated with this log entry, if applicable. */
+ @CanIgnoreReturnValue
+ public Builder setHttpRequest(HttpRequest httpRequest) {
+ this.httpRequest = httpRequest;
+ return this;
+ }
+
+ /**
+ * Sets an optional set of user-defined (key, value) data that provides additional information
+ * about the log entry.
+ */
+ @CanIgnoreReturnValue
+ public Builder setLabels(Map labels) {
+ this.labels = new HashMap<>(checkNotNull(labels));
+ return this;
+ }
+
+ /**
+ * Adds a label to the log entry's labels. Labels are user-defined (key, value) data that
+ * provides additional information about the log entry.
+ */
+ @CanIgnoreReturnValue
+ public Builder addLabel(String key, String value) {
+ this.labels.put(key, value);
+ return this;
+ }
+
+ /**
+ * Clears all the labels of the log entry. Labels are user-defined (key, value) data that
+ * provides additional information about the log entry.
+ */
+ @CanIgnoreReturnValue
+ public Builder clearLabels() {
+ this.labels.clear();
+ return this;
+ }
+
+ /** Sets information about an operation associated with the log entry, if applicable. */
+ @CanIgnoreReturnValue
+ public Builder setOperation(Operation operation) {
+ this.operation = operation;
+ return this;
+ }
+
+ /**
+ * Sets the resource name of the trace associated with the log entry, if any. If it contains a
+ * relative resource name, the name is assumed to be relative to `//tracing.googleapis.com`.
+ */
+ @CanIgnoreReturnValue
+ public Builder setTrace(String trace) {
+ this.trace = trace;
+ return this;
+ }
+
+ /**
+ * Sets the resource name of the trace associated with the log entry, if any. If it contains a
+ * relative resource name, the name is assumed to be relative to `//tracing.googleapis.com`.
+ */
+ @CanIgnoreReturnValue
+ public Builder setTrace(Object trace) {
+ this.trace = trace != null ? trace.toString() : null;
+ return this;
+ }
+
+ /** Sets the ID of the trace span associated with the log entry, if any. */
+ @CanIgnoreReturnValue
+ public Builder setSpanId(String spanId) {
+ this.spanId = spanId;
+ return this;
+ }
+
+ /** Sets the ID of the trace span associated with the log entry, if any. */
+ @CanIgnoreReturnValue
+ public Builder setSpanId(Object spanId) {
+ this.spanId = spanId != null ? spanId.toString() : null;
+ return this;
+ }
+
+ /** Sets the sampling decision of the trace span associated with the log entry. */
+ @CanIgnoreReturnValue
+ public Builder setTraceSampled(boolean traceSampled) {
+ this.traceSampled = traceSampled;
+ return this;
+ }
+
+ /** Sets the source code location information associated with the log entry if any. */
+ @CanIgnoreReturnValue
+ public Builder setSourceLocation(SourceLocation sourceLocation) {
+ this.sourceLocation = sourceLocation;
+ return this;
+ }
+
+ /**
+ * Sets the payload for this log entry. The log entry payload can be provided as an UTF-8 string
+ * (see {@link Payload.StringPayload}), a JSON object (see {@link Payload.JsonPayload}, or a
+ * protobuf object (see {@link Payload.ProtoPayload}).
+ *
+ * @see Log Entries and Logs
+ */
+ @CanIgnoreReturnValue
+ public Builder setPayload(Payload> payload) {
+ this.payload = payload;
+ return this;
+ }
+
+ /** Sets the log path destination name type associated with the log entry. */
+ @CanIgnoreReturnValue
+ public Builder setDestination(LogDestinationName destination) {
+ this.destination = destination;
+ return this;
+ }
+
+ /** Creates a {@code LogEntry} object for this builder. */
+ public LogEntry build() {
+ return new LogEntry(this);
+ }
+ }
+
+ LogEntry(Builder builder) {
+ this.logName = builder.logName;
+ this.resource = builder.resource;
+ this.timestamp = builder.timestamp;
+ this.receiveTimestamp = builder.receiveTimestamp;
+ this.severity = builder.severity;
+ this.insertId = builder.insertId;
+ this.httpRequest = builder.httpRequest;
+ this.labels = ImmutableMap.copyOf(builder.labels);
+ this.operation = builder.operation;
+ this.trace = builder.trace;
+ this.spanId = builder.spanId;
+ this.traceSampled = builder.traceSampled;
+ this.sourceLocation = builder.sourceLocation;
+ this.payload = builder.payload;
+ this.destination = builder.destination;
+ }
+
+ /**
+ * Returns the name of the log to which this log entry belongs. The log name must be less than 512
+ * characters long and can only include the following characters: upper and lower case
+ * alphanumeric characters: {@code [A-Za-z0-9]}; and punctuation characters: {@code _-./}. The
+ * forward-slash ({@code /}) characters in the log name must be URL-encoded. Examples: {@code
+ * syslog}, {@code library.googleapis.com%2Fbook_log}.
+ */
+ public String getLogName() {
+ return logName;
+ }
+
+ /**
+ * Returns the monitored resource associated with this log entry. Example: a log entry that
+ * reports a database error would be associated with the monitored resource designating the
+ * particular database that reported the error.
+ */
+ public MonitoredResource getResource() {
+ return resource;
+ }
+
+ /**
+ * Returns the time at which the event described by the log entry occurred, in milliseconds.
+ *
+ * @deprecated This method is no longer recommended to get the entry timestamp.
+ *
Use {@link getInstantTimestamp()} instead.
+ * @return timestamp in milliseconds
+ */
+ @Deprecated
+ public Long getTimestamp() {
+ return timestamp != null ? timestamp.toEpochMilli() : null;
+ }
+
+ /**
+ * Returns the time at which the event described by the log entry occurred.
+ *
+ * @return timestamp as {@link Instant}
+ */
+ public Instant getInstantTimestamp() {
+ return timestamp;
+ }
+
+ /**
+ * Returns the time the log entry was received by Cloud Logging, in milliseconds.
+ *
+ * @deprecated This method is no longer recommended to get the received time timestamp.
+ *
Use {@link getInstantReceiveTimestamp()} instead.
+ * @return timestamp in milliseconds
+ */
+ @Deprecated
+ public Long getReceiveTimestamp() {
+ return receiveTimestamp != null ? receiveTimestamp.toEpochMilli() : null;
+ }
+
+ /**
+ * Returns the time the log entry was received by Cloud Logging, in milliseconds.
+ *
+ * @return timestamp as {@link Instant}
+ */
+ public Instant getInstantReceiveTimestamp() {
+ return receiveTimestamp;
+ }
+
+ /** Returns the severity of the log entry. If not set, {@link Severity#DEFAULT} is used. */
+ public Severity getSeverity() {
+ return severity;
+ }
+
+ /**
+ * Returns a unique ID for the log entry. The Logging service considers other log entries in the
+ * same log with the same ID as duplicates which can be removed.
+ */
+ public String getInsertId() {
+ return insertId;
+ }
+
+ /** Returns information about the HTTP request associated with this log entry, if applicable. */
+ public HttpRequest getHttpRequest() {
+ return httpRequest;
+ }
+
+ /**
+ * Returns an optional set of user-defined (key, value) data that provides additional information
+ * about the log entry.
+ */
+ public Map getLabels() {
+ return labels;
+ }
+
+ /** Returns information about an operation associated with the log entry, if applicable. */
+ public Operation getOperation() {
+ return operation;
+ }
+
+ /**
+ * Returns the resource name of the trace associated with the log entry, if any. If it contains a
+ * relative resource name, the name is assumed to be relative to `//tracing.googleapis.com`.
+ */
+ public String getTrace() {
+ // For backwards compatibility return null when trace not set instead of "null".
+ return trace == null ? null : trace;
+ }
+
+ /** Returns the ID of the trace span associated with the log entry, if any. */
+ public String getSpanId() {
+ // For backwards compatibility return null when spanId not set instead of "null".
+ return spanId == null ? null : spanId;
+ }
+
+ /**
+ * Returns the sampling decision of the trace span associated with the log entry, or {@code false}
+ * if there is no trace span.
+ */
+ public boolean getTraceSampled() {
+ return traceSampled;
+ }
+
+ /** Returns the source code location information associated with the log entry, if any. */
+ public SourceLocation getSourceLocation() {
+ return sourceLocation;
+ }
+
+ /**
+ * Returns the payload for this log entry. The log entry payload can be an UTF-8 string (see
+ * {@link Payload.StringPayload}), a JSON object (see {@link Payload.JsonPayload}, or a protobuf
+ * object (see {@link Payload.ProtoPayload}).
+ *
+ * @see Log Entries and Logs
+ */
+ @SuppressWarnings("unchecked")
+ public > T getPayload() {
+ return (T) payload;
+ }
+
+ /**
+ * Returns the log path destination name type associated with log entry. By default, project name
+ * based destination is used.
+ *
+ * @see logName
+ */
+ public LogDestinationName getDestination() {
+ return destination;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ logName,
+ resource,
+ timestamp,
+ receiveTimestamp,
+ severity,
+ insertId,
+ httpRequest,
+ labels,
+ operation,
+ getTrace(),
+ getSpanId(),
+ traceSampled,
+ sourceLocation,
+ payload,
+ destination);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof LogEntry)) {
+ return false;
+ }
+ LogEntry other = (LogEntry) obj;
+ return Objects.equals(logName, other.logName)
+ && Objects.equals(resource, other.resource)
+ && Objects.equals(timestamp, other.timestamp)
+ && Objects.equals(receiveTimestamp, other.receiveTimestamp)
+ && Objects.equals(severity, other.severity)
+ && Objects.equals(insertId, other.insertId)
+ && Objects.equals(httpRequest, other.httpRequest)
+ && Objects.equals(labels, other.labels)
+ && Objects.equals(operation, other.operation)
+ && Objects.equals(getTrace(), other.getTrace())
+ && Objects.equals(getSpanId(), other.getSpanId())
+ && (traceSampled == other.traceSampled)
+ && Objects.equals(sourceLocation, other.sourceLocation)
+ && Objects.equals(payload, other.payload)
+ && Objects.equals(destination, other.destination);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("logName", logName)
+ .add("resource", resource)
+ .add("timestamp", timestamp)
+ .add("receiveTimestamp", receiveTimestamp)
+ .add("severity", severity)
+ .add("insertId", insertId)
+ .add("httpRequest", httpRequest)
+ .add("labels", labels)
+ .add("operation", operation)
+ .add("trace", trace)
+ .add("spanId", spanId)
+ .add("traceSampled", traceSampled)
+ .add("sourceLocation", sourceLocation)
+ .add("payload", payload)
+ .add("destination", destination)
+ .toString();
+ }
+
+ /** Returns a {@code Builder} for this log entry. */
+ public Builder toBuilder() {
+ return new Builder(this);
+ }
+
+ com.google.logging.v2.LogEntry toPb(String projectId) {
+ com.google.logging.v2.LogEntry.Builder builder = payload.toPb();
+ builder.putAllLabels(labels);
+
+ if (logName != null) {
+ if (destination == null) {
+ builder.setLogName(LogName.ofProjectLogName(projectId, logName).toString());
+ } else {
+ builder.setLogName(destination.toLogName(logName).toString());
+ }
+ }
+ if (resource != null) {
+ builder.setResource(resource.toPb());
+ }
+ if (timestamp != null) {
+ builder.setTimestamp(JavaTimeConversions.toProtoTimestamp(timestamp));
+ }
+ if (receiveTimestamp != null) {
+ builder.setReceiveTimestamp(JavaTimeConversions.toProtoTimestamp(receiveTimestamp));
+ }
+ if (severity != null) {
+ builder.setSeverity(severity.toPb());
+ }
+ if (insertId != null) {
+ builder.setInsertId(insertId);
+ }
+ if (httpRequest != null) {
+ builder.setHttpRequest(httpRequest.toPb());
+ }
+ if (operation != null) {
+ builder.setOperation(operation.toPb());
+ }
+ if (trace != null) {
+ builder.setTrace(getTrace());
+ }
+ if (spanId != null) {
+ builder.setSpanId(getSpanId());
+ }
+ builder.setTraceSampled(traceSampled);
+ if (sourceLocation != null) {
+ builder.setSourceLocation(sourceLocation.toPb());
+ }
+ return builder.build();
+ }
+
+ /**
+ * Customized serializers to match the expected format for timestamp, source location and request
+ * method
+ */
+ static final class InstantSerializer implements JsonSerializer {
+ @Override
+ public JsonElement serialize(
+ Instant src, java.lang.reflect.Type typeOfSrc, JsonSerializationContext context) {
+ return new JsonPrimitive(src.toString());
+ }
+ }
+
+ static final class DurationSerializer implements JsonSerializer {
+ @Override
+ public JsonElement serialize(
+ Duration src, java.lang.reflect.Type typeOfSrc, JsonSerializationContext context) {
+ return new JsonPrimitive(src.toString());
+ }
+ }
+
+ static final class SourceLocationSerializer implements JsonSerializer {
+ @Override
+ public JsonElement serialize(
+ SourceLocation src, java.lang.reflect.Type typeOfSrc, JsonSerializationContext context) {
+ JsonObject obj = new JsonObject();
+ if (src.getFile() != null) {
+ obj.addProperty("file", src.getFile());
+ }
+ if (src.getLine() != null) {
+ obj.addProperty("line", src.getLine().toString());
+ }
+ if (src.getFunction() != null) {
+ obj.addProperty("function", src.getFunction());
+ }
+ return obj;
+ }
+ }
+
+ static final class RequestMethodSerializer implements JsonSerializer {
+ @Override
+ public JsonElement serialize(
+ HttpRequest.RequestMethod src,
+ java.lang.reflect.Type typeOfSrc,
+ JsonSerializationContext context) {
+ return new JsonPrimitive(src.name());
+ }
+ }
+
+ /** Helper class to format one line Json representation of the LogEntry for structured log. */
+ static final class StructuredLogFormatter {
+ private final Gson gson;
+ private final StringBuilder builder;
+
+ public StructuredLogFormatter(StringBuilder builder) {
+ checkNotNull(builder);
+ this.gson =
+ new GsonBuilder()
+ .registerTypeAdapter(Duration.class, new DurationSerializer())
+ .registerTypeAdapter(Instant.class, new InstantSerializer())
+ .registerTypeAdapter(SourceLocation.class, new SourceLocationSerializer())
+ .registerTypeAdapter(HttpRequest.RequestMethod.class, new RequestMethodSerializer())
+ .create();
+ this.builder = builder;
+ }
+
+ /**
+ * Adds a Json field and value pair to the current string representation. Method does not
+ * validate parameters to be multi-line strings. Nothing is added if {@code value} parameter is
+ * {@code null}.
+ *
+ * @param name a valid Json field name string.
+ * @param value an object to be serialized to Json using {@link Gson}.
+ * @param appendComma a flag to add a trailing comma.
+ * @return a reference to this object.
+ */
+ @CanIgnoreReturnValue
+ public StructuredLogFormatter appendField(String name, Object value, boolean appendComma) {
+ checkNotNull(name);
+ if (value != null) {
+ builder.append(gson.toJson(name)).append(":").append(gson.toJson(value));
+ if (appendComma) {
+ builder.append(",");
+ }
+ }
+ return this;
+ }
+
+ @CanIgnoreReturnValue
+ public StructuredLogFormatter appendField(String name, Object value) {
+ return appendField(name, value, true);
+ }
+
+ /**
+ * Serializes a dictionary of key, values as Json fields.
+ *
+ * @param value a {@link Map} of key, value arguments to be serialized using {@link Gson}.
+ * @param appendComma a flag to add a trailing comma.
+ * @return a reference to this object.
+ */
+ @CanIgnoreReturnValue
+ public StructuredLogFormatter appendDict(Map value, boolean appendComma) {
+ if (value != null) {
+ String json = gson.toJson(value);
+ // append json object without brackets
+ if (json.length() > 1) {
+ builder.append(json.substring(0, json.length() - 1).substring(1));
+ if (appendComma) {
+ builder.append(",");
+ }
+ }
+ }
+ return this;
+ }
+ }
+
+ /**
+ * Serializes the object to a one line JSON string in the simplified format that can be parsed by
+ * the logging agents that run on Google Cloud resources.
+ */
+ public String toStructuredJsonString() {
+ if (payload.getType() == Payload.Type.PROTO) {
+ throw new UnsupportedOperationException("LogEntry with protobuf payload cannot be converted");
+ }
+ if (severity == Severity.NONE) {
+ throw new IllegalArgumentException("Severity.NONE cannot be used for LogEntry");
+ }
+
+ final StringBuilder builder = new StringBuilder("{");
+ final StructuredLogFormatter formatter = new StructuredLogFormatter(builder);
+
+ formatter
+ .appendField("severity", severity)
+ .appendField("time", timestamp)
+ .appendField("httpRequest", httpRequest)
+ .appendField("logging.googleapis.com/insertId", insertId)
+ .appendField("logging.googleapis.com/labels", labels)
+ .appendField("logging.googleapis.com/operation", operation)
+ .appendField("logging.googleapis.com/sourceLocation", sourceLocation)
+ .appendField("logging.googleapis.com/spanId", spanId)
+ .appendField("logging.googleapis.com/trace", trace)
+ .appendField("logging.googleapis.com/trace_sampled", traceSampled);
+ if (payload.getType() == Payload.Type.STRING) {
+ formatter.appendField("message", payload.getData(), false);
+ } else if (payload.getType() == Payload.Type.JSON) {
+ Payload.JsonPayload jsonPayload = (Payload.JsonPayload) payload;
+ formatter.appendDict(jsonPayload.getDataAsMap(), false);
+ }
+ builder.append("}");
+ return builder.toString();
+ }
+
+ /** Returns a builder for {@code LogEntry} objects given the entry payload. */
+ public static Builder newBuilder(Payload> payload) {
+ return new Builder(payload);
+ }
+
+ /** Creates a {@code LogEntry} object given the entry payload. */
+ public static LogEntry of(Payload> payload) {
+ return newBuilder(payload).build();
+ }
+
+ /**
+ * Creates a {@code LogEntry} object given the log name, the monitored resource and the entry
+ * payload.
+ */
+ public static LogEntry of(String logName, MonitoredResource resource, Payload> payload) {
+ return newBuilder(payload).setLogName(logName).setResource(resource).build();
+ }
+
+ public static LogEntry fromPb(com.google.logging.v2.LogEntry entryPb) {
+ Builder builder = newBuilder(Payload.fromPb(entryPb));
+ builder.setLabels(entryPb.getLabelsMap());
+ builder.setSeverity(Severity.fromPb(entryPb.getSeverity()));
+ if (!entryPb.getLogName().isEmpty()) {
+ LogName name = LogName.parse(entryPb.getLogName());
+ builder.setLogName(name.getLog());
+ LogDestinationName resource = LogDestinationName.fromLogName(name);
+ if (resource != null) {
+ builder.setDestination(resource);
+ }
+ }
+ if (!entryPb.getResource().equals(com.google.api.MonitoredResource.getDefaultInstance())) {
+ builder.setResource(MonitoredResource.fromPb(entryPb.getResource()));
+ }
+ if (entryPb.hasTimestamp()) {
+ builder.setTimestamp(JavaTimeConversions.toJavaInstant(entryPb.getTimestamp()));
+ }
+ if (entryPb.hasReceiveTimestamp()) {
+ builder.setReceiveTimestamp(JavaTimeConversions.toJavaInstant(entryPb.getReceiveTimestamp()));
+ }
+ if (!entryPb.getInsertId().isEmpty()) {
+ builder.setInsertId(entryPb.getInsertId());
+ }
+ if (!entryPb
+ .getHttpRequest()
+ .equals(com.google.logging.type.HttpRequest.getDefaultInstance())) {
+ builder.setHttpRequest(HttpRequest.fromPb(entryPb.getHttpRequest()));
+ }
+ if (!entryPb.getOperation().equals(LogEntryOperation.getDefaultInstance())) {
+ builder.setOperation(Operation.fromPb(entryPb.getOperation()));
+ }
+ if (!entryPb.getTrace().isEmpty()) {
+ builder.setTrace(entryPb.getTrace());
+ }
+ if (!entryPb.getSpanId().isEmpty()) {
+ builder.setSpanId(entryPb.getSpanId());
+ }
+ builder.setTraceSampled(entryPb.getTraceSampled());
+ if (!entryPb.getSourceLocation().equals(LogEntrySourceLocation.getDefaultInstance())) {
+ builder.setSourceLocation(SourceLocation.fromPb(entryPb.getSourceLocation()));
+ }
+ return builder.build();
+ }
+
+ public static Function toPbFunction(
+ final String projectId) {
+ return (LogEntry entry) -> {
+ return entry.toPb(projectId);
+ };
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogEntryIterator.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogEntryIterator.java
new file mode 100644
index 000000000000..3faaeebbb40b
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogEntryIterator.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import com.google.common.collect.Lists;
+import com.google.logging.v2.TailLogEntriesResponse;
+import java.util.ArrayDeque;
+import java.util.Iterator;
+
+/**
+ * The class implements {@see Iterator} interface over {@see LogEntry} by iterating through {@see
+ * TailLogEntriesResponse} streamed by {@code BidiStream}. This class is instantiated by {@see
+ * LogEntryServerStream} and is not intended to be used explicitly.
+ */
+public class LogEntryIterator implements Iterator {
+ // TODO: consider converting this to use generics instead of
+ // fixed TailLogEntriesResponse
+ private final Iterator streamIterator;
+ private final ArrayDeque buffer = new ArrayDeque<>();
+
+ LogEntryIterator(Iterator streamIterator) {
+ this.streamIterator = streamIterator;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public boolean hasNext() {
+ return !buffer.isEmpty() || streamIterator.hasNext();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public LogEntry next() {
+ if (buffer.isEmpty()) {
+ TailLogEntriesResponse response = streamIterator.next();
+ buffer.addAll(Lists.transform(response.getEntriesList(), LogEntry.FROM_PB_FUNCTION));
+ }
+ return buffer.pop();
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogEntryServerStream.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogEntryServerStream.java
new file mode 100644
index 000000000000..41969c7441b2
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LogEntryServerStream.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import com.google.api.gax.rpc.BidiStream;
+import com.google.common.collect.Lists;
+import com.google.logging.v2.TailLogEntriesRequest;
+import com.google.logging.v2.TailLogEntriesResponse;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * The class implements {@link Iterable} interface over {@see LogEntry}. It wraps around {@link
+ * BidiStream} bi-directional gRPC stream to support iterating through ingested responses. The class
+ * uses {@see LogEntryIterator} to iterate through the processed responses. The stream should be
+ * explicitly canceled by calling {@see LogEntryServerStream#cancel()} method. The class does not
+ * provide recovery or resuming functionality over the stream.
+ *
+ *
To iterate run:
+ *
+ *
{@code
+ * LogEntryServerStream stream;
+ * // code to initialize stream
+ * for (LogEntry log : stream) {
+ * // do something with logs
+ * }
+ * stream.cancel();
+ * }
+ *
+ *
The iteration can be blocked on waiting for another response sent in the stream.
+ */
+public class LogEntryServerStream implements Iterable {
+ private final BidiStream serverStream;
+
+ LogEntryServerStream(BidiStream serverStream) {
+ this.serverStream = serverStream;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public Iterator iterator() {
+ return new LogEntryIterator(serverStream.iterator());
+ }
+
+ public BidiStream getInternalStream() {
+ return serverStream;
+ }
+
+ public List convert(TailLogEntriesResponse resp) {
+ return Lists.transform(resp.getEntriesList(), LogEntry.FROM_PB_FUNCTION);
+ }
+
+ /**
+ * Returns true if the next call to the iterator's hasNext() or next() is guaranteed to be
+ * nonblocking.
+ *
+ * @return If the call on any of the iterator's methods is guaranteed to be nonblocking.
+ */
+ public boolean isReceiveReady() {
+ return serverStream.isReceiveReady();
+ }
+
+ /**
+ * Cleanly cancels a partially consumed stream. The associated iterator will return false for the
+ * hasNext() in the next iteration. This maintains the contract that an observed true from
+ * hasNext() will yield an item in next(), but afterwards will return false.
+ */
+ public void cancel() {
+ serverStream.cancel();
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Logging.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Logging.java
new file mode 100644
index 000000000000..3c4cc3078556
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/Logging.java
@@ -0,0 +1,1208 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import com.google.api.core.ApiFuture;
+import com.google.api.core.BetaApi;
+import com.google.api.gax.paging.AsyncPage;
+import com.google.api.gax.paging.Page;
+import com.google.cloud.MonitoredResource;
+import com.google.cloud.MonitoredResourceDescriptor;
+import com.google.cloud.Service;
+import com.google.common.base.Ascii;
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+
+public interface Logging extends AutoCloseable, Service {
+
+ /**
+ * Class for specifying options for listing sinks, monitored resources and monitored resource
+ * descriptors.
+ */
+ final class ListOption extends Option {
+
+ private static final long serialVersionUID = -6857294816115909271L;
+
+ enum OptionType implements Option.OptionType {
+ PAGE_SIZE,
+ PAGE_TOKEN;
+
+ @SuppressWarnings("unchecked")
+ T get(Map options) {
+ return (T) options.get(this);
+ }
+ }
+
+ private ListOption(ListOption.OptionType option, Object value) {
+ super(option, value);
+ }
+
+ /** Returns an option to specify the maximum number of resources returned per page. */
+ public static ListOption pageSize(int pageSize) {
+ return new ListOption(ListOption.OptionType.PAGE_SIZE, pageSize);
+ }
+
+ /** Returns an option to specify the page token from which to start listing resources. */
+ public static ListOption pageToken(String pageToken) {
+ return new ListOption(ListOption.OptionType.PAGE_TOKEN, pageToken);
+ }
+ }
+
+ /** Class for specifying options for writing log entries. */
+ final class WriteOption extends Option {
+
+ private static final long serialVersionUID = 715900132268584612L;
+
+ enum OptionType implements Option.OptionType {
+ LOG_NAME,
+ RESOURCE,
+ LABELS,
+ LOG_DESTINATION,
+ AUTO_POPULATE_METADATA,
+ PARTIAL_SUCCESS;
+
+ @SuppressWarnings("unchecked")
+ T get(Map options) {
+ return (T) options.get(this);
+ }
+ }
+
+ private WriteOption(WriteOption.OptionType option, Object value) {
+ super(option, value);
+ }
+
+ /**
+ * Returns an option to specify a default log name (see {@link LogEntry#getLogName()}) for those
+ * log entries that do not specify their own log name. Example: {@code syslog}.
+ */
+ public static WriteOption logName(String logName) {
+ return new WriteOption(WriteOption.OptionType.LOG_NAME, logName);
+ }
+
+ /**
+ * Returns an option to specify a default monitored resource (see {@link
+ * LogEntry#getResource()}) for those log entries that do not specify their own resource.
+ */
+ public static WriteOption resource(MonitoredResource resource) {
+ return new WriteOption(WriteOption.OptionType.RESOURCE, resource);
+ }
+
+ /**
+ * Sets an option to specify (key, value) pairs that are added to the {@link
+ * LogEntry#getLabels()} of each log entry written, except when a log entry already has a value
+ * associated to the same key.
+ */
+ public static WriteOption labels(Map labels) {
+ return new WriteOption(WriteOption.OptionType.LABELS, ImmutableMap.copyOf(labels));
+ }
+
+ /**
+ * Returns an option to specify a log destination resource path (see {@link LogDestinationName}
+ * for details)
+ */
+ public static WriteOption destination(LogDestinationName destination) {
+ return new WriteOption(WriteOption.OptionType.LOG_DESTINATION, destination);
+ }
+
+ /**
+ * Returns an option to opt-out automatic population of log entries metadata fields that are not
+ * set.
+ */
+ public static WriteOption autoPopulateMetadata(boolean autoPopulateMetadata) {
+ return new WriteOption(WriteOption.OptionType.AUTO_POPULATE_METADATA, autoPopulateMetadata);
+ }
+
+ /**
+ * Returns an option to set partialSuccess flag. See the
+ * API documentation for more details.
+ */
+ public static WriteOption partialSuccess(boolean partialSuccess) {
+ return new WriteOption(WriteOption.OptionType.PARTIAL_SUCCESS, partialSuccess);
+ }
+ }
+
+ /** Fields according to which log entries can be sorted. */
+ enum SortingField {
+ TIMESTAMP;
+
+ String selector() {
+ return Ascii.toLowerCase(name());
+ }
+ }
+
+ /** Sorting orders available when listing log entries. */
+ enum SortingOrder {
+ DESCENDING("desc"),
+ ASCENDING("asc");
+
+ private final String selector;
+
+ SortingOrder(String selector) {
+ this.selector = selector;
+ }
+
+ String selector() {
+ return selector;
+ }
+ }
+
+ /** Class for specifying options for listing log entries. */
+ final class EntryListOption extends Option {
+
+ private static final long serialVersionUID = -1561159676386917050L;
+
+ enum OptionType implements Option.OptionType {
+ ORDER_BY,
+ FILTER,
+ ORGANIZATION,
+ BILLINGACCOUNT,
+ FOLDER;
+
+ @SuppressWarnings("unchecked")
+ T get(Map options) {
+ return (T) options.get(this);
+ }
+ }
+
+ private EntryListOption(Option.OptionType option, Object value) {
+ super(option, value);
+ }
+
+ /** Returns an option to specify the maximum number of log entries returned per page. */
+ public static EntryListOption pageSize(int pageSize) {
+ return new EntryListOption(ListOption.OptionType.PAGE_SIZE, pageSize);
+ }
+
+ /** Returns an option to specify the page token from which to start listing log entries. */
+ public static EntryListOption pageToken(String pageToken) {
+ return new EntryListOption(ListOption.OptionType.PAGE_TOKEN, pageToken);
+ }
+
+ /**
+ * Returns an option to sort log entries. If not specified, log entries are sorted in ascending
+ * (most-recent last) order with respect to the {@link LogEntry#getTimestamp()} value.
+ */
+ public static EntryListOption sortOrder(SortingField field, SortingOrder order) {
+ return new EntryListOption(
+ EntryListOption.OptionType.ORDER_BY, field.selector() + ' ' + order.selector());
+ }
+
+ /**
+ * Returns an option to specify a filter to the log entries to be listed.
+ *
+ * @see Advanced Logs
+ * Filters
+ */
+ public static EntryListOption filter(String filter) {
+ return new EntryListOption(EntryListOption.OptionType.FILTER, filter);
+ }
+
+ /** Returns an option to specify an organization for the log entries to be listed. */
+ public static EntryListOption organization(String organization) {
+ return new EntryListOption(EntryListOption.OptionType.ORGANIZATION, organization);
+ }
+
+ /** Returns an option to specify a billingAccount for the log entries to be listed. */
+ public static EntryListOption billingAccount(String billingAccount) {
+ return new EntryListOption(EntryListOption.OptionType.BILLINGACCOUNT, billingAccount);
+ }
+
+ /** Returns an option to specify a folder for the log entries to be listed. */
+ public static EntryListOption folder(String folder) {
+ return new EntryListOption(EntryListOption.OptionType.FOLDER, folder);
+ }
+ }
+
+ /** Class for specifying options for tailing log entries. */
+ final class TailOption extends Option {
+
+ private static final long serialVersionUID = -772271612198662617L;
+
+ enum OptionType implements Option.OptionType {
+ FILTER,
+ BUFFERWINDOW,
+ PROJECT,
+ ORGANIZATION,
+ BILLINGACCOUNT,
+ FOLDER;
+
+ @SuppressWarnings("unchecked")
+ T get(Map options) {
+ return (T) options.get(this);
+ }
+ }
+
+ private TailOption(Option.OptionType option, Object value) {
+ super(option, value);
+ }
+
+ /**
+ * Returns an option to specify a filter to the log entries to be tailed.
+ *
+ * @see Advanced Logs
+ * Filters
+ */
+ public static TailOption filter(String filter) {
+ return new TailOption(TailOption.OptionType.FILTER, filter);
+ }
+
+ /**
+ * Returns an option to specify the amount of time to buffer log entries at the server before
+ * being returned to prevent out of order results due to late arriving log entries. Valid values
+ * are between 0-60000 ms. Default is 2000 ms.
+ *
+ * @see Duration
+ * format
+ */
+ public static TailOption bufferWindow(String duration) {
+ return new TailOption(TailOption.OptionType.BUFFERWINDOW, duration);
+ }
+
+ /** Returns an option to specify an organization for the log entries to be tailed. */
+ public static TailOption organization(String organization) {
+ return new TailOption(TailOption.OptionType.ORGANIZATION, organization);
+ }
+
+ /** Returns an option to specify a billingAccount for the log entries to be tailed. */
+ public static TailOption billingAccount(String billingAccount) {
+ return new TailOption(TailOption.OptionType.BILLINGACCOUNT, billingAccount);
+ }
+
+ /** Returns an option to specify a folder for the log entries to be tailed. */
+ public static TailOption folder(String folder) {
+ return new TailOption(TailOption.OptionType.FOLDER, folder);
+ }
+
+ /** Returns an option to specify a project for the log entries to be tailed. */
+ public static TailOption project(String project) {
+ return new TailOption(TailOption.OptionType.PROJECT, project);
+ }
+ }
+
+ /** Sets synchronicity {@link Synchronicity} of logging writes, defaults to asynchronous. */
+ void setWriteSynchronicity(Synchronicity synchronicity);
+
+ /** Retrieves current set synchronicity {@link Synchronicity} of logging writes. */
+ Synchronicity getWriteSynchronicity();
+
+ /**
+ * Sets flush severity for asynchronous logging writes. It is disabled by default, enabled when
+ * this method is called with any {@link Severity} value other than {@link Severity#NONE}. Logs
+ * will be immediately written out for entries at or higher than flush severity.
+ *
+ *
Enabling this can cause the leaking and hanging threads, see BUG(2796) BUG(3880). However
+ * you can explicitly call {@link #flush}.
+ *
+ *
TODO: Enable this by default once functionality to trigger rpc is available in generated
+ * code.
+ */
+ void setFlushSeverity(Severity flushSeverity);
+
+ /* Retrieves flush severity for asynchronous logging writes. */
+ Severity getFlushSeverity();
+
+ /**
+ * Creates a new sink.
+ *
+ *
Example of creating a sink to export logs to a BigQuery dataset (in the {@link
+ * LoggingOptions#getProjectId()} project).
+ *
+ *
+ *
+ * @return the created metric
+ * @throws LoggingException upon failure
+ */
+ Metric create(MetricInfo metric);
+
+ /**
+ * Creates a new exclusion in a specified parent resource. Only log entries belonging to that
+ * resource can be excluded. You can have up to 10 exclusions in a resource.
+ *
+ *
+ *
+ * @return the created exclusion
+ * @throws LoggingException upon failure
+ */
+ Exclusion create(Exclusion exclusion);
+
+ /**
+ * Sends a request for creating a sink. This method returns a {@code ApiFuture} object to consume
+ * the result. {@link ApiFuture#get()} returns the created sink.
+ *
+ *
Example of asynchronously creating a sink to export logs to a BigQuery dataset (in the
+ * {@link LoggingOptions#getProjectId()} project).
+ *
+ *
+ */
+ ApiFuture createAsync(SinkInfo sink);
+
+ /**
+ * Sends a request for creating a metric. This method returns a {@code ApiFuture} object to
+ * consume the result. {@link ApiFuture#get()} returns the created metric.
+ *
+ *
Example of asynchronously creating a metric for logs with severity higher or equal to ERROR.
+ *
+ *
+ */
+ ApiFuture createAsync(MetricInfo metric);
+
+ /**
+ * Sends a request to create the exclusion. This method returns an {@code ApiFuture} object to
+ * consume the result. {@link ApiFuture#get()} returns the created exclusion.
+ *
+ *
Example of asynchronously creating the exclusion:
+ *
+ *
+ *
+ * @return the created sink
+ * @throws LoggingException upon failure
+ */
+ Sink update(SinkInfo sink);
+
+ /**
+ * Updates a metric or creates one if it does not exist.
+ *
+ *
+ *
+ * @return the created metric
+ * @throws LoggingException upon failure
+ */
+ Metric update(MetricInfo metric);
+
+ /**
+ * Updates one or more properties of an existing exclusion.
+ *
+ *
Example of updating the exclusion:
+ *
+ *
{@code
+ * String exclusionName = "my_exclusion_name";
+ * Exclusion exclusion = Exclusion
+ * .newBuilder(exclusionName, "resource.type=gcs_bucket severity
+ *
+ * @return the updated exclusion
+ * @throws LoggingException upon failure
+ */
+ Exclusion update(Exclusion exclusion);
+
+ /**
+ * Sends a request for updating a sink (or creating it, if it does not exist). This method returns
+ * a {@code ApiFuture} object to consume the result. {@link ApiFuture#get()} returns the
+ * updated/created sink or {@code null} if not found.
+ *
+ *
Example of asynchronously updating a sink.
+ *
+ *
+ */
+ ApiFuture updateAsync(SinkInfo sink);
+
+ /**
+ * Sends a request for updating a metric (or creating it, if it does not exist). This method
+ * returns a {@code ApiFuture} object to consume the result. {@link ApiFuture#get()} returns the
+ * updated/created metric or {@code null} if not found.
+ *
+ *
Example of asynchronously updating a metric.
+ *
+ *
+ */
+ ApiFuture updateAsync(MetricInfo metric);
+
+ /**
+ * Sends a request to change one or more properties of an existing exclusion. This method returns
+ * an {@code ApiFuture} object to consume the result. {@link ApiFuture#get()} returns the updated
+ * exclusion or {@code null} if not found.
+ *
+ *
+ */
+ ApiFuture updateAsync(Exclusion exclusion);
+
+ /**
+ * Returns the requested sink or {@code null} if not found.
+ *
+ *
Example of getting a sink.
+ *
+ *
{@code
+ * String sinkName = "my_sink_name";
+ * Sink sink = logging.getSink(sinkName);
+ * if (sink == null) {
+ * // sink was not found
+ * }
+ * }
+ *
+ * @throws LoggingException upon failure
+ */
+ Sink getSink(String sink);
+
+ /**
+ * Sends a request for getting a sink. This method returns a {@code ApiFuture} object to consume
+ * the result. {@link ApiFuture#get()} returns the requested sink or {@code null} if not found.
+ *
+ *
+ *
+ * @throws LoggingException upon failure
+ */
+ ApiFuture getSinkAsync(String sink);
+
+ /**
+ * Lists the sinks. This method returns a {@link Page} object that can be used to consume
+ * paginated results. Use {@link ListOption} to specify the page size or the page token from which
+ * to start listing sinks.
+ *
+ *
Example of listing sinks, specifying the page size.
+ *
+ *
{@code
+ * Page sinks = logging.listSinks(ListOption.pageSize(100));
+ * Iterator sinkIterator = sinks.iterateAll().iterator();
+ * while (sinkIterator.hasNext()) {
+ * Sink sink = sinkIterator.next();
+ * // do something with the sink
+ * }
+ * }
+ *
+ * @throws LoggingException upon failure
+ */
+ Page listSinks(ListOption... options);
+
+ /**
+ * Sends a request for listing sinks. This method returns a {@code ApiFuture} object to consume
+ * the result. {@link ApiFuture#get()} returns an {@link AsyncPage} object that can be used to
+ * asynchronously handle paginated results. Use {@link ListOption} to specify the page size or the
+ * page token from which to start listing sinks.
+ *
+ *
Example of asynchronously listing sinks, specifying the page size.
+ *
+ *
{@code
+ * String sinkName = "my_sink_name";
+ * boolean deleted = logging.deleteSink(sinkName);
+ * if (deleted) {
+ * // the sink was deleted
+ * } else {
+ * // the sink was not found
+ * }
+ * }
+ *
+ * @return {@code true} if the sink was deleted, {@code false} if it was not found
+ */
+ boolean deleteSink(String sink);
+
+ /**
+ * Sends a request for deleting a sink. This method returns a {@code ApiFuture} object to consume
+ * the result. {@link ApiFuture#get()} returns {@code true} if the sink was deleted, {@code false}
+ * if it was not found.
+ *
+ *
Example of asynchronously deleting a sink.
+ *
+ *
{@code
+ * String sinkName = "my_sink_name";
+ * ApiFuture future = logging.deleteSinkAsync(sinkName);
+ * // ...
+ * boolean deleted = future.get();
+ * if (deleted) {
+ * // the sink was deleted
+ * } else {
+ * // the sink was not found
+ * }
+ * }
+ */
+ ApiFuture deleteSinkAsync(String sink);
+
+ /**
+ * Lists the log names. This method returns a {@link Page} object that can be used to consume
+ * paginated results. Use {@link ListOption} to specify the page size or the page token from which
+ * to start listing logs.
+ *
+ *
Example of listing log names, specifying the page size.
+ *
+ *
{@code
+ * Page logNames = logging.listLogs(ListOption.pageSize(100));
+ * Iterator logIterator = logNames.iterateAll().iterator();
+ * while (logIterator.hasNext()) {
+ * String logName = logIterator.next();
+ * // do something with the log name
+ * }
+ * }
+ *
+ * @throws LoggingException upon failure
+ */
+ default Page listLogs(ListOption... options) {
+ throw new UnsupportedOperationException(
+ "method listLogs() does not have default implementation");
+ }
+
+ /**
+ * Sends a request for listing log names. This method returns a {@code ApiFuture} object to
+ * consume the result. {@link ApiFuture#get()} returns an {@link AsyncPage} object that can be
+ * used to asynchronously handle paginated results. Use {@link ListOption} to specify the page
+ * size or the page token from which to start listing log names.
+ *
+ *
Example of asynchronously listing log names, specifying the page size.
+ *
+ *
{@code
+ * ApiFuture> future = logging.listLogsAsync(ListOption.pageSize(100));
+ * // ...
+ * AsyncPage logNames = future.get();
+ * Iterator logIterator = logNames.iterateAll().iterator();
+ * while (logIterator.hasNext()) {
+ * String logName = logIterator.next();
+ * // do something with the log name
+ * }
+ * }
+ */
+ default ApiFuture> listLogsAsync(ListOption... options) {
+ throw new UnsupportedOperationException(
+ "method listLogsAsync() does not have default implementation");
+ }
+
+ /**
+ * Deletes a log and all its log entries. The log will reappear if new entries are written to it.
+ *
+ *
Example of deleting a log.
+ *
+ *
{@code
+ * String logName = "my_log_name";
+ * boolean deleted = logging.deleteLog(logName);
+ * if (deleted) {
+ * // the log was deleted
+ * } else {
+ * // the log was not found
+ * }
+ * }
+ *
+ * @return {@code true} if the log was deleted, {@code false} if it was not found
+ */
+ boolean deleteLog(String log);
+
+ /**
+ * Deletes a log and all its log entries for given log destination (see 'logName' parameter in
+ * https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry). The log will reappear if
+ * new entries are written to it.
+ *
+ *
Example of deleting a log by folder destination.
+ *
+ *
{@code
+ * String logName = "my_log_name";
+ * String folder = "my_folder";
+ * boolean deleted = logging.deleteLog(logName, LogDestinationName.folder(folder));
+ * if (deleted) {
+ * // the log was deleted
+ * } else {
+ * // the log was not found
+ * }
+ * }
+ *
+ * @return {@code true} if the log was deleted, {@code false} if it was not found
+ */
+ default boolean deleteLog(String log, LogDestinationName destination) {
+ throw new UnsupportedOperationException(
+ "method deleteLog() does not have default implementation");
+ }
+
+ /**
+ * Sends a request for deleting a log and all its log entries for given log destination (see
+ * 'logName' parameter in https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry).
+ * This method returns a {@code ApiFuture} object to consume the result. {@link ApiFuture#get()}
+ * returns {@code true} if the log was deleted, {@code false} if it was not found.
+ *
+ *
Example of asynchronously deleting a log by folder destination.
+ *
+ *
{@code
+ * String logName = "my_log_name";
+ * String folder = "my_folder";
+ * ApiFuture future = logging.deleteLogAsync(logName, LogDestinationName.folder(folder));
+ * // ...
+ * boolean deleted = future.get();
+ * if (deleted) {
+ * // the log was deleted
+ * } else {
+ * // the log was not found
+ * }
+ * }
+ */
+ default ApiFuture deleteLogAsync(String log, LogDestinationName destination) {
+ throw new UnsupportedOperationException(
+ "method deleteLogAsync() does not have default implementation");
+ }
+
+ /**
+ * Sends a request for deleting a log and all its log entries. This method returns a {@code
+ * ApiFuture} object to consume the result. {@link ApiFuture#get()} returns {@code true} if the
+ * log was deleted, {@code false} if it was not found.
+ *
+ *
Example of asynchronously deleting a log.
+ *
+ *
{@code
+ * String logName = "my_log_name";
+ * ApiFuture future = logging.deleteLogAsync(logName);
+ * // ...
+ * boolean deleted = future.get();
+ * if (deleted) {
+ * // the log was deleted
+ * } else {
+ * // the log was not found
+ * }
+ * }
+ */
+ ApiFuture deleteLogAsync(String log);
+
+ /**
+ * Lists the monitored resource descriptors used by Cloud Logging. This method returns a {@link
+ * Page} object that can be used to consume paginated results. Use {@link ListOption} to specify
+ * the page size or the page token from which to start listing resource descriptors.
+ *
+ *
Example of listing monitored resource descriptors, specifying the page size.
+ *
+ *
+ *
+ * @throws LoggingException upon failure
+ */
+ Page listMonitoredResourceDescriptors(ListOption... options);
+
+ /**
+ * Sends a request for listing monitored resource descriptors used by Cloud Logging. This method
+ * returns a {@code ApiFuture} object to consume the result. {@link ApiFuture#get()} returns an
+ * {@link AsyncPage} object that can be used to asynchronously handle paginated results. Use
+ * {@link ListOption} to specify the page size or the page token from which to start listing
+ * resource descriptors.
+ *
+ *
Example of asynchronously listing monitored resource descriptors, specifying the page size.
+ *
+ *
+ */
+ ApiFuture> listMonitoredResourceDescriptorsAsync(
+ ListOption... options);
+
+ /**
+ * Returns the requested metric or {@code null} if not found.
+ *
+ *
Example of getting a metric.
+ *
+ *
{@code
+ * String metricName = "my_metric_name";
+ * Metric metric = logging.getMetric(metricName);
+ * if (metric == null) {
+ * // metric was not found
+ * }
+ * }
+ *
+ * @throws LoggingException upon failure
+ */
+ Metric getMetric(String metric);
+
+ /**
+ * Sends a request for getting a metric. This method returns a {@code ApiFuture} object to consume
+ * the result. {@link ApiFuture#get()} returns the requested metric or {@code null} if not found.
+ *
+ *
Example of asynchronously getting a metric.
+ *
+ *
+ *
+ * @throws LoggingException upon failure
+ */
+ ApiFuture getMetricAsync(String metric);
+
+ /**
+ * Lists the metrics. This method returns a {@link Page} object that can be used to consume
+ * paginated results. Use {@link ListOption} to specify the page size or the page token from which
+ * to start listing metrics.
+ *
+ *
Example of listing metrics, specifying the page size.
+ *
+ *
{@code
+ * Page metrics = logging.listMetrics(ListOption.pageSize(100));
+ * Iterator metricIterator = metrics.iterateAll().iterator();
+ * while (metricIterator.hasNext()) {
+ * Metric metric = metricIterator.next();
+ * // do something with the metric
+ * }
+ * }
+ *
+ * @throws LoggingException upon failure
+ */
+ Page listMetrics(ListOption... options);
+
+ /**
+ * Sends a request for listing metrics. This method returns a {@code ApiFuture} object to consume
+ * the result. {@link ApiFuture#get()} returns an {@link AsyncPage} object that can be used to
+ * asynchronously handle paginated results. Use {@link ListOption} to specify the page size or the
+ * page token from which to start listing metrics.
+ *
+ *
Example of asynchronously listing metrics, specifying the page size.
+ *
+ *
{@code
+ * String metricName = "my_metric_name";
+ * boolean deleted = logging.deleteMetric(metricName);
+ * if (deleted) {
+ * // the metric was deleted
+ * } else {
+ * // the metric was not found
+ * }
+ * }
+ *
+ * @return {@code true} if the metric was deleted, {@code false} if it was not found
+ */
+ boolean deleteMetric(String metric);
+
+ /**
+ * Sends a request for deleting a metric. This method returns a {@code ApiFuture} object to
+ * consume the result. {@link ApiFuture#get()} returns {@code true} if the metric was deleted,
+ * {@code false} if it was not found.
+ *
+ *
Example of asynchronously deleting a metric.
+ *
+ *
{@code
+ * String metricName = "my_metric_name";
+ * ApiFuture future = logging.deleteMetricAsync(metricName);
+ * // ...
+ * boolean deleted = future.get();
+ * if (deleted) {
+ * // the metric was deleted
+ * } else {
+ * // the metric was not found
+ * }
+ * }
+ */
+ ApiFuture deleteMetricAsync(String metric);
+
+ /**
+ * Gets the description of an exclusion or {@code null} if not found.
+ *
+ *
Example of getting the description of an exclusion:
+ *
+ *
{@code
+ * String exclusionName = "my_exclusion_name";
+ * Exclusion exclusion = logging.getExclusion(exclusionName);
+ * if (exclusion == null) {
+ * // exclusion was not found
+ * }
+ * }
+ *
+ * @throws LoggingException upon failure
+ */
+ Exclusion getExclusion(String exclusion);
+
+ /**
+ * Sends a request to get the description of an exclusion . This method returns an {@code
+ * ApiFuture} object to consume the result. {@link ApiFuture#get()} returns the requested
+ * exclusion or {@code null} if not found.
+ *
+ *
Example of asynchronously getting the exclusion:
+ *
+ *
{@code
+ * String exclusionName = "my_exclusion_name";
+ * boolean deleted = logging.deleteExclusion(exclusionName);
+ * if (deleted) {
+ * // the exclusion was deleted
+ * } else {
+ * // the exclusion was not found
+ * }
+ * }
+ *
+ * @return {@code true} if the exclusion was deleted, {@code false} if it was not found
+ */
+ boolean deleteExclusion(String exclusion);
+
+ /**
+ * Sends a request to delete an exclusion. This method returns an {@code ApiFuture} object to
+ * consume the result. {@link ApiFuture#get()} returns {@code true} if the exclusion was deleted,
+ * {@code false} if it was not found.
+ *
+ *
Example of asynchronously deleting the exclusion:
+ *
+ *
{@code
+ * String exclusionName = "my_exclusion_name";
+ * ApiFuture future = logging.deleteExclusionAsync(metricName);
+ * // ...
+ * boolean deleted = future.get();
+ * if (deleted) {
+ * // the exclusion was deleted
+ * } else {
+ * // the exclusion was not found
+ * }
+ * }
+ */
+ ApiFuture deleteExclusionAsync(String exclusion);
+
+ /**
+ * Lists the exclusion. This method returns a {@link Page} object that can be used to consume
+ * paginated results. Use {@link ListOption} to specify the page size or the page token from which
+ * to start listing exclusion.
+ *
+ *
Example of listing exclusions, specifying the page size:
+ *
+ *
{@code
+ * Page exclusions = logging.listMetrics(ListOption.pageSize(100));
+ * Iterator exclusionIterator = exclusions.iterateAll().iterator();
+ * while (exclusionIterator.hasNext()) {
+ * Exclusion exclusion = exclusionIterator.next();
+ * // do something with the exclusion
+ * }
+ * }
+ *
+ * @throws LoggingException upon failure
+ */
+ Page listExclusions(ListOption... options);
+
+ /**
+ * Sends a request for listing exclusions. This method returns an {@code ApiFuture} object to
+ * consume the result. {@link ApiFuture#get()} returns an {@link AsyncPage} object that can be
+ * used to asynchronously handle paginated results. Use {@link ListOption} to specify the page
+ * size or the page token from which to start listing exclusions.
+ *
+ *
Example of asynchronously listing exclusions, specifying the page size:
+ *
+ *
+ */
+ ApiFuture> listExclusionsAsync(ListOption... options);
+
+ /**
+ * Flushes any pending asynchronous logging writes. Logs are automatically flushed based on time
+ * and message count that be configured via {@link com.google.api.gax.batching.BatchingSettings},
+ * Logs are also flushed if enabled, at or above flush severity, see {@link #setFlushSeverity}.
+ * Logging frameworks require support for an explicit flush. See usage in the java.util.logging
+ * handler{@link LoggingHandler}.
+ */
+ void flush();
+
+ /**
+ * Sends a request to log entries to Cloud Logging. Use {@link WriteOption#logName(String)} to
+ * provide a log name for those entries that do not specify one. Use {@link
+ * WriteOption#resource(MonitoredResource)} to provide a monitored resource for those entries that
+ * do not specify one. Use {@link WriteOption#labels(Map)} to provide some labels to be added to
+ * every entry in {@code logEntries}.
+ *
+ *
Example of writing log entries and providing a default log name and monitored resource.
+ *
+ *
+ */
+ void write(Iterable logEntries, WriteOption... options);
+
+ /**
+ * Lists log entries. This method returns a {@link Page} object that can be used to consume
+ * paginated results. Use {@link EntryListOption#pageSize(int)} to specify the page size. Use
+ * {@link EntryListOption#pageToken(String)} to specify the page token from which to start listing
+ * entries. Use {@link EntryListOption#sortOrder(SortingField, SortingOrder)} to sort log entries
+ * according to your preferred order (default is most-recent last). Use {@link
+ * EntryListOption#filter(String)} to filter listed log entries. By default a 24 hour filter is
+ * applied.
+ *
+ *
Example of listing log entries for a specific log.
+ *
+ *
+ *
+ * @throws LoggingException upon failure
+ */
+ Page listLogEntries(EntryListOption... options);
+
+ /**
+ * Sends a request for listing log entries. This method returns a {@code ApiFuture} object to
+ * consume the result. {@link ApiFuture#get()} returns an {@link AsyncPage} object that can be
+ * used to asynchronously handle paginated results. Use {@link EntryListOption#pageSize(int)} to
+ * specify the page size. Use {@link EntryListOption#pageToken(String)} to specify the page token
+ * from which to start listing entries. Use {@link EntryListOption#sortOrder(SortingField,
+ * SortingOrder)} to sort log entries according to your preferred order (default is most-recent
+ * last). Use {@link EntryListOption#filter(String)} to filter listed log entries. By default a 24
+ * hour filter is applied.
+ *
+ *
Example of asynchronously listing log entries for a specific log.
+ *
+ *
+ *
+ * @throws LoggingException upon failure
+ */
+ ApiFuture> listLogEntriesAsync(EntryListOption... options);
+
+ /**
+ * Sends a request to stream fresh log entries. The method returns a {@code LogEntryServerStream}
+ * object to iterate through the returned stream of the log entries. Use
+ * EntryListOption#bufferWindow(String)} to specify amount of time to buffer log entries at the
+ * server before being returned. entries. Use {@link TailOption#filter(String)} to filter tailed
+ * log entries.
+ *
+ *
Example of streaming log entries for a specific project.
+ *
+ *
{@code
+ * LogEntryServerStream stream = logging.tailLogEntries(TailOption.project("my_project_id"));
+ * Iterator it = stream.iterator();
+ * while (it.hasNext()) {
+ * // do something with entry
+ * // call stream.cancel(); to stop streaming
+ * }
+ * }
+ */
+ @BetaApi("The surface for the tail streaming is not stable yet and may change in the future.")
+ LogEntryServerStream tailLogEntries(TailOption... options);
+
+ /**
+ * Populates metadata fields of the immutable collection of {@link LogEntry} items. Only empty
+ * fields are populated. The {@link SourceLocation} is populated only for items with the severity
+ * set to {@link Severity#DEBUG}. The information about {@link HttpRequest}, trace and span Id is
+ * retrieved using {@link ContextHandler}.
+ *
+ * @param logEntries an immutable collection of {@link LogEntry} items.
+ * @param customResource a customized instance of the {@link MonitoredResource}. If this parameter
+ * is {@code null} then the new instance will be generated using {@link
+ * MonitoredResourceUtil#getResource(String, String)}.
+ * @param exclusionClassPaths a list of exclussion class path prefixes. If left empty then {@link
+ * SourceLocation} instance is built based on the caller's stack trace information. Otherwise,
+ * the information from the first {@link StackTraceElement} along the call stack which class
+ * name does not start with any not {@code null} exclusion class paths is used.
+ * @return A collection of {@link LogEntry} items composed from the {@code logEntries} parameter
+ * with populated metadata fields.
+ */
+ default Iterable populateMetadata(
+ Iterable logEntries,
+ MonitoredResource customResource,
+ String... exclusionClassPaths) {
+ throw new UnsupportedOperationException(
+ "method populateMetadata() does not have default implementation");
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingConfig.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingConfig.java
new file mode 100644
index 000000000000..b2cb946e4ab4
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingConfig.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+
+import com.google.cloud.MonitoredResource;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.logging.Filter;
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.SimpleFormatter;
+
+class LoggingConfig {
+
+ private final LogManager manager = LogManager.getLogManager();
+ private final String className;
+ private static final String FLUSH_LEVEL_TAG = "flushLevel";
+ private static final String LOG_FILENAME_TAG = "log";
+ private static final String LOG_LEVEL_TAG = "level";
+ private static final String FILTER_TAG = "filter";
+ private static final String FORMATTER_TAG = "formatter";
+ private static final String SYNCHRONICITY_TAG = "synchronicity";
+ private static final String RESOURCE_TYPE_TAG = "resourceType";
+ private static final String ENHANCERS_TAG = "enhancers";
+ private static final String USE_INHERITED_CONTEXT = "useInheritedContext";
+ private static final String AUTO_POPULATE_METADATA = "autoPopulateMetadata";
+ private static final String REDIRECT_TO_STDOUT = "redirectToStdout";
+ private static final String LOG_TARGET = "logTarget";
+
+ public LoggingConfig(String className) {
+ this.className = className;
+ }
+
+ Level getFlushLevel() {
+ return getLevelProperty(FLUSH_LEVEL_TAG, LoggingLevel.ERROR);
+ }
+
+ String getLogName() {
+ return getProperty(LOG_FILENAME_TAG, "java.log");
+ }
+
+ Level getLogLevel() {
+ return getLevelProperty(LOG_LEVEL_TAG, LoggingLevel.INFO);
+ }
+
+ Filter getFilter() {
+ return getFilterProperty(FILTER_TAG, null);
+ }
+
+ Synchronicity getSynchronicity() {
+ String synchronicityStr = getProperty(SYNCHRONICITY_TAG);
+ try {
+ return Synchronicity.valueOf(synchronicityStr);
+ } catch (RuntimeException ex) {
+ // If we cannot create the Synchronicity we fall back to default value
+ }
+ return Synchronicity.ASYNC;
+ }
+
+ Formatter getFormatter() {
+ return getFormatterProperty(FORMATTER_TAG, new SimpleFormatter());
+ }
+
+ Boolean getAutoPopulateMetadata() {
+ return getBooleanProperty(AUTO_POPULATE_METADATA, null);
+ }
+
+ Boolean getRedirectToStdout() {
+ return getBooleanProperty(REDIRECT_TO_STDOUT, null);
+ }
+
+ Optional getLogTarget() {
+ return Optional.ofNullable(getProperty(LOG_TARGET)).map(LoggingHandler.LogTarget::valueOf);
+ }
+
+ MonitoredResource getMonitoredResource(String projectId) {
+ String resourceType = getProperty(RESOURCE_TYPE_TAG, "");
+ return MonitoredResourceUtil.getResource(projectId, resourceType);
+ }
+
+ List getEnhancers() {
+ String list = getProperty(ENHANCERS_TAG);
+ try {
+ List enhancers = new ArrayList<>();
+ if (list != null) {
+ Iterable items = Splitter.on(',').split(list);
+ for (String eName : items) {
+ Class extends LoggingEnhancer> clazz =
+ ClassLoader.getSystemClassLoader().loadClass(eName).asSubclass(LoggingEnhancer.class);
+ enhancers.add(clazz.getDeclaredConstructor().newInstance());
+ }
+ }
+ return ImmutableList.copyOf(enhancers);
+ } catch (Exception ex) {
+ // If we cannot create the enhancers we fall back to the default
+ }
+ return ImmutableList.of();
+ }
+
+ /**
+ * Returns boolean value of the property {@code
+ * com.google.cloud.logging.context.ContextHandler.useInheritedContext}. If no value is defined or
+ * the property does not represent a valid boolean value returns {@code false}.
+ *
+ * @return {@code true} or {@code false}
+ */
+ boolean getUseInheritedContext() {
+ String flag = getProperty(USE_INHERITED_CONTEXT, "FALSE");
+ return Boolean.parseBoolean(flag);
+ }
+
+ private String getProperty(String name, String defaultValue) {
+ return firstNonNull(getProperty(name), defaultValue);
+ }
+
+ private String getProperty(String propertyName) {
+ return manager.getProperty(className + "." + propertyName);
+ }
+
+ private Boolean getBooleanProperty(String name, Boolean defaultValue) {
+ String flag = getProperty(name);
+ if (flag != null) {
+ return Boolean.parseBoolean(flag);
+ }
+ return defaultValue;
+ }
+
+ private Level getLevelProperty(String name, Level defaultValue) {
+ String stringLevel = getProperty(name);
+ if (stringLevel == null) {
+ return defaultValue;
+ }
+ try {
+ return Level.parse(stringLevel);
+ } catch (IllegalArgumentException ex) {
+ // If the level does not exist we fall back to default value
+ }
+ return defaultValue;
+ }
+
+ private Filter getFilterProperty(String name, Filter defaultValue) {
+ String stringFilter = getProperty(name);
+ try {
+ if (stringFilter != null) {
+ Class> clz = ClassLoader.getSystemClassLoader().loadClass(stringFilter);
+ return (Filter) clz.getDeclaredConstructor().newInstance();
+ }
+ } catch (Exception ex) {
+ // If we cannot create the filter we fall back to default value
+ }
+ return defaultValue;
+ }
+
+ private Formatter getFormatterProperty(String name, Formatter defaultValue) {
+ String stringFilter = getProperty(name);
+ try {
+ if (stringFilter != null) {
+ Class> clz = ClassLoader.getSystemClassLoader().loadClass(stringFilter);
+ return (Formatter) clz.getDeclaredConstructor().newInstance();
+ }
+ } catch (Exception ex) {
+ // If we cannot create the filter we fall back to default value
+ }
+ return defaultValue;
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingEnhancer.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingEnhancer.java
new file mode 100644
index 000000000000..cc64ae119ab6
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingEnhancer.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+/** An enhancer for log entries. Used to add custom labels to the {@link LogEntry.Builder} */
+public interface LoggingEnhancer {
+ void enhanceLogEntry(LogEntry.Builder builder);
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingException.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingException.java
new file mode 100644
index 000000000000..354baef23c40
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingException.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import com.google.api.core.BetaApi;
+import com.google.api.gax.rpc.ApiException;
+import com.google.cloud.grpc.BaseGrpcServiceException;
+import java.io.IOException;
+
+/** Logging service exception. */
+public final class LoggingException extends BaseGrpcServiceException {
+
+ private static final long serialVersionUID = 449689219311927047L;
+
+ public LoggingException(IOException ex, boolean idempotent) {
+ super(ex, idempotent);
+ }
+
+ @BetaApi
+ public LoggingException(ApiException apiException) {
+ super(apiException);
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingFactory.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingFactory.java
new file mode 100644
index 000000000000..e2b35f1e4130
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingFactory.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import com.google.cloud.ServiceFactory;
+
+/** An interface for Logging factories. */
+public interface LoggingFactory extends ServiceFactory {}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingHandler.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingHandler.java
new file mode 100644
index 000000000000..14f1837cbc22
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingHandler.java
@@ -0,0 +1,521 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static java.util.Arrays.stream;
+
+import com.google.cloud.MonitoredResource;
+import com.google.cloud.logging.Logging.WriteOption;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.logging.ErrorManager;
+import java.util.logging.Filter;
+import java.util.logging.Formatter;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+import java.util.logging.SimpleFormatter;
+
+/**
+ * A logging handler that outputs logs generated with {@link java.util.logging.Logger} to Cloud
+ * Logging.
+ *
+ *
Java logging levels (see {@link java.util.logging.Level}) are mapped to the following Google
+ * Cloud Logging severities:
+ *
+ *
+ *
Mapping of Java logging level to Cloud Logging severities
+ *
+ *
Java Level
+ *
Cloud Logging Severity
+ *
+ *
+ *
SEVERE
+ *
ERROR
+ *
+ *
+ *
WARNING
+ *
WARNING
+ *
+ *
+ *
INFO
+ *
INFO
+ *
+ *
+ *
CONFIG
+ *
INFO
+ *
+ *
+ *
FINE
+ *
DEBUG
+ *
+ *
+ *
FINER
+ *
DEBUG
+ *
+ *
+ *
FINEST
+ *
DEBUG
+ *
+ *
+ *
+ *
Original Java logging levels are added as labels (with {@code levelName} and {@code
+ * levelValue} keys, respectively) to the corresponding Cloud Logging {@link LogEntry}. You can read
+ * entry labels using {@link LogEntry#getLabels()}. To use logging levels that correspond to Cloud
+ * Logging severities you can use {@link LoggingLevel}.
+ *
+ *
Configuration: By default each {@code LoggingHandler} is initialized using the
+ * following {@code LogManager} configuration properties (that you can set in the {@code
+ * logging.properties} file). If properties are not defined (or have invalid values) then the
+ * specified default values are used.
+ *
+ *
+ *
{@code com.google.cloud.logging.LoggingHandler.log} the log name (defaults to {@code
+ * java.log}).
+ *
{@code com.google.cloud.logging.LoggingHandler.level} specifies the default level for the
+ * handler (defaults to {@code Level.INFO}).
+ *
{@code com.google.cloud.logging.LoggingHandler.filter} specifies the name of a {@link
+ * Filter} class to use (defaults to no filter).
+ *
{@code com.google.cloud.logging.LoggingHandler.formatter} specifies the name of a {@link
+ * Formatter} class to use (defaults to {@link SimpleFormatter}).
+ *
{@code com.google.cloud.logging.LoggingHandler.flushLevel} specifies the flush log level.
+ * When a log with this level is published, logs are transmitted to the Cloud Logging service
+ * (defaults to {@link LoggingLevel#ERROR}).
+ *
{@code com.google.cloud.logging.LoggingHandler.enhancers} specifies a comma separated list
+ * of {@link LoggingEnhancer} classes. This handler will call each enhancer list whenever it
+ * builds a {@link LogEntry} instance (defaults to empty list).
+ *
{@code com.google.cloud.logging.LoggingHandler.resourceType} the type name to use when
+ * creating the default {@link MonitoredResource} (defaults to auto-detected resource type,
+ * else "global").
+ *
{@code com.google.cloud.logging.Synchronicity} the synchronicity of the write method to use
+ * to write logs to the Cloud Logging service (defaults to {@link Synchronicity#ASYNC}).
+ *
{@code com.google.cloud.logging.LoggingHandler.autoPopulateMetadata} is a boolean flag that
+ * opts-out the population of the log entries metadata before the logs are sent to Cloud
+ * Logging (defaults to {@code true}).
+ *
{@code com.google.cloud.logging.LoggingHandler.redirectToStdout} is a boolean flag that
+ * opts-in redirecting the output of the handler to STDOUT instead of ingesting logs to Cloud
+ * Logging using Logging API (defaults to {@code false}). Redirecting logs can be used in
+ * Google Cloud environments with installed logging agent to delegate log ingestions to the
+ * agent. Redirected logs are formatted as one line Json string following the structured
+ * logging guidelines. This flag is deprecated; use {@code
+ * com.google.cloud.logging.LoggingHandler.logTarget} instead.
+ *
{@code com.google.cloud.logging.LoggingHandler.logTarget} is an enumeration controlling log
+ * routing (defaults to {@code CLOUD_LOGGING}). If set to STDOUT or STDERR, logs will be
+ * printed to the corresponding stream in the Json format that can be parsed by the logging
+ * agent. If set to CLOUD_LOGGING, logs will be sent directly to the Google Cloud Logging API.
+ *
+ *
+ *
To add a {@code LoggingHandler} to an existing {@link Logger} and be sure to avoid infinite
+ * recursion when logging, use the {@link #addHandler(Logger, LoggingHandler)} method. Alternatively
+ * you can add the handler via {@code logging.properties}. For example using the following line:
+ *
+ *
+ *
+ * @see Structured logging
+ */
+public class LoggingHandler extends Handler {
+
+ private static final String LEVEL_NAME_KEY = "levelName";
+ private static final String LEVEL_VALUE_KEY = "levelValue";
+
+ /** Where to send logs. */
+ public enum LogTarget {
+ /** Sends logs to the Cloud Logging API. */
+ CLOUD_LOGGING,
+ /** Sends JSON-formatted logs to stdout, for use with the Google Cloud logging agent. */
+ STDOUT,
+ /** Sends JSON-formatted logs to stderr, for use with the Google Cloud logging agent. */
+ STDERR
+ }
+
+ private final List enhancers;
+ private final LoggingOptions loggingOptions;
+
+ private volatile Logging logging;
+
+ // Logs with the same severity with the base could be more efficiently sent to
+ // Cloud.
+ // Defaults to level of the handler or Level.FINEST if the handler is set to
+ // Level.ALL.
+ // Currently there is no way to modify the base level, see
+ // https://github.com/googleapis/google-cloud-java/issues/1740 .
+ private final Level baseLevel;
+
+ private volatile Level flushLevel;
+
+ private volatile Boolean autoPopulateMetadata;
+ private volatile LogTarget logTarget;
+
+ private final WriteOption[] defaultWriteOptions;
+
+ /** Creates a handler that publishes messages to Cloud Logging. */
+ public LoggingHandler() {
+ this(null, null, null);
+ }
+
+ /**
+ * Creates a handler that publishes messages to Cloud Logging.
+ *
+ * @param log the name of the log to which log entries are written
+ */
+ public LoggingHandler(String log) {
+ this(log, null, null);
+ }
+
+ /**
+ * Creates a handler that publishes messages to Cloud Logging.
+ *
+ * @param log the name of the log to which log entries are written
+ * @param options options for the Cloud Logging service
+ */
+ public LoggingHandler(String log, LoggingOptions options) {
+ this(log, options, null);
+ }
+
+ /**
+ * Creates a handler that publishes messages to Cloud Logging.
+ *
+ * @param log the name of the log to which log entries are written
+ * @param options options for the Cloud Logging service
+ * @param monitoredResource the monitored resource to which log entries refer. If it is null then
+ * a default resource is created based on the project ID and deployment environment.
+ */
+ public LoggingHandler(String log, LoggingOptions options, MonitoredResource monitoredResource) {
+ this(log, options, monitoredResource, null, null);
+ }
+
+ /**
+ * Creates a handler that publishes messages to Cloud Logging.
+ *
+ * @param log the name of the log to which log entries are written
+ * @param options options for the Cloud Logging service
+ * @param monitoredResource the monitored resource to which log entries refer. If it is null then
+ * a default resource is created based on the project ID and deployment environment.
+ * @param enhancers List of {@link LoggingEnhancer} instances used to enhance any{@link LogEntry}
+ * instances built by this handler.
+ */
+ public LoggingHandler(
+ String log,
+ LoggingOptions options,
+ MonitoredResource monitoredResource,
+ List enhancers) {
+ this(log, options, monitoredResource, enhancers, null);
+ }
+
+ /**
+ * Creates a handler that publishes messages to Cloud Logging. Auto-population of the logs
+ * metadata can be opted-out in {@code options} argument or in the configuration file. At least
+ * one flag {@link LoggingOptions} or {@link LoggingConfig} has to be explicitly set to {@code
+ * false} in order to opt out the metadata auto-population.
+ *
+ * @param log the name of the log to which log entries are written
+ * @param options options for the Cloud Logging service
+ * @param monitoredResource the monitored resource to which log entries refer. If it is null then
+ * a default resource is created based on the project ID and deployment environment.
+ * @param enhancers List of {@link LoggingEnhancer} instances used to enhance any{@link LogEntry}
+ * instances built by this handler.
+ * @param destination the log destination {@link LogDestinationName} (see 'logName' parameter in
+ * https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry)
+ */
+ public LoggingHandler(
+ String log,
+ LoggingOptions options,
+ MonitoredResource monitoredResource,
+ List enhancers,
+ LogDestinationName destination) {
+ try {
+ loggingOptions = options != null ? options : LoggingOptions.getDefaultInstance();
+ LoggingConfig config = new LoggingConfig(getClass().getName());
+ setFilter(config.getFilter());
+ setFormatter(config.getFormatter());
+ Level level = config.getLogLevel();
+ setLevel(level);
+ baseLevel = level.equals(Level.ALL) ? Level.FINEST : level;
+ flushLevel = config.getFlushLevel();
+ Boolean f1 = loggingOptions.getAutoPopulateMetadata();
+ Boolean f2 = config.getAutoPopulateMetadata();
+ autoPopulateMetadata = isTrueOrNull(f1) && isTrueOrNull(f2);
+ logTarget =
+ config
+ .getLogTarget()
+ .orElse(
+ firstNonNull(config.getRedirectToStdout(), Boolean.FALSE)
+ ? LogTarget.STDOUT
+ : LogTarget.CLOUD_LOGGING);
+ String logName = log != null ? log : config.getLogName();
+ MonitoredResource resource =
+ firstNonNull(
+ monitoredResource, config.getMonitoredResource(loggingOptions.getProjectId()));
+ List writeOptions = new ArrayList<>();
+ writeOptions.add(WriteOption.logName(logName));
+ if (resource != null) {
+ writeOptions.add(WriteOption.resource(resource));
+ }
+ writeOptions.add(
+ WriteOption.labels(
+ ImmutableMap.of(
+ LEVEL_NAME_KEY,
+ baseLevel.getName(),
+ LEVEL_VALUE_KEY,
+ String.valueOf(baseLevel.intValue()))));
+ if (destination != null) {
+ writeOptions.add(WriteOption.destination(destination));
+ }
+ defaultWriteOptions = Iterables.toArray(writeOptions, WriteOption.class);
+
+ logging = loggingOptions.getService();
+ logging.setFlushSeverity(severityFor(flushLevel));
+ logging.setWriteSynchronicity(config.getSynchronicity());
+
+ this.enhancers = new ArrayList<>();
+
+ List enhancersParam =
+ firstNonNull(enhancers, firstNonNull(config.getEnhancers(), ImmutableList.of()));
+
+ this.enhancers.addAll(enhancersParam);
+
+ // In the following line getResourceEnhancers() never returns null (@NotNull
+ // attribute)
+ List loggingEnhancers = MonitoredResourceUtil.getResourceEnhancers();
+ this.enhancers.addAll(loggingEnhancers);
+ } catch (RuntimeException ex) {
+ reportError(null, ex, ErrorManager.OPEN_FAILURE);
+ throw ex;
+ }
+ }
+
+ @Override
+ public void publish(LogRecord record) {
+ // check that the log record should be logged
+ if (!isLoggable(record)) {
+ return;
+ }
+ // HACK warning: this logger doesn't work like normal loggers; the log calls are
+ // issued
+ // from another class instead of by itself, so it can't be configured off like
+ // normal
+ // loggers. We have to check the source class name instead.
+ if ("io.netty.handler.codec.http2.Http2FrameLogger".equals(record.getSourceClassName())) {
+ return;
+ }
+ LogEntry logEntry;
+ try {
+ logEntry = logEntryFor(record).build();
+ } catch (RuntimeException ex) {
+ getErrorManager().error(null, ex, ErrorManager.FORMAT_FAILURE);
+ return;
+ }
+ if (logEntry != null) {
+ try {
+ Iterable logEntries =
+ logTarget == LogTarget.CLOUD_LOGGING
+ ? ImmutableList.of(logEntry)
+ : Instrumentation.populateInstrumentationInfo(ImmutableList.of(logEntry)).y();
+ if (autoPopulateMetadata) {
+ logEntries =
+ logging.populateMetadata(
+ logEntries, getMonitoredResource(), "com.google.cloud.logging", "java");
+ }
+ switch (logTarget) {
+ case STDOUT:
+ logEntries.forEach(log -> System.out.println(log.toStructuredJsonString()));
+ break;
+ case STDERR:
+ logEntries.forEach(log -> System.err.println(log.toStructuredJsonString()));
+ break;
+ case CLOUD_LOGGING:
+ logging.write(logEntries, defaultWriteOptions);
+ break;
+ }
+ } catch (RuntimeException ex) {
+ getErrorManager().error(null, ex, ErrorManager.WRITE_FAILURE);
+ }
+ }
+ }
+
+ private MonitoredResource getMonitoredResource() {
+ Optional resourceOption =
+ stream(defaultWriteOptions)
+ .filter(o -> o.getOptionType() == WriteOption.OptionType.RESOURCE)
+ .findFirst();
+ if (resourceOption.isPresent()) {
+ return (MonitoredResource) resourceOption.get().getValue();
+ }
+ return null;
+ }
+
+ protected LogEntry.Builder logEntryFor(LogRecord record) {
+ String payload = getFormatter().format(record);
+ Level level = record.getLevel();
+ LogEntry.Builder builder =
+ LogEntry.newBuilder(Payload.StringPayload.of(payload))
+ .setTimestamp(Instant.ofEpochMilli(record.getMillis()))
+ .setSeverity(severityFor(level));
+
+ if (!baseLevel.equals(level)) {
+ builder
+ .addLabel("levelName", level.getName())
+ .addLabel("levelValue", String.valueOf(level.intValue()));
+ }
+
+ for (LoggingEnhancer enhancer : enhancers) {
+ enhancer.enhanceLogEntry(builder);
+ }
+ return builder;
+ }
+
+ @Override
+ public void flush() {
+ try {
+ logging.flush();
+ } catch (RuntimeException ex) {
+ getErrorManager().error(null, ex, ErrorManager.FLUSH_FAILURE);
+ }
+ }
+
+ /** Closes the handler and the associated {@link Logging} object. */
+ @Override
+ public synchronized void close() {
+ if (logging != null) {
+ try {
+ logging.close();
+ } catch (Exception ex) {
+ // ignore
+ }
+ }
+ logging = null;
+ }
+
+ /** Get the flush log level. */
+ public Level getFlushLevel() {
+ return flushLevel;
+ }
+
+ /**
+ * Sets minimum logging level to log immediately and flush any pending writes.
+ *
+ * @param flushLevel minimum log level to trigger flush
+ */
+ public void setFlushLevel(Level flushLevel) {
+ this.flushLevel = flushLevel;
+ logging.setFlushSeverity(severityFor(flushLevel));
+ }
+
+ /**
+ * Sets synchronicity of logging writes. By default, writes are asynchronous.
+ *
+ * @param synchronicity {@link Synchronicity}
+ */
+ public void setSynchronicity(Synchronicity synchronicity) {
+ logging.setWriteSynchronicity(synchronicity);
+ }
+
+ /** Get the flush log level. */
+ public Synchronicity getSynchronicity() {
+ return logging.getWriteSynchronicity();
+ }
+
+ /** Sets the metadata auto population flag. */
+ public void setAutoPopulateMetadata(boolean value) {
+ this.autoPopulateMetadata = value;
+ }
+
+ /** Gets the metadata auto population flag. */
+ public Boolean getAutoPopulateMetadata() {
+ return this.autoPopulateMetadata;
+ }
+
+ /**
+ * Enable/disable redirection to STDOUT. If set to {@code true}, logs will be printed to STDOUT in
+ * the Json format that can be parsed by the logging agent. If set to {@code false}, logs will be
+ * ingested to Cloud Logging by calling Logging API.
+ *
+ *
This method is mutually exclusive with {@link #setLogTarget(LogTarget)}.
+ *
+ * @deprecated Use {@link #setLogTarget(LogTarget)}.
+ */
+ @Deprecated
+ public void setRedirectToStdout(boolean value) {
+ this.logTarget = value ? LogTarget.STDOUT : LogTarget.CLOUD_LOGGING;
+ }
+
+ /*
+ * @deprecated Use {@link #getLogTarget()}.
+ */
+ @Deprecated
+ public Boolean getRedirectToStdout() {
+ return this.logTarget == LogTarget.STDOUT;
+ }
+
+ /**
+ * Configure the destination for ingested logs. If set to STDOUT or STDERR, logs will be printed
+ * to the corresponding stream in the Json format that can be parsed by the logging agent. If set
+ * to CLOUD_LOGGING, logs will be sent directly to the Google Cloud Logging API.
+ *
+ *
This method is mutually exclusive with {@link #setRedirectToStdout(boolean)}.
+ */
+ public void setLogTarget(LogTarget value) {
+ this.logTarget = value;
+ }
+
+ public LogTarget getLogTarget() {
+ return logTarget;
+ }
+
+ /**
+ * Adds the provided {@code LoggingHandler} to {@code logger}. Use this method to register Cloud
+ * Logging handlers instead of {@link Logger#addHandler(Handler)} to avoid infinite recursion when
+ * logging.
+ */
+ public static void addHandler(Logger logger, LoggingHandler handler) {
+ logger.addHandler(handler);
+ }
+
+ private static Severity severityFor(Level level) {
+ if (level instanceof LoggingLevel) {
+ return ((LoggingLevel) level).getSeverity();
+ }
+ // Choose the severity based on Level range.
+ // The assumption is that Level values below maintain same numeric value
+ int value = level.intValue();
+ if (value <= Level.FINE.intValue()) {
+ return Severity.DEBUG;
+ } else if (value <= Level.INFO.intValue()) {
+ return Severity.INFO;
+ } else if (value <= Level.WARNING.intValue()) {
+ return Severity.WARNING;
+ } else if (value <= Level.SEVERE.intValue()) {
+ return Severity.ERROR;
+ } else if (value == Level.OFF.intValue()) {
+ return Severity.NONE;
+ }
+ return Severity.DEFAULT;
+ }
+
+ private static boolean isTrueOrNull(Boolean b) {
+ return b == null || b.equals(Boolean.TRUE);
+ }
+}
diff --git a/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingImpl.java b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingImpl.java
new file mode 100644
index 000000000000..55068e8705ed
--- /dev/null
+++ b/java-logging/google-cloud-logging/src/main/java/com/google/cloud/logging/LoggingImpl.java
@@ -0,0 +1,1174 @@
+/*
+ * Copyright 2026 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.logging;
+
+import static com.google.api.client.util.Preconditions.checkArgument;
+import static com.google.cloud.logging.Logging.EntryListOption.OptionType.ORDER_BY;
+import static com.google.cloud.logging.Logging.ListOption.OptionType.PAGE_SIZE;
+import static com.google.cloud.logging.Logging.ListOption.OptionType.PAGE_TOKEN;
+import static com.google.cloud.logging.Logging.WriteOption.OptionType.LABELS;
+import static com.google.cloud.logging.Logging.WriteOption.OptionType.LOG_DESTINATION;
+import static com.google.cloud.logging.Logging.WriteOption.OptionType.LOG_NAME;
+import static com.google.cloud.logging.Logging.WriteOption.OptionType.PARTIAL_SUCCESS;
+import static com.google.cloud.logging.Logging.WriteOption.OptionType.RESOURCE;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.api.client.util.Strings;
+import com.google.api.core.ApiFunction;
+import com.google.api.core.ApiFuture;
+import com.google.api.core.ApiFutureCallback;
+import com.google.api.core.ApiFutures;
+import com.google.api.gax.paging.AsyncPage;
+import com.google.api.gax.paging.Page;
+import com.google.api.gax.rpc.BidiStream;
+import com.google.cloud.AsyncPageImpl;
+import com.google.cloud.BaseService;
+import com.google.cloud.MonitoredResource;
+import com.google.cloud.MonitoredResourceDescriptor;
+import com.google.cloud.PageImpl;
+import com.google.cloud.Tuple;
+import com.google.cloud.logging.ContextHandler.ContextPriority;
+import com.google.cloud.logging.spi.v2.LoggingRpc;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Ascii;
+import com.google.common.base.Function;
+import com.google.common.base.Throwables;
+import com.google.common.base.VerifyException;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.Uninterruptibles;
+import com.google.logging.v2.CreateExclusionRequest;
+import com.google.logging.v2.CreateLogMetricRequest;
+import com.google.logging.v2.CreateSinkRequest;
+import com.google.logging.v2.DeleteExclusionRequest;
+import com.google.logging.v2.DeleteLogMetricRequest;
+import com.google.logging.v2.DeleteLogRequest;
+import com.google.logging.v2.DeleteSinkRequest;
+import com.google.logging.v2.GetExclusionRequest;
+import com.google.logging.v2.GetLogMetricRequest;
+import com.google.logging.v2.GetSinkRequest;
+import com.google.logging.v2.ListExclusionsRequest;
+import com.google.logging.v2.ListExclusionsResponse;
+import com.google.logging.v2.ListLogEntriesRequest;
+import com.google.logging.v2.ListLogEntriesResponse;
+import com.google.logging.v2.ListLogMetricsRequest;
+import com.google.logging.v2.ListLogMetricsResponse;
+import com.google.logging.v2.ListLogsRequest;
+import com.google.logging.v2.ListLogsResponse;
+import com.google.logging.v2.ListMonitoredResourceDescriptorsRequest;
+import com.google.logging.v2.ListMonitoredResourceDescriptorsResponse;
+import com.google.logging.v2.ListSinksRequest;
+import com.google.logging.v2.ListSinksResponse;
+import com.google.logging.v2.LogExclusionName;
+import com.google.logging.v2.LogMetricName;
+import com.google.logging.v2.LogName;
+import com.google.logging.v2.LogSinkName;
+import com.google.logging.v2.ProjectName;
+import com.google.logging.v2.TailLogEntriesRequest;
+import com.google.logging.v2.TailLogEntriesResponse;
+import com.google.logging.v2.UpdateExclusionRequest;
+import com.google.logging.v2.UpdateLogMetricRequest;
+import com.google.logging.v2.UpdateSinkRequest;
+import com.google.logging.v2.WriteLogEntriesRequest;
+import com.google.logging.v2.WriteLogEntriesResponse;
+import com.google.protobuf.Empty;
+import com.google.protobuf.util.Durations;
+import io.opentelemetry.api.trace.Span;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+class LoggingImpl extends BaseService implements Logging {
+ protected static final String RESOURCE_NAME_FORMAT = "projects/%s/traces/%s";
+ private static final int FLUSH_WAIT_TIMEOUT_SECONDS = 6;
+ private final LoggingRpc rpc;
+ private final Map