如果作业已设置为将日志写入 Cloud Logging,则此示例会检索其日志。日志可以提供有助于分析作业的信息。例如,日志可以帮助您调试失败的作业。
深入探索
如需查看包含此代码示例的详细文档,请参阅以下内容:
代码示例
C++
如需了解详情,请参阅批量 C++ API 参考文档。
如需向 Batch 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证。
#include "google/cloud/batch/v1/batch_client.h"
#include "google/cloud/logging/v2/logging_service_v2_client.h"
#include "google/cloud/location.h"
#include "google/cloud/project.h"
[](std::string const& project_id, std::string const& location_id,
std::string const& job_id) {
auto const project = google::cloud::Project(project_id);
auto const location = google::cloud::Location(project, location_id);
auto const name = location.FullName() + "/jobs/" + job_id;
auto batch = google::cloud::batch_v1::BatchServiceClient(
google::cloud::batch_v1::MakeBatchServiceConnection());
auto job = batch.GetJob(name);
if (!job) throw std::move(job).status();
auto logging = google::cloud::logging_v2::LoggingServiceV2Client(
google::cloud::logging_v2::MakeLoggingServiceV2Connection());
auto const log_name = project.FullName() + "/logs/batch_task_logs";
google::logging::v2::ListLogEntriesRequest request;
request.mutable_resource_names()->Add(project.FullName());
request.set_filter("logName=\"" + log_name +
"\" labels.job_uid=" + job->uid());
for (auto l : logging.ListLogEntries(request)) {
if (!l) throw std::move(l).status();
std::cout << l->text_payload() << "\n";
}
}
Go
如需了解详情,请参阅批量 Go API 参考文档。
如需向 Batch 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证。
import (
"context"
"fmt"
"io"
batch "cloud.google.com/go/batch/apiv1"
"cloud.google.com/go/logging"
"cloud.google.com/go/logging/logadmin"
"google.golang.org/api/iterator"
batchpb "google.golang.org/genproto/googleapis/cloud/batch/v1"
)
// Retrieve the logs written by the given job to Cloud Logging
func printJobLogs(w io.Writer, projectID string, job *batchpb.Job) error {
// projectID := "your_project_id"
ctx := context.Background()
batchClient, err := batch.NewClient(ctx)
if err != nil {
return fmt.Errorf("NewClient: %w", err)
}
defer batchClient.Close()
adminClient, err := logadmin.NewClient(ctx, projectID)
if err != nil {
return fmt.Errorf("Failed to create logadmin client: %w", err)
}
defer adminClient.Close()
const name = "batch_task_logs"
iter := adminClient.Entries(ctx,
// Only get entries from the "batch_task_logs" log for the job with the given UID
logadmin.Filter(fmt.Sprintf(`logName = "projects/%s/logs/%s" AND labels.job_uid=%s`, projectID, name, job.Uid)),
)
var entries []*logging.Entry
for {
logEntry, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
return fmt.Errorf("unable to fetch log entry: %w", err)
}
entries = append(entries, logEntry)
fmt.Fprintf(w, "%s\n", logEntry.Payload)
}
fmt.Fprintf(w, "Successfully fetched %d log entries\n", len(entries))
return nil
}
Java
如需了解详情,请参阅批量 Java API 参考文档。
如需向 Batch 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证。
import com.google.cloud.batch.v1.Job;
import com.google.cloud.logging.v2.LoggingClient;
import com.google.logging.v2.ListLogEntriesRequest;
import com.google.logging.v2.LogEntry;
import java.io.IOException;
public class ReadJobLogs {
public static void main(String[] args) throws IOException {
// TODO(developer): Replace these variables before running the sample.
// Project ID or project number of the Cloud project hosting the job.
String projectId = "YOUR_PROJECT_ID";
// The job which logs you want to print.
Job job = Job.newBuilder().build();
readJobLogs(projectId, job);
}
// Prints the log messages created by given job.
public static void readJobLogs(String projectId, Job job) throws IOException {
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests. After completing all of your requests, call
// the `loggingClient.close()` method on the client to safely
// clean up any remaining background resources.
try (LoggingClient loggingClient = LoggingClient.create()) {
ListLogEntriesRequest request = ListLogEntriesRequest.newBuilder()
.addResourceNames(String.format("projects/%s", projectId))
.setFilter(String.format("labels.job_uid=%s", job.getUid()))
.build();
for (LogEntry logEntry : loggingClient.listLogEntries(request).iterateAll()) {
System.out.println(logEntry.getTextPayload());
}
}
}
}
Python
如需了解详情,请参阅批量 Python API 参考文档。
如需向 Batch 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为本地开发环境设置身份验证。
from __future__ import annotations
from typing import NoReturn
from google.cloud import batch_v1
from google.cloud import logging
def print_job_logs(project_id: str, job: batch_v1.Job) -> NoReturn:
"""
Prints the log messages created by given job.
Args:
project_id: name of the project hosting the job.
job: the job which logs you want to print.
"""
# Initialize client that will be used to send requests across threads. This
# client only needs to be created once, and can be reused for multiple requests.
log_client = logging.Client(project=project_id)
logger = log_client.logger("batch_task_logs")
for log_entry in logger.list_entries(filter_=f"labels.job_uid={job.uid}"):
print(log_entry.payload)
后续步骤
如需搜索和过滤其他 Google Cloud 产品的代码示例,请参阅 Google Cloud 示例浏览器。