Especificação da Linguagem de Consulta de Registro em Log

Use componentes de sintaxe de consulta com pesquisas personalizadas do modo Avançado na página Pesquisar do Logging.

Consulte também Consultas de Pesquisa Avançada e pesquisas salvas para obter mais informações.

Componentes de Consulta

O processamento da linguagem de consulta de registro em log se baseia em um modelo de fluxo de dados. Cada consulta pode fazer referência a um ou mais logs e gerar um conjunto de dados de tabela como resultado. A linguagem de consulta fornece vários operadores para pesquisar, filtrar e agregar logs estruturados e não estruturados.

Uma consulta de registro em log inclui os seguintes componentes:

Streams de Log

Para iniciar sua pesquisa, primeiro você deve definir o conjunto de logs que deseja pesquisar. Você pode optar por pesquisar objetos de log, grupos de logs ou compartimentos específicos. Você pode misturar e corresponder quantos logs precisar. O escopo de pesquisa é definido usando o seguinte padrão:
search <log_stream> (,? <log_stream>)*

A linguagem de consulta extrai entradas de log do escopo fornecido e cria um stream de log que você pode filtrar, agregar e visualizar.

Stream de log:

<log_stream> := "<compartment_ocid> ( /<log_goup_ocid> ( /<log_object_ocid> )? )?"

Exemplos:

search "compartmentOcid/logGroupNameOrOcid/logNameOrOcid"
search "compartmentOcid/logGroupNameOrOcid"
search "compartmentOcid"
search "compartmentOcid/logGroupNameOrOcid/logNameOrOcid", "compartmentOcid_2/logGroupNameOrOcid_2", "compartmentOcid_3"

Campos

Todos os campos nos streams de log fazem distinção entre maiúsculas e minúsculas. Embora os logs reais tenham campos indexados apenas em letras minúsculas, você também pode criar novos campos na consulta com letras maiúsculas e minúsculas:
search "..."
   | select event as EventName

Os campos estão em notação JSON; portanto, caracteres especiais devem estar entre aspas.

Fields: <field_name> := <identifier> (DOT <identifier>)*

Para Identificador:

<identifier> := a-zA-Z_[a-zA-Z_0-9]* | ('"' (~'"' | '""')* '"')

Exemplos:

  • type
  • data.message
  • data.request.URL
  • "tipo"
  • "data"."mensagem"
  • "data.mensagem" (não é o mesmo que "data"."mensagem")
  • data."$event"
  • data."nome"
  • data."um exemplo de aspas duplas com escape ("")"

Tipos de Dados

Os seguintes tipos de dados principais são suportados pela linguagem de consulta. São (longos e duplos) 8 bytes.

Para obter detalhes sobre a representação dos valores dos tipos correspondentes, consulte Literais.

  • Strings
  • Números (inteiro, ponto flutuante)
  • Arrays
  • Boolianos
  • Timestamps
  • Intervalos

Expressões de Stream

Todas as expressões que produzem um stream são expressões de stream. As expressões de stream podem ser formadas usando os seguintes operadores:

Expressões de Barra Vertical

Uma barra vertical (|) aplica um operador no lado esquerdo a uma expressão de stream no lado direito. A expressão de barra vertical é uma expressão de stream.

O operador no lado direito de uma barra vertical deve consumir apenas um stream (por exemplo, operações de agregação, filtros).

O lado esquerdo torna-se o "stream atual" da expressão do lado direito, tornando todos os campos no stream atual disponíveis de acordo com os nomes curtos. Por exemplo:
search "application"
  | where level = 'ERROR'
 
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}

Operadores

Os itens a seguir são suportados ao executar consultas avançadas:

Operadores Tabulares

Um operador tabular cria ou modifica um stream de log filtrando ou alterando entradas de log. Consulte também a notação de sintaxe de BNF. Estes são operadores tabulares:

where

Filtra o stream de log atual usando uma expressão booliana.

search "application"
  | where level = 'ERROR'
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}

where é opcional:

search "application"
   | level = 'ERROR'

Algumas comparações de exemplo com números e comparações de campo Booliano são as seguintes:

| data.statusCode = 200
| data.isPar

Você pode executar uma pesquisa de texto completo especificando um filtro em todo o conteúdo do log. Uma pesquisa em logContent retorna qualquer linha de log em que um valor corresponde à sua string. Esta funcionalidade suporta curingas. Por exemplo:

search "application"
   | where logContent = 'ERROR' -- returns log lines with a value matching "ERROR"
search "application"
   | where logContent = '*ERROR*' -- returns log lines with a value containing "ERROR"
top
Extrai apenas um número especificado de linhas do stream de log atual, classificadas com base em alguma expressão.
<top> := top [0-9]+ by <expr>

Exemplos:

  • top 3 by datetime
  • top 3 by *
  • top 3 by (a + b)

Um número de linhas deve ser um número inteiro positivo constante e uma expressão de classificação deve ser fornecida.

search "application"
  | top 3 by impact
>>
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
sort

Classifica o stream de log atual pelas colunas especificadas, em ordem crescente (padrão) ou decrescente. O operador usa as palavras-chave "DESC" e "ASC" para especificar o tipo da ordem. A ordem de classificação padrão é asc.

<sort> := sort by <sort_expr> (, <sort_expr>)*
<sort_expr> := <expr> (asc | desc)?

Exemplo:

search "application"
  | sort by impact desc
>>
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated..."}
{"timestamp": "2019-01-03T00:06:59", "level":"INFO", "host":" host2", "message":"fs clean up started..."}

Mais de uma coluna pode ser usada para especificar a ordem:

search "application"
  | sort by host, impact desc
>>
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
{"timestamp": "2019-01-03T00:06:59", "level":"INFO", "host":" host2", "message":"fs clean up started..."}
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated..."}
dedup

Processa o stream de log atual filtrando todas as duplicações por colunas especificadas. Se mais de uma coluna for especificada, todas as colunas precisarão ser delimitadas por vírgulas.

<dedup> := dedup <expr> (, <expr>)

Exemplos:

search "application"
  | dedup host
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
search "application"
  | dedup host, impact
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
select

Aplica uma série de expressões escalares nomeadas ao stream de logs atual. Consulte summarize para obter uma versão de agregação de select.

<select> := select <select_expr> (, <select_expr>)*
<select_expr> := ( * | <expr> (as <identifier>)? )

Exemplo:

search "application"
  | select level, host, impact+10 as impact, timestamp
>>
{"level":"ERROR", "host":"host1", "impact": 12, "timestamp": "2019-01-03T00:04:01"}
{"level":"INFO", "host":" host1", "timestamp": "2019-01-03T00:04:05"}
{"level":"WARNING", "host":"host2", "impact": 11, "timestamp": "2019-01-03T00:05:33"}
{"level":"ERROR", "host":"host2", "impact": 14, "timestamp": "2019-01-03T00:06:39"}
{"level":"ERROR", "host":"host2", "impact": 15, "timestamp": "2019-01-03T00:06:59"}
{"level":"INFO", "host":" host2", "timestamp": "2019-01-03T00:06:59"}
extend

Estende o stream de log atual com uma coluna calculada.

<extend> := extend <expr> (as <identifier>)?

Exemplo:

search "application"
  | extend concat(host, 'us.oracle.com') as fqn
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2, "fqn": "host1.us.oracle.com"}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated...", "fqn": "host1.us.oracle.com"}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1, "fqn": "host2.us.oracle.com"}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4, "fqn": "host2.us.oracle.com"}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5, "fqn": "host2.us.oracle.com"}
{"timestamp": "2019-01-03T00:06:59", "level":"INFO", "host":" host2", "message":"fs clean up started...", "fqn": "host2.us.oracle.com"}

Operadores Escalares

Os operadores escalares são aplicáveis a valores individuais.

As operações aritméticas são as seguintes:

  • +
  • -
  • *
  • /

Os operadores boolianos são os seguintes:

  • and
  • or

Operador unário:

  • -(<expr>)

Os operadores de comparação são os seguintes (apenas expressões numéricas):

  • <expr> > <expr>
  • <expr> >= <expr>
  • <expr> <= <expr>
  • <expr> < <expr>
  • <expr> = <expr>
  • <expr> != <expr>

Comparação de strings:

  • <expr> = <expr>

Funções:

  • not (<expr>)
  • contains_ci/contains_cs (<expr>, <expr>, (true | false))

    O último parâmetro diferencia maiúsculas de minúsculas.

  • rounddown (<expr>, '[0-9]+(d | h | m | s)')

    O último parâmetro é o intervalo de tempo em dias, horas, minutos ou segundos.

    time_format(datetime, <format>)

    Formatar uma hora para uma string

  • concat (<axpr>, <expr>)
  • upper (<expr>)
  • lower (<expr>)
  • substr (<expr>, [0-9]+ (, [0-9]+)?)

    O segundo argumento é o índice inicial, enquanto o terceiro argumento é opcional, ou seja, quantos caracteres forem necessários.

  • isnull (<expr>)
  • isnotnull (<expr>)

Operadores de Agregação

count

Calcula várias linhas no stream de log atual:

search "application"
  | count
>>
{"count": 6}
summarize

Agrupa o stream de log atual pelas colunas e o intervalo de tempo especificados e agrega usando expressões nomeadas. Se as colunas de agrupamento não forem especificadas, summarize se agregará em todo o fluxo.

search "application"
  | summarize count(impact) as impact by level, rounddown(datetime,  '1m') as timestamp

Colunas Especiais

logContent

logContent é uma coluna especial que representa o texto da mensagem original inteira. Por exemplo:

search "application"
   | where logContent = '*ERROR*' -- returns log lines with a value containing "ERROR"

Comentários

Há suporte para comentários de uma linha e diversas linhas, por exemplo:

search "application"
  | count -- this is a single line comment
/* this is a
   multi-line
   comment
*/

Identificadores

Identificadores são os nomes de todas as entidades disponíveis na consulta. Um identificador pode fazer referência a um campo no stream de log atual ou a um parâmetro definido no início da consulta. Os identificadores têm o seguinte formato:

name: \$?[a-zA-Z_][a-zA-Z_0-9]*

Por exemplo: level, app_severity, $level.

A forma entre aspas permite símbolos especiais nos nomes (exceto aspas duplas):

name: "[^"]+"

Por exemplo: "opc-request-id", "-level".

Todas as referências de parâmetro começam com um cifrão ($), por exemplo: $level.

Literais

Tipo Exemplos
string 'hello', 'world\'!'
padrão de curinga "acc-*"
número inteiro -1, 0, +200
flutuante 1.2, 0.0001, 1.2e10
array [1,2,3,4], []
intervalo 3h, 2m
anulável null

Funções

As funções escalares são as seguintes:

  • isnull(expr1)
  • concat(expr1, ...)

As funções de agregação são as seguintes:

  • sum(expr1)
  • avg(expr1)
  • min(expr1)
  • max(expr1)
  • count(): Conta um número de linhas.
  • count(expr): Conta um número de valores expr não nulos.
  • first(expr1)
  • last(expr1)

Parâmetros do sistema

Todos os parâmetros com a "consulta" prefex são reservados. Os seguintes parâmetros são suportados:

Nome Tipo Exemplo Descrição
query.from String com data e hora no formato ISO 8601. '2007-04-05T14:30' Especifica o horário inicial da janela de consulta.
query.to String com data e hora em ISO 8601. '2007-04-05T14:30+05:00' Especifica o horário final da janela de consulta.