Spécification de langage de requête de journalisation

Utilisez des composants de syntaxe de requête avec des recherches personnalisées en mode avancé sur la page de recherche Logging.

Pour plus d'informations, voir également Requêtes de recherche avancée et Recherches enregistrées.

Composants de requête

Le traitement du langage de requête de journalisation est basé sur un modèle de flux de données. Chaque requête peut référencer des journaux et génère un ensemble de données de tableau. Le langage de requête fournit plusieurs opérateurs pour la recherche, le filtrage et l'agrégation des journaux structurés et non structurés.

Une requête de journalisation comprend les composants suivants :

Flux de journalisation

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

Le langage de requête extrait les entrées de journal de la portée que vous indiquez et construit un flux de journalisation que vous pouvez filtrer, agréger et visualiser.

Flux de journalisation :

<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 des flux de journalisation sont sensibles à la casse. Bien que les journaux réels aient uniquement des champs indexés en minuscules, vous pouvez également créer des champs dans la requête avec des majuscules et des minuscules :
search "..."
   | select event as EventName

Les champs suivant la notation JSON, les caractères spéciaux doivent être entre guillemets.

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

Pour les identificateurs :

<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."prénom"
  • data."exemple de guillemets ("") échappés"

Types de données

Les types de données clés suivants sont pris en charge par le langage de requête. Ces données, de types long et double, font 8 octets.

Pour plus d'informations sur la représentation des valeurs des types correspondants, reportez-vous à Littéraux.

  • Chaînes
  • Nombres (entier, à 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 avec barre verticale

Une barre verticale (|) applique un opérateur à gauche à une expression de flux à droite. L'expression avec barre verticale est une expression de flux.

L'opérateur situé à droite de la barre verticale ne doit utiliser qu'un seul flux (par exemple, opérations d'agrégation, filtres).

Le côté gauche devient le "flux en cours" de l'expression du côté droit. Tous les champs du flux en cours sont alors disponibles à l'aide de noms courts. 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 éléments suivants sont pris en charge lors de l'exécution de requêtes avancées :

Opérateurs tabulaires

Un opérateur tabulaire crée ou modifie un flux de journalisation en filtrant ou en modifiant les entrées de journal. Reportez-vous également à la notation de syntaxe BNF. Voici des exemples d'opérateurs tabulaires :

where

Filtre le flux de journalisation en cours à 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 comparaisons avec des nombres et des champs booléens :

| data.statusCode = 200
| data.isPar

Vous pouvez effectuer une recherche de texte intégral en appliquant un filtre sur l'ensemble du contenu du journal. Une recherche sur logContent renvoie toute ligne de journal où une valeur correspond à votre 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 donné de lignes du flux de journalisation en cours, 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)

Le nombre de lignes doit correspondre à un entier positif constant 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 journalisation en cours en fonction des colonnes indiquées, dans l'ordre croissant (par défaut) ou décroissant. L'opérateur utilise les mots-clés "DESC" et "ASC" pour indiquer 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 journalisation en cours en filtrant tous les doublons en fonction des colonnes indiquées. Si plusieurs colonnes sont indiquées, toutes 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 désignées au flux de journalisation en cours. Optez pour 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

Etend le flux de journalisation en cours 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 peuvent être appliqués à des valeurs individuelles.

Les opérations arithmétiques sont les suivantes :

  • +
  • -
  • *
  • /

Les opérateurs booléens sont les suivants :

  • and
  • or

Opérateur unitaire :

  • -(<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 correspond à l'intervalle de temps en jours, en heures, en minutes ou en secondes.

    time_format(datetime, <format>)

    Formater une heure dans une chaîne

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

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

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

Opérateurs d'agrégation

count

Calcule un nombre de lignes dans le flux de journalisation en cours :

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

Regroupe le flux de journalisation en cours en fonction des colonnes et de l'intervalle de temps indiqués, et effectue une agrégation à l'aide d'expressions désignées. Si aucune colonne de regroupement n'est indiquée, summarize est agrégé sur l'ensemble du flux.

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

Colonnes spéciales

logContent

logContent désigne une colonne spéciale qui représente le texte de l'intégralité du message d'origine. Par exemple :

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

Commentaires

Les commentaires à une seule ligne et à 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 la requête. Un identificateur peut référencer un champ du flux de journalisation en cours ou à un paramètre défini au début de la requête. Les identificateurs ont le format suivant :

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

Par exemple : level, app_severity, $level.

La forme entre guillemets permet de prendre en compte les symboles spéciaux dans les noms (à l'exception des guillemets) :

name: "[^"]+"

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

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

Littéraux

Type Exemples
chaîne 'hello', 'world\'!'
caractères génériques "acc-*"
nombre entier -1, 0, +200
virgule flottante 1.2, 0.0001, 1.2e10
tableau [1,2,3,4], []
intervalle 3h, 2m
peut être NULL 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() : calcule le nombre de lignes.
  • count(expr) : calcule le nombre de valeurs expr non NULL.
  • first(expr1)
  • last(expr1)

Paramètres système

Tous les paramètres qui commencent par le prefix "query." 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 de requête.
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 de requête.