2

我想将日志发布到 Stackdriver 的“自定义日志”。这些功能是测试版,因此可能没有说明如何在 App Engine 上使用 Java API 进行日志记录。无论如何我想描述我的问题:我使用这个 API 版本:

"com.google.apis:google-api-services-logging:v2beta1-rev10-1.21.0"

所以,首先我像这样构建日志对象(我希望这是正确的):

public static Logging createAuthorizedClient() throws IOException {
    // Create the credential
    HttpTransport transport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();
    GoogleCredential credential = GoogleCredential.getApplicationDefault(transport, jsonFactory);

    if (credential.createScopedRequired()) {
        credential = credential.createScoped(LoggingScopes.all());
    }

    return new Logging.Builder(transport, jsonFactory, credential).setApplicationName(SharedConstants.APPLICATION_ID).build();
}

获得 Logging 客户端后,我尝试将条目推送到日志:

    LogEntry lEntry = new LogEntry();
    lEntry.setTextPayload("I want to see this log!");

    WriteLogEntriesRequest writeLogEntriesRequest = new WriteLogEntriesRequest();

    writeLogEntriesRequest.setLogName("My Super log");
    List<LogEntry> listEntries = new ArrayList<>();
    listEntries.add(lEntry);

    writeLogEntriesRequest.setEntries(listEntries);

    Logging logging = LoggingManager.createAuthorizedClient();
    Write write = logging.entries().write(writeLogEntriesRequest);
    WriteLogEntriesResponse writeLogResponse = write.execute();

但我得到的是:

  com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 OK
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Invalid resource id",
    "reason" : "badRequest"
  } ],
  "message" : "Invalid resource id",
  "status" : "INVALID_ARGUMENT"
}

=== 更新:工作解决方案 ===

感谢 mshamma。这是完整的代码,如何将数据发送到日志记录:

    public boolean send() {
        WriteLogEntriesResponse response = null;
        try {
            final String now = getNowUtc();
            final String insertId = "entry-at-" + now;
            final Map<String, String> labels = ImmutableMap.of("project_id", SharedConstants.APPLICATION_ID, "name",
                    "projects/" + SharedConstants.APPLICATION_ID + "/logs/" + this.logName);

            Logging service = createAuthorizedClient();
            MonitoredResource ressource = new MonitoredResource();
            ressource.setType("logging_log");
            ressource.setLabels(labels);

            LogEntry entry = new LogEntry().setInsertId(insertId).setResource(ressource).setTimestamp(now)
                    .setJsonPayload(this.entriesMap)
                    .setLogName("projects/" + SharedConstants.APPLICATION_ID + "/logs/" + this.logName)
                    .setSeverity(this.severity);
            WriteLogEntriesRequest content = (new WriteLogEntriesRequest())
                    .setEntries(Collections.singletonList(entry));
            response = service.entries().write(content).execute();
        } catch (Exception e) {
        }
        return response != null;
    }

    private static String getNowUtc() {
        SimpleDateFormat dateFormatUtc = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        dateFormatUtc.setTimeZone(TimeZone.getTimeZone("UTC"));
        return dateFormatUtc.format(new Date());
    }

此代码适用于最新版本的日志记录 API

因此,EntriesMap 是:

private Map<String, Object> entriesMap;
4

1 回答 1

1

我在非托管 Python 环境中遇到了同样的问题。我得到了工作,我可以在您的代码中看到至少两个问题。

  1. 日志名称需要遵循以下模式:“projects/<project-id>/logs/<log-id>”。在此处查看该字段的文档:https ://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/LogEntry#SCHEMA_REPRESENTATION

  2. 您应该将资源描述符添加到日志条目 (lEntry) 和写入日志条目请求 (writeLogEntriesRequest)。在 GAE 的情况下,资源类型字段应设置为“gae_app”,并且您必须为标识 GAE 部署的资源添加三个标签:“project_id”、“module_id”和“version_id”。

我希望这将有助于解决您的问题!

于 2016-05-03T06:18:10.653 回答