Neste documento, descrevemos como o Cloud Logging divide entradas de registro de auditoria superdimensionadas e fornece orientações sobre como remontar esses registros de auditoria divididos.
Quando uma única entrada de registro de auditoria excede o limite de tamanho, o Cloud Logging divide essa entrada e distribui os dados contidos na entrada de registro de auditoria original em várias entradas. Os usuários talvez queiram remontar os registros de auditoria divididos, já que as entradas individuais não contêm todos os campos do registro de auditoria original.
Como reconhecer entradas de registro de auditoria divididas
As entradas de registro divididas contêm informações sobre a entrada original da qual elas foram divididas. Se uma entrada de registro contiver um
campo split
, a entrada será o resultado da divisão de uma entrada de registro original maior. O campo split
é um objeto LogSplit
que contém as informações necessárias para identificar as entradas de registro de divisão
relacionadas.
Cada entrada de registro de divisão contém os seguintes campos:
split.uid
: um identificador exclusivo para o grupo de entradas de registro que foram divididas de uma entrada de registro original comum. O valor desse campo é o mesmo para todas as entradas divididas da entrada de registro original.split.index
: a posição dessa entrada na série de entradas divididas. A primeira entrada da divisão tem o índice0
.split.index
também está anexado ao campoLogEntry.insertId
.split.totalSplits
: o número de entradas de registro em que a entrada original foi dividida. O valor desse campo é o mesmo para todas as entradas divididas da entrada de registro original.
Como uma entrada de registro é dividida
Quando uma entrada de registro de auditoria muito grande é dividida, os campos são distribuídos entre as entradas de registro de divisão resultantes da seguinte maneira:
Todos os campos, exceto o
protoPayload
, são duplicados em cada entrada dividida.Os subcampos
protoPayload
a seguir podem ser divididos em várias entradas:protoPayload.metadata
protoPayload.request
protoPayload.response
Todos os outros subcampos
protoPayload
são incluídos em todas as entradas de divisão.Para os subcampos
protoPayload.metadata
,protoPayload.request
eprotoPayload.response
, os seguintes tipos de campo podem ser divididos em várias entradas:
Se um campo for membro de um campo que pode ser dividido, mas não for um dos tipos de campo dividível, ele vai estar presente apenas em um dos registros divididos.
Por exemplo, um campo booleano no subcampo protoPayload.request
só pode
aparecer em uma entrada de registro dividida, mas um campo de string no subcampo
protoPayload.request
pode ter o conteúdo dividido em várias entradas de registro divididas.
Para ver um exemplo de como uma entrada longa é dividida, consulte Exemplo de divisão de entrada de registro.
Campos repetidos com muitos valores
Quando o valor do campo protoPayload.metadata
, protoPayload.request
ou
protoPayload.response
contém uma lista de valores repetidos, ela pode ser
dividida e distribuída em várias entradas de registro divididas.
Por exemplo, a lista de valores ["foo", "bar", "baz"] pode ser dividida em duas: ["foo", "ba"] e ["", "r", "baz"]. A primeira lista é a entrada com split.index
de 0
, e a segunda está na entrada com split.index
de 1
. A segunda lista começa com uma string vazia para manter as posições dos
elementos na lista e indicar que os elementos nas mesmas posições nas
diferentes listas precisam ser unidos. No exemplo, ba
é o segundo
elemento da lista na entrada 0
, e r
é o segundo elemento da lista na entrada 1
. Portanto, eles são recombinados na ordem bar
ao montar a lista original.
Campos grandes não repetidos
Quando campos Struct
e string
grandes e não repetidos são divididos, eles
são processados da seguinte maneira:
Um campo
string
é dividido no nível do caractere, e não de bytes. Por isso, os caracteres de vários bytes não são alterados.LogEntry.split.index
controla a ordem do conteúdo de campos divididos e não repetidos.
Remontar a entrada de registro dividida
Para remontar um conjunto de registros divididos, siga estas etapas:
Classifique o conjunto de registros de auditoria divididos por
LogEntry.split.index
em ordem crescente.Crie uma cópia do primeiro registro de divisão, em que
LogEntry.split.index == 0
. Essa cópia é o início do registro recriado.Para as entradas de registro restantes, itere todos os campos divisíveis de
protoPayload
e conclua as etapas a seguir para cada campo:Se o campo já existir no registro recriado, anexe o conteúdo desse campo ao registro recriado.
Se o campo não existir no registro recriado, copie esse campo para ele.
Quando divididos, os campos repetidos preservam o índice dos elementos. Assim, é possível aplicar essas etapas no nível do elemento ao montar um campo repetido.
Depois de iterar os campos separáveis, limpe o
LogEntry.split
do registro recriado.Remova o sufixo
.0
doLogEntry.insert_id
do registro recriado.
Amostras de consultas
Para encontrar todas as entradas de registro que foram divididas da mesma entrada de registro original, execute a seguinte consulta no Explorador de registros, substituindo a variável UID pelo valor desejado:
split.uid="UID"
Exemplo:
split.uid="abc123"
Para encontrar todas as entradas de registro que fazem parte de qualquer divisão, execute a seguinte consulta:
split:*
Filtrar registros de auditoria divididos
É possível excluir todos os registros de auditoria divididos de uma consulta usando o seguinte filtro:
split.totalSplits = 0
Também é possível incluir apenas a primeira entrada de um registro de auditoria dividida e excluir o restante das entradas usando o seguinte filtro:
split.index = 0
Exemplo de divisão de entrada de registro
O exemplo a seguir mostra uma entrada de registro de auditoria antes da divisão em quatro novas entradas de registro. As novas entradas mostram como campos diferentes são tratados na operação de divisão.
Entrada de registro de auditoria muito grande antes da divisão
{
"insertId": "567",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"protoPayload": {
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": {
"principalEmail": "user@example_company.com"
},
"authorizationInfo": [
{
"resource": "example.googleapis.com/projects/1234/resources/123",
"permission": "examples.get",
"granted": "true"
}
],
"request" {
"boolField": true,
"numberField": 123,
"stringField": "Very long string that needs 2 log entries.",
"structField": {
"nestedNumberField": 1337,
"nestedStringField": "Another long string that needs 2 log entries.",
},
"listField" [
{"value": "short 1"},
{"value": "Yet another long string."},
{"value": "short 2"},
{"value": "short 3"},
]
}
}
}
Entrada de registro de auditoria muito grande após a divisão
A entrada de registro original é dividida nas entradas a seguir. Observe que cada entrada
inclui o objeto split
com um uid
e um valor totalSplits
de 4
. Cada
entrada tem um valor split.index
de 0
, 1
, 2
ou 3
, que indica a
ordem das entradas de registro de divisão.
Entrada de registro dividida, índice 0
Esta é a primeira entrada de registro dividida, com um valor split.index
de 0
.
{
"insertId": "567.0",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"split": {
"uid": "789+2022-02-22T12:22:22.22+05:00",
"index": 0,
"totalSplits": 4,
},
"protoPayload": {
// The following fields are included in all split entries
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": { // small size; included in all split entries
"principalEmail": "user@example_company.com"
},
// The following field is included in this split entry only.
"authorizationInfo": [
{
"resource": "spanner.googleapis.com/projects/1234/datasets/123",
"permission": "databases.read",
"granted": "true"
}
],
// The following field is split across all the split entries
"request" {
// boolField and numberField can only be in one split.
"boolField": true,
"numberField": 123,
// Split with the next LogEntry.
"stringField": "Very long string that ",
}
}
}
Entrada de registro da divisão, índice 1
Esta é a próxima entrada de registro dividida, com um valor split.index
de 1
.
{
"insertId": "567.1",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"split": {
"uid": "567+2022-02-22T12:22:22.22+05:00",
"index": 1,
"totalSplits": 4,
},
"protoPayload": {
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": {
"principalEmail": "user@example_company.com"
},
"request" {
// boolField and numberField aren't present
// Continued from the previous entry.
"stringField": "needs 2 log entries.",
"structField": {
"nestedNumberField": 1337,
// Split with the next LogEntry.
"nestedStringField": "Another long string ",
}
}
}
}
Entrada de registro dividida, índice 2
Esta é a próxima entrada de registro dividida, com um valor split.index
de 2
.
{
"insertId": "567.2",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"split": {
"uid": "567+2022-02-22T12:22:22.22+05:00",
"index": 2,
"totalSplits": 4,
},
"protoPayload": {
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": {
"principalEmail": "user@example_company.com"
},
request {
"structField": {
// Continued from the previous entry.
"nestedStringField": "that needs 2 log entries.",
}
"listField" [
{"value": "short 1"},
{"value": "Yet another "}, // Split with the next LogEntry.
// Missing two values, split with the next LogEntry.
]
}
}
}
Entrada de registro da divisão, índice 3
Esta é a entrada de registro da divisão final, com um valor split.index
de 3
.
{
"insertId": "567.3",
"logName": "projects/1234/logs/cloudaudit.googleapis.com%2Fdata_access",
"resource": {
"type": "audited_resource"
},
"split": {
"uid": "567+2022-02-22T12:22:22.22+05:00",
"index": 3,
"totalSplits": 4,
},
"protoPayload": {
"serviceName": "example.googleapis.com",
"methodName": "google.cloud.example.ExampleMethod",
"resourceName": "projects/1234/resources/123",
"status": {
"code": 0
},
"authenticationInfo": {
"principalEmail": "user@example_company.com"
},
"request" {
"listField" [
{}, // Padding to ensure correct positioning of elements in split repeated fields.
{"value": "long string."}, // Continuation of the second repeated field.
{"value": "short 2"},
{"value": "short 3"},
]
}
}
}