Spécification du langage d'interrogation de journalisation

Utilisez des composants de syntaxe d'interrogation avec des recherches personnalisées en mode avancé dans la page Rechercher du service de journalisation.

Pour plus d'informations, voir Interrogations de recherche avancée et Recherches enregistrées.

Composants d'interrogation

Le traitement du langage d'interrogation de journalisation est basé sur un modèle de flux de données. Chaque interrogation peut référencer un ou plusieurs journaux et produit un jeu de données de table en conséquence. Le langage d'interrogation fournit plusieurs opérateurs pour effectuer des recherches, filtrer et agréger des journaux structurés et non structurés.

Une interrogation de journalisation comprend les composants suivants :

Flux de journal

Pour lancer votre recherche, vous devez d'abord définir le jeu de journaux dans lequel rechercher. Vous pouvez effectuer des recherches dans des objets de journal, des groupes de journaux ou des compartiments spécifiques. Vous pouvez mélanger et mettre en correspondance autant de journaux que nécessaire. La portée de la recherche est définie à l'aide du modèle suivant :
search <log_stream> (,? <log_stream>)*

Le langage d'interrogation extrait les entrées de journal à partir de la portée que vous fournissez et construit un flux de journal que vous pouvez filtrer, agréger et visualiser.

Flux de journal :

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

Exemples :

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

Champs

Tous les champs de flux de journal sont sensibles à la casse. Bien que les journaux réels aient des champs indexés en minuscules seulement, vous pouvez également créer de nouveaux champs à casse mixte dans l'interrogation :
search "..."
   | select event as EventName

Les champs sont en notation JSON. Par conséquent, les caractères spéciaux doivent être entre guillemets.

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

Pour un identificateur :

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

Exemples :

  • type
  • data.message
  • data.request.URL
  • "type"
  • "data"."message"
  • "data.message" (différent de "data"."message")
  • data."$event"
  • data."first name"
  • data."an example of escaped ("") double quotes"

Types de données

Les types de données clés suivants sont pris en charge par le langage d'interrogation. Ils sont de 8 octets (long et double).

Pour des informations détaillées sur la représentation des valeurs selon les types correspondants, voir Littéraux.

  • Chaînes
  • Nombres (entiers, à virgule flottante)
  • Tableaux
  • Valeurs booléennes
  • Horodatages
  • Intervalles

Expressions de flux

Toutes les expressions qui produisent un flux sont des expressions de flux. Les expressions de flux peuvent être formées à l'aide des opérateurs suivants :

Expressions de barre verticale

Une barre verticale (|) applique un opérateur sur le côté gauche à une expression de flux sur le côté droit. L'expression de barre verticale est une expression de flux.

L'opérateur sur le côté droit d'une barre verticale doit consommer un seul flux (par exemple, les opérations d'agrégation, les filtres).

Le côté gauche devient le "flux courant" de l'expression du côté droit, rendant tous les champs du flux courant disponibles en fonction des noms abrégés. Par exemple :
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}

Opérateurs

Les opérateurs suivants sont pris en charge lors de l'exécution d'interrogations avancées :

Opérateurs tabulaires

Un opérateur tabulaire crée ou modifie un flux de journal en filtrant ou en modifiant les entrées de journal. Consultez également la notation de syntaxe BNF (Backus-Naur). Les opérateurs tabulaires sont les suivants :

where

Filtre le flux de journal courant à l'aide d'une expression booléenne.

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 est facultatif :

search "application"
   | level = 'ERROR'

Voici quelques exemples de comparaison avec des champs numériques et booléens :

| data.statusCode = 200
| data.isPar

Vous pouvez effectuer une recherche en texte intégral en spécifiant un filtre sur l'ensemble du contenu du journal. Une recherche sur logContent retourne toute ligne de journal où une valeur correspond à une chaîne. Cette fonctionnalité prend en charge les caractères génériques. Par exemple :

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
Extrait uniquement un nombre spécifié de rangées du flux de journal courant, triées en fonction d'une expression.
<top> := top [0-9]+ by <expr>

Exemples :

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

Un nombre de rangées doit être une constante entière positive et une expression de tri doit être fournie.

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

Trie le flux de journal courant en fonction des colonnes spécifiées, dans l'ordre croissant (par défaut) ou décroissant. L'opérateur utilise les mots clés "DESC" et "ASC" pour spécifier l'ordre. L'ordre de tri par défaut est asc.

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

Exemple :

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

Plusieurs colonnes peuvent être utilisées pour indiquer l'ordre :

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

Traite le flux de journal courant en filtrant tous les doubles par colonnes spécifiées. Si plusieurs colonnes sont spécifiées, toutes les colonnes doivent être délimitées par des virgules.

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

Exemples :

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

Applique une série d'expressions scalaires nommées au flux de journal courant. Voir summarize pour une version d'agrégation de select.

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

Exemple :

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

Étend le flux de journal courant avec une colonne calculée.

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

Exemple :

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

Opérateurs scalaires

Les opérateurs scalaires sont applicables à des valeurs individuelles.

Les opérations arithmétiques sont les suivantes :

  • +
  • -
  • *
  • /

Les opérateurs booléens sont les suivants :

  • and
  • or

Opérateur unaire :

  • -(<expr>)

Les opérateurs de comparaison sont les suivants (expressions numériques uniquement) :

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

Comparaison de chaînes :

  • <expr> = <expr>

Fonctions :

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

    Le dernier paramètre est sensible à la casse.

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

    Le dernier paramètre est l'intervalle de temps en jours, heures, minutes ou secondes.

    time_format(datetime, <format>)

    Formater l'heure d'une chaîne

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

    Le deuxième argument est l'index de début, tandis que le troisième argument est facultatif, à savoir le nombre de caractères à prendre.

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

Opérateurs d'agrégation

count

Calcule un nombre de rangées dans le flux de journal courant :

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

Regroupe le flux de journal courant en fonction des colonnes et de l'intervalle de temps spécifiés, et l'agrège en utilisant des expressions nommées. Si aucune colonne de regroupement n'est spécifiée, summarize effectue l'agrégation sur l'ensemble du flux.

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

Colonnes spéciales

logContent

logContent est une colonne spéciale qui représente le texte de tout le message initial. Par exemple :

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

Commentaires

Les commentaires sur une seule ligne et sur plusieurs lignes sont pris en charge, par exemple :

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

Identificateurs

Les identificateurs sont les noms de toutes les entités disponibles dans l'interrogation. Un identificateur peut référencer un champ du flux de journal courant ou un paramètre défini au début de l'interrogation. Les identificateurs ont le format suivant :

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

Par exemple : level, app_severity, $level.

Le format avec guillemets autorise les symboles spéciaux dans les noms (à l'exception des guillemets doubles) :

name: "[^"]+"

Par exemple : "opc-request-id", "-level".

Toutes les références de paramètre commencent par le signe du dollar ($), par exemple : $level.

Littéraux

Type Exemples
chaîne 'hello', 'world\'!'
modèle de caractère générique "acc-*"
nombre entier -1, 0, +200
virgule flottante 1.2, 0.0001, 1.2e10
tableau [1,2,3,4], []
intervalle 3h, 2m
pouvant être nul null

Fonctions

Les fonctions scalaires sont les suivantes :

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

Les fonctions d'agrégation sont les suivantes :

  • sum(expr1)
  • avg(expr1)
  • min(expr1)
  • max(expr1)
  • count() : Compte un nombre de rangées.
  • count(expr) : Compte un nombre de valeurs expr non nulles.
  • first(expr1)
  • last(expr1)

Paramètres de système

Tous les paramètres ayant "query." comme attribut prefex sont réservés. Les paramètres suivants sont pris en charge :

Nom Type Exemple Description
query.from Chaîne avec la date et l'heure au format ISO 8601. '2007-04-05T14:30' Indique l'heure de début de la fenêtre d'interrogation.
query.to Chaîne avec la date et l'heure au format ISO 8601. '2007-04-05T14:30+05:00' Indique l'heure de fin de la fenêtre d'interrogation.