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
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
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).
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
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:
search
search "compartmentOCID/loggroup1/logname1" "compartmentOCID/loggroup2/logname2" "compartmentOCID/loggroup3/logname3"
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
<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 valoresexpr
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. |