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