Как отправить одну запись журнала с текстовым сообщением и полезной нагрузкой JSON с помощью @ google-cloud / logging?

Следуя этому руководству и некоторым другим документам, у меня есть этот код, который работает нормально, что касается отправки журналов в Cloud Logging моего проекта:

testLogging.ts

import { Logging } from "@google-cloud/logging";

const PROJECT_ID = "MY_PROJECT_ID";
const REGION = "MY_REGION";
const SERVICE_NAME = "MY_SERVICE_NAME";

const logging = new Logging({ projectId: PROJECT_ID });
const logName = "my-logs"; 
const log = logging.log(logName);

const resource = {
  type: "cloud_run_revision",     // I'M LOGGING FOR A CLOUD RUN CONTAINER
  labels: {
    service_name: SERVICE_NAME,
    location: REGION,
    project_id: PROJECT_ID,
    revision_name: "",
    configuration_name: ""
  }
};

const text_msg = `MY ERROR MSG`;
const json_payload = { foo: "bar" };

const text_entry = log.entry(
  { resource,  severity: "ERROR" },
  text_msg
);

const json_entry = log.entry(
  { resource,  severity: "ERROR" },
  json_payload 
);

log.write(text_entry);
log.write(json_entry);

Они работают. И это регистрируется:

введите описание изображения здесь

Но пока мне удалось зарегистрировать только его отдельно. И я хотел бы отправить одну запись журнала с текстовым сообщением и полезной нагрузкой JSON. Как я могу это сделать?

Ссылки:


person cbdeveloper    schedule 08.02.2021    source источник
comment
Нет, я ошибался насчет protobuf, потому что библиотека выполняет преобразование объекта в protobuf внутренне.   -  person Brian Burton    schedule 08.02.2021


Ответы (2)


Обновление после тестирования

Я тестировал эту версию, и она работает, поэтому посмотрите, сможете ли вы адаптировать ее к своим потребностям.

const {Logging} = require("@google-cloud/logging");

const PROJECT_ID = "PROJECT_ID";
const REGION = "REGION";
const SERVICE_NAME = "MY_SERVICE_NAME";
const KEYFILE_PATH = "keyfile.json";

const logging = new Logging({ projectId: PROJECT_ID, keyFile: KEYFILE_PATH, fallback: false });
const logName = "my-log";
const log = logging.log(logName);

const resource = {
    type: "cloud_run_revision",     // I'M LOGGING FOR A CLOUD RUN CONTAINER
    labels: {
        service_name: SERVICE_NAME,
        location: REGION,
        project_id: PROJECT_ID,
        revision_name: "",
        configuration_name: ""
    }
};

const text_msg = `MY ERROR MSG`;
const json_payload = { foo: "bar" };

// The metadata associated with the entry
const metadata = {
    resource,
    severity: 'ERROR',
    textPayload: text_msg,
    jsonPayload: json_payload
};

// Prepares a log entry
const entry = log.entry(metadata);

async function writeLog() {
    await log.write(entry);
    console.log('Logged!');
}

writeLog();

В результате получается:  Результаты регистрации


Исходное сообщение

Функция entry() принимает несколько конфигураций. отбросив второй параметр и просто передав его в метаданные.

  log.entry({
    resource,
    severity: "ERROR",
    jsonPayload: json_payload,
    textPayload: text_payload
  });
person Brian Burton    schedule 08.02.2021
comment
Спасибо. Пожалуйста, обратите внимание на типичную ошибку, которую я получаю при попытке передать объект свойству jsonPayload. ОБНОВЛЕНИЕ: Неважно, как только я удалил второй аргумент вызова log.entry(), ошибка типа исчезла. - person cbdeveloper; 08.02.2021
comment
Хорошая сделка, переход прямо к коду обычно более информативен, чем документация. - person Brian Burton; 08.02.2021
comment
Но есть проблема. Журнал больше не отображается. Я создаю запись в точности так, как ваш ответ, а затем делаю log.write(the_entry). Это не вызывает никаких ошибок, но журнал на самом деле не отправляется, потому что он не отображается в моих отчетах. Возможно, мне нужно будет отправить текст msg в качестве второго аргумента. И создайте структуру, как вы предложили при редактировании. Не могли бы вы добавить его обратно? - person cbdeveloper; 08.02.2021
comment
Я обновил свой вопрос, добавив новую попытку, используя ваше предложение пакета pb-util. Я почти у цели, но еще не успокоился. - person cbdeveloper; 08.02.2021
comment
Я проверю это - person Brian Burton; 08.02.2021
comment
Спасибо. См. Последний экран, который я добавил к вопросу. Я думаю, вы не можете установить jsonPayload и textPayload одновременно. Может, то, что я хотел бы сделать, невозможно? - person cbdeveloper; 08.02.2021
comment
Нет, это возможно, просто проверил. Я обновлю свой ответ. - person Brian Burton; 08.02.2021
comment
Наконец-то нашел способ это сделать. Используя только jsonPayload. Я добавил ответ. Спасибо большое за вашу помощь. - person cbdeveloper; 08.02.2021

С помощью @BrianBurton и его ответа я нашел способ сделать это:

Из справочного документа LogEntry видно, что полезная нагрузка должна быть одной из следующих: protoPayload, textPayload или jsonPayload.

введите описание изображения здесь

Но я только что узнал, что если вы добавите поле message в свой jsonPayload объект, оно будет отображаться как сообщение об ошибке или в журнале.

Например:

const json_payload = { message: "SOMETHING HAPPENED", foo: "bar" };

const json_entry = log.entry(
  { resource,  
    severity: "ERROR",
  },
  json_payload
);

log.write(json_entry);

Результаты в:

введите описание изображения здесь

person cbdeveloper    schedule 08.02.2021