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