Especificación del lenguaje de consulta de registro

Utilice componentes de sintaxis de consulta con búsquedas personalizadas del modo avanzado en la página Buscar de Registro.

Consulte también Consultas de búsqueda avanzada y Búsquedas guardadas para obtener más información.

Componentes de la consulta

El procesamiento del lenguaje de consulta de registro se basa en un modelo de flujo de datos. Cada consulta puede hacer referencia a uno o más logs y produce un juego de datos de tabla como resultado. El lenguaje de consulta proporciona varios operadores para buscar, filtrar y agregar logs estructurados y no estructurados.

Una consulta de registro incluye los siguientes componentes:

Flujos de log

Para comenzar la búsqueda, primero debe definir el juego de logs que desea buscar. Puede elegir buscar objetos de log, grupos de log o compartimentos específicos. Puede mezclar y hacer coincidir tantos logs como necesite. El ámbito de búsqueda se define mediante el siguiente patrón:
search <log_stream> (,? <log_stream>)*

El lenguaje de consulta recupera entradas de log del ámbito que proporcione y crea un flujo de log que puede filtrar, agregar y visualizar.

Flujo de log:

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

Ejemplos:

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

Campos

Todos los campos de los flujos de log son sensibles a mayúsculas/minúsculas. Aunque los logs reales solo tienen campos indexados en minúsculas, también puede crear nuevos campos en la consulta con mayúsculas y minúsculas:
search "..."
   | select event as EventName

Los campos tienen la notación JSON; por lo tanto, los caracteres especiales deben estar entre comillas.

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

Para el identificador:

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

Ejemplos:

  • type
  • data.message
  • data.request.URL
  • "tipo"
  • "datos"."mensaje"
  • "datos.mensaje" (no es lo mismo que "datos"."mensaje")
  • data."$event"
  • data."nombre"
  • data."ejemplo de comillas dobles ("") de escape "

Tipos de datos

El lenguaje de consulta soporta los siguientes tipos de datos clave. Estos son 8 bytes (largos y dobles).

Para obtener más información sobre la representación de los valores de los tipos correspondientes, consulte Caracteres literales.

  • Cadenas
  • Números (enteros, de punto flotante)
  • Matrices
  • Booleanos
  • Registros de hora
  • Intervalos

Expresiones de flujo

Todas las expresiones que producen un flujo son expresiones de flujo. Las expresiones de flujo se pueden formar con los siguientes operadores:

Expresiones de pleca

Una pleca (|) aplica un operador del lado izquierdo a una expresión de flujo situada del lado derecho. La expresión de pleca es una expresión de flujo.

El operador en el lado derecho de una pleca debe consumir solo un flujo (por ejemplo, operaciones de agregación, filtros).

El lado izquierdo se convierte en el "flujo actual" de la expresión del lado derecho, haciendo que todos los campos del flujo actual estén disponibles según unos nombres abreviados. Por ejemplo:
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

Se soportan los siguientes operadores al realizar consultas avanzadas:

Operadores tabulares

Un operador tabular crea o modifica un flujo de log filtrando o cambiando las entradas del log. Consulte también la notación de sintaxis de BNF. A continuación se indican los operadores tabulares:

where

Filtra el flujo de log actual mediante una expresión booleana.

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 es opcional:

search "application"
   | level = 'ERROR'

A continuación se incluyen algunas comparaciones de ejemplo con números y comparaciones de campos booleanos:

| data.statusCode = 200
| data.isPar

Puede realizar una búsqueda de texto completo especificando un filtro en todo el contenido del log. Una búsqueda de logContent devuelve cualquier línea de log en la que un valor coincida con su cadena. Esta funcionalidad soporta comodines. Por ejemplo:

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
Recupera solo un número especificado de filas del flujo de log actual ordenadas según una expresión.
<top> := top [0-9]+ by <expr>

Ejemplos:

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

Un número de filas debe ser un entero positivo constante y se debe proporcionar una expresión de ordenación.

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

Ordena el flujo de log actual por las columnas especificadas, en orden ascendente (por defecto) o descendente. El operador utiliza las palabras clave "DESC" y "ASC" para especificar el tipo de orden. La ordenación por defecto es asc.

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

Ejemplo:

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..."}

Se puede utilizar más de una columna para especificar el orden:

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

Procesa el flujo de log actual filtrando todos los duplicados por columnas especificadas. Si se especifica más de una columna, todas las columnas deben estar delimitadas por comas.

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

Ejemplos:

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 una serie de expresiones escalares con nombre al flujo de log actual. Consulte summarize para obtener una versión de agregación de select.

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

Ejemplo:

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

Amplía el flujo de log actual con una columna calculada.

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

Ejemplo:

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

Los operadores escalares se aplican a valores individuales.

Las operaciones aritméticas son las siguientes:

  • +
  • -
  • *
  • /

Los operadores booleanos son los siguientes:

  • and
  • or

Operador unitario:

  • -(<expr>)

Los operadores de comparación son los siguientes (solo expresiones numéricas):

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

Comparación de cadenas:

  • <expr> = <expr>

Funciones:

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

    El último parámetro es sensible a mayúsculas/minúsculas.

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

    El último parámetro es el intervalo de tiempo en días, horas, minutos o segundos.

    time_format(datetime, <format>)

    Formatear una hora a una cadena

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

    El segundo argumento es el índice de inicio, mientras que el tercer argumento es opcional, es decir, el número de caracteres que debe tener.

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

Operador de agregación

count

Calcula un número de filas en el flujo de log actual:

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

Agrupa el flujo de log actual por las columnas especificadas y el intervalo de tiempo, y agrega mediante expresiones con nombre. Si no se han especificado columnas de agrupación, summarize se agrega en todo el flujo.

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

Columnas especiales

logContent

logContent es una columna especial que representa el texto de todo el mensaje original. Por ejemplo:

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

Comentarios

Tanto los comentarios de una sola línea como de varias líneas están soportados; por ejemplo:

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

Identificadores

Los identificadores son los nombres de todas las entidades disponibles en la consulta. Un identificador puede hacer referencia a un campo del flujo de log actual o a un parámetro definido al principio de la consulta. Los identificadores tienen el siguiente formato:

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

Por ejemplo: level, app_severity, $level.

El formato entre comillas permite símbolos especiales en los nombres (excepto las comillas dobles):

name: "[^"]+"

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

Todas las referencias de parámetro comienzan con un signo de dólar ($), por ejemplo: $level.

Caracteres literales

Tipo Ejemplos
cadena 'hello', 'world\'!'
patrón de comodín "acc-*"
entero -1, 0, +200
flotante 1.2, 0.0001, 1.2e10
matriz [1, 2, 3, 4], []
intervalo 3h, 2m
anulable null

Funciones

Las funciones escalares son las siguientes:

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

Las funciones de agregación son las siguientes:

  • sum(expr1)
  • avg(expr1)
  • min(expr1)
  • max(expr1)
  • count(): cuenta un número de filas.
  • count(expr): cuenta una serie de valores expr no nulos.
  • first(expr1)
  • last(expr1)

Parámetros del sistema

Se reservan todos los parámetros con el prefex "query.". Los parámetros soportados son los siguientes:

Nombre Tipo Ejemplo Descripción
query.from Cadena con fecha y hora en formato ISO 8601. '2007-04-05T14:30' Especifica la hora de inicio de la ventana de consulta.
query.to Cadena con fecha y hora en ISO 8601. '2007-04-05T14:30+05:00' Especifica la hora de finalización de la ventana de consulta.