Créer un analyseur
En créant un analyseur, vous définissez comment extraire les entrées d'un fichier journal et comment extraire les champs d'une entrée de journal.
-
Ouvrez le menu de navigation et cliquez sur Observabilité et gestion. Sous Logging Analytics, cliquez sur Administration. La page Aperçu de l'administration s'ouvre.
-
Les ressources d'administration sont répertoriées dans le volet de navigation de gauche sous Ressources. Cliquez sur Analyseurs.
- Dans la page Analyseurs, cliquez sur Créer.
- Dans les options, sélectionnez Type Expression rationnelle, Type JSON, Type XML ou Type délimité.
La page Créer un analyseur s'affiche.
Dans le cas d'un type d'expression rationnelle, la page Créer un analyseur s'ouvre en mode Guidé, par défaut. Continuez dans ce mode si vous voulez que Logging Analytics génère l'expression rationnelle pour analyser les journaux après avoir sélectionné les champs. Si vous voulez écrire une expression rationnelle pour l'analyse, passez au mode Avancé.
Vous pouvez également créer un analyseur en utilisant un analyseur défini par Oracle comme modèle. Sélectionnez un analyseur défini par Oracle dans la page Analyseurs, cliquez sur Dupliquer et modifiez les valeurs dans les champs selon vos besoins.
Oracle Logging Analytics fournit de nombreux analyseurs définis par Oracle pour les sources de journaux, notamment les journaux de vidage Java Hotspot, plusieurs systèmes tels que Linux, Siebel, PeopleSoft, etc., ainsi que pour les types d'entité Oracle Database, Oracle WebLogic Server et Oracle Enterprise Manager Cloud Control. Vous pouvez accéder à la liste complète des analyseurs et des sources de journaux pris en charge à partir de l'interface utilisateur d'Oracle Logging Analytics.
Pour effectuer d'autres actions sur l'analyseur, dans la page Analyseurs, sélectionnez le type de création de l'analyseur et affinez votre recherche en sélectionnant le type d'analyseur dans la section Filtres. Après avoir identifié l'analyseur, cliquez sur l'icône Actions dans la rangée de l'analyseur :
-
Voir les détails : La page des détails de l'analyseur s'affiche. Consultez les détails de l'analyseur et modifiez-le, si nécessaire.
-
Modifier : La boîte de dialogue Modifier l'analyseur s'affiche. Vous pouvez modifier les propriétés de l'analyseur ici.
-
Dupliquer : Cliquez sur cette option si vous voulez créer un double de l'analyseur existant, après quoi vous pouvez modifier le double pour le personnaliser.
- Définition d'exportation : Si vous utilisez Oracle Logging Analytics dans plusieurs régions, vous pouvez exporter et réimporter le contenu de la configuration de l'analyseur. Vous pouvez également l'utiliser pour stocker une copie de vos définitions en dehors d'Oracle Logging Analytics. Voir Importer et exporter le contenu de configuration.
-
Supprimer : Vous devrez peut-être supprimer certains de vos analyseurs anciens ou inutilisés. Pour supprimer l'analyseur, confirmez la suppression dans la boîte de dialogue Supprimer l'entité. Vous ne pouvez supprimer un analyseur que s'il n'a aucune source dépendante.
Rubriques :
Conseil d'accessibilité : Pour sélectionner le contenu à extraire des champs des journaux à l'aide du clavier, utilisez les touches ALT+arrow.
Créer un analyseur de type Expression rationnelle
La page Créer un analyseur s'ouvre en mode Guidé, par défaut. Continuez dans ce mode si vous voulez que Logging Analytics génère l'expression rationnelle pour analyser les journaux après avoir sélectionné les champs. Pour le mode guidé, voir Vidéo : Utilisation du générateur d'analyseurs RegEx. Si vous voulez écrire une expression rationnelle pour l'analyse, passez au mode Avancé et continuez avec les étapes suivantes :
-
Dans le champ Nom, entrez le nom de l'analyseur. Par exemple, entrez
Custom Audit Logs
. -
Facultativement, fournissez une description appropriée pour l'analyseur pour faciliter l'identification.
-
Dans le champ Contenu de l'exemple de journal, collez le contenu d'un fichier journal à analyser, par exemple :
Jun 20 2020 15:19:29 hostabc rpc.gssd: ERROR: can't open clnt5aa9: No such file or directory Jul 29 2020 11:26:28 hostabc kernel: FS-Cache: Loaded Jul 29 2020 11:26:28 hostxyz kernel: FS-Cache: Netfs 'nfs' registered for caching Aug 8 2020 03:20:01 slc08uvu rsyslogd-2068: could not load module '/lib64/rsyslog/lmnsd_gtls.so', rsyslog error -2078 [try http://www.rsyslog.com/e/2068 ] Aug 8 2020 03:20:36 0064:ff9b:0000:0000:0000:0000:1234:5678 rsyslogd-2066: could not load module '/lib64/rsyslog/lmnsd_gtls.so', dlopen: /lib64/rsyslog/lmnsd_gtls.so: cannot open shared object file: Too many open files [try http://www.rsyslog.com/e/2066 ] Sep 13 2020 03:36:06 hostnam sendmail: uAD3a6o5009542: from=root, size=263, class=0, nrcpts=1, msgid=<201611130336.uAD3a6o5009542@hostname.example.com>, relay=root@localhost Sep 13 2020 03:36:06 hostnam sendmail: uAD3a6o5009542: to=root, ctladdr=root (0/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30263, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (uAD3a6KW009543 Message accepted for delivery) Sep 20 2020 08:11:03 hostnam sendmail: STARTTLS=client, relay=userv0022.example.com, version=TLSv1/SSLv3, verify=FAIL, cipher=DHE-RSA-AES256-GCM-SHA384, bits=256/256]]>
Il s'agit d'une entrée de journal multiligne car les entrées 4 et 5 couvrent plusieurs lignes.
-
Dans le champ Analyser l'expression rationnelle, entrez l'expression rationnelle pour analyser les champs. Chaque paire de parenthèses indique la clause d'expression rationnelle à extraire pour un seul champ.
L'expression Parse est unique pour chaque type de journal et dépend du format des entrées de journal réelles. Dans cet exemple, entrez :
(\w+)\s+(\d+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+([^\s]+)\s+([^:]+):\s+(.*)
Note
-
N'insérez pas d'espaces avant ou après le contenu.
-
L'expression rationnelle doit correspondre au texte complet de l'enregistrement de journal.
-
Si vous avez inclus des caractères masqués dans l'expression Parse, l'interface Créer un analyseur émet un message d'avertissement :
Parser expression has some hidden control characters.
Pour désactiver cette réponse par défaut, désélectionnez la case Afficher les caractères de contrôle masqués lorsque le message d'erreur s'affiche.
Pour en savoir plus sur la création d'expressions Parse, voir Exemples d'expressions Parse.
-
-
Sélectionnez l'étendue de l'enregistrement de journal appropriée.
L'entrée de journal peut comporter une ou plusieurs lignes. Si vous avez choisi plusieurs lignes, entrez l'expression de début d'enregistrement de journal.
Vous devez définir l'expression rationnelle comme étant la règle minimale nécessaire pour identifier avec succès le début d'une nouvelle entrée de journal. Dans l'exemple, l'expression Start peut être :(\w+)\s+(\d+)\s+(\d+)\s+
Cela indique que le début d'une nouvelle entrée de journal a lieu chaque fois qu'une nouvelle ligne commence par le texte correspondant à cette expression de début d'entrée.
Facultativement, vous pouvez également entrer l'expression End. Utilisez une expression End pour indiquer la fin de l'enregistrement de journal. Lorsqu'un enregistrement de journal est écrit dans le fichier sur une longue période et que vous souhaitez vous assurer que l'intégralité de l'entrée de journal est collectée, vous utilisez l'expression rationnelle End. L'agent attend jusqu'à ce que le modèle de l'expression rationnelle de fin soit mis en correspondance pour collecter l'enregistrement de journal. Pour l'expression End, les mêmes règles de format s'appliquent que pour l'expression Entry Start.
Cochez la case Gérer la totalité du fichier comme une entrée de journal unique, si nécessaire. Cette option vous permet d'analyser et de stocker un fichier journal entier sous la forme d'une entrée de journal unique. Cela s'avère particulièrement utile lors de l'analyse de sources de journaux telles que les journaux de vidage Java Hotspot, la liste RPM des journaux d'ensemble, etc. Si l'entrée de journal contient beaucoup de texte que vous voulez rechercher, vous pouvez envisager de cocher la case Activer la recherche en texte brut sur ce contenu. Cette option vous permet de rechercher les enregistrements de journal dans le champ Texte brut. Lorsque cette option est activée, vous pouvez afficher le contenu de journal initial avec le texte brut.
-
Dans l'onglet Champs, sélectionnez le champ pertinent pour stocker chaque valeur saisie à partir de l'expression rationnelle.
Pour créer un champ, cliquez sur l'icône
. La boîte de dialogue Créer un champ défini par l'utilisateur s'ouvre. Entrez les valeurs pour Nom, Type de données, Description et cochez la case Champ multivaleur selon le cas pour vos journaux. Pour plus d'informations sur les valeurs à entrer, voir Créer un champ. Pour supprimer le champ sélectionné dans la rangée, cliquez sur l'icône
.
Pour chaque valeur saisie, sélectionnez le champ dans lequel stocker les données. Le premier champ saisi dans l'exemple peut être entré comme suit :
-
Nom du champ : Mois (nom abrégé)
-
Type de données du champ : STRING
-
Description du champ : Composant Mois de l'heure d'entrée du journal sous forme de nom abrégé, par exemple Jan
-
Expression de champ :
(\w{3})
Dans l'exemple de journal ci-dessus, vous mappez les champs dans l'ordre suivant :
- Mois (nom abrégé)
- Jour
- Année (4 chiffres)
- Nom de l'hôte (Serveur)
- Service
- Message
-
-
Dans l'onglet Fonctions, cliquez sur Ajouter une fonction pour ajouter éventuellement une fonction pour prétraiter les entrées de journal. Voir Prétraiter les entrées de journal.
-
Cliquez sur l'onglet Test de l'analyseur pour voir comment l'analyseur nouvellement créé extrait les valeurs du contenu de journal.
Vous pouvez voir les entrées de journal à partir du contenu fourni précédemment. Utilisez cette option pour déterminer si l'analyseur que vous avez défini fonctionne correctement.
Si l'expression rationnelle échoue pour une entrée de journal, le statut de la mise en correspondance indique en vert la partie de l'expression qui a fonctionné et en rouge celle qui a échoué. Vous pouvez ainsi identifier la partie de l'expression rationnelle à corriger.
Vous pouvez afficher la liste des événements qui ont échoué au test de l'analyseur et les détails de l'échec. Vous pouvez également afficher le nombre d'étapes, qui peut donner une idée du coût de l'expression rationnelle. Idéalement, cette valeur doit être aussi faible que possible. Tout coût inférieur à 1 000 peut être acceptable, mais parfois une expression rationnelle plus coûteuse est nécessaire. Si l'expression rationnelle nécessite trop d'étapes, elle peut entraîner une utilisation plus importante d'UC sur l'hôte de l'agent et un traitement plus lent des journaux. Cela retardera la disponibilité des entrées de journal dans l'explorateur de journaux. Dans les cas extrêmes où l'expression rationnelle est trop coûteuse, nous ignorons l'analyse de l'entrée de journal et des autres entrées collectées au cours de la même période.
Cliquez sur Enregistrer pour enregistrer le nouvel analyseur que vous venez de créer.
Pour abandonner la création de l'analyseur, cliquez sur Annuler. Lorsque vous cliquez sur Annuler, vous perdez toute progression déjà effectuée lors de la création de l'analyseur de type Expression rationnelle.
Analyse de l'heure et de la date à l'aide de la macro TIMEDATE
-
Oracle Logging Analytics vous permet également d'analyser l'heure et la date disponibles dans les fichiers journaux à l'aide de la macro
TIMEDATE
.Par conséquent, pour les journaux qui utilisent le format d'expression
TIMEDATE
, l'expression Parse précédente doit être écrite comme suit :{TIMEDATE}\s+([^\s]+)\s+([^:]+):\s+(.*)
Dans ce cas, l'expression Entry Start est
{TIMEDATE}\s+
. -
Si aucune année n'est affectée à certaines entrées de journal, Oracle Logging Analytics tente d'identifier l'année en fonction des informations disponibles telles que le fuseau horaire de l'hôte, l'heure de la dernière modification du fichier, etc. Le chargement sur demande permet à l'utilisateur de fournir des informations pour résoudre des dates ambiguës. Vous pouvez également utiliser le paramètre de remplacement de fuseau horaire lorsque vous ingérez les journaux à l'aide du chargement sur demande ou de l'agent de gestion. Voir Charger les journaux sur demande et Configurer la collecte continue des journaux à partir de vos hôtes.
-
Si l'heure et la date ne sont pas spécifiées dans l'analyseur pour un fichier journal qui est analysé comme un seul enregistrement de journal, l'heure de la dernière modification du fichier journal est prise en compte lors de la collecte des journaux à l'aide de l'agent de gestion. Si, pendant la collecte, l'heure et la date d'une entrée de journal ne peuvent pas être établies, les entrées de journal seront stockées avec la date et l'heure auxquelles les journaux ont été ingérés dans Oracle Logging Analytics.
Créer un analyseur de type JSON
Si chacune de vos entrées de journal ne contient pas les données de journal contextuelles / d'en-tête, vous pouvez enrichir les entrées de journal avec les données de journal d'en-tête pertinentes. Vous pouvez prétraiter les entrées de journal et enrichir le contenu avec des informations d'en-tête en spécifiant une fonction de détail d'en-tête en suivant les étapes suivantes :
-
Créez d'abord un analyseur de contenu d'en-tête en fournissant l'exemple de contenu de journal à l'aide duquel le chemin JSON peut être identifié pour saisir les informations d'en-tête.
-
Définissez un deuxième analyseur pour analyser le corps restant de l'entrée de journal.
-
Dans l'analyseur de corps, ajoutez une instance de fonction Détails d'en-tête et sélectionnez l'analyseur d'en-tête que vous avez défini à l'étape 1.
-
Ajoutez l'analyseur de corps que vous avez défini à l'étape 2 à une source de journaux, puis associez la source de journaux à une entité pour démarrer la collecte de journaux.
Voir la rubrique supplémentaire : Gestion de plusieurs formes JSON dans un seul analyseur JSON
Pour créer un analyseur JSON :
-
Dans le champ Analyseur, entrez le nom de l'analyseur. Par exemple, entrez
Custom API Log
. -
Sélectionnez le type d'analyseur JSON.
-
Facultativement, fournissez une description appropriée pour l'analyseur pour faciliter l'identification.
-
Dans le champ Contenu de l'exemple de journal, collez le contenu d'un fichier journal à analyser, par exemple :
{ "name": "helloapi", "hostname": "banana.local", "pid": 40442, "level": 30, "req": { "method": "GET", "url": "/hello?name=paul", "headers": { "user-agent": "curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1/2/3", "host": "0.0.0.0:8080", "accept": "*/*" }, "remoteAddress": "127.0.0.1", "remotePort": 59834 }, "msg": "start", "time": "2012-03-28T17:39:44.880Z", "v": 0 }
Selon le contenu de l'exemple de journal, les champs sont sélectionnés et affichés dans l'onglet Champs, comme dans l'exemple suivant :
- Dans l'onglet Champs, pour le chemin JSON spécifique, sélectionnez le nom du champ parmi les champs définis disponibles.
Pour créer un champ, cliquez sur l'icône
. La boîte de dialogue Créer un champ défini par l'utilisateur s'ouvre. Entrez les valeurs pour Nom, Type de données, Description et cochez la case Champ multivaleur selon le cas pour vos journaux. Pour plus d'informations sur les valeurs à entrer, voir Créer un champ. Pour supprimer le champ sélectionné dans la rangée, cliquez sur l'icône
.
Le chemin racine par défaut sélectionné est
$
. Pour modifier le chemin d'accès racine JSON, développez la section Options avancées et sélectionnez Chemin JSON de l'entrée de journal dans le menu. - Dans l'onglet Fonctions, cliquez sur Ajouter une fonction pour ajouter éventuellement une fonction pour prétraiter les entrées de journal avec la fonction d'analyseur d'en-tête. Voir Prétraiter les entrées de journal.
- Une fois les champs sélectionnés, allez à l'onglet Test de l'analyseur pour voir le statut de la mise en correspondance et les champs sélectionnés à partir du contenu de l'exemple de journal.
- Cliquez sur Enregistrer pour enregistrer le nouvel analyseur que vous venez de créer.
Pour abandonner la création d'un analyseur de type JSON et passer à la création d'un analyseur de type Expression rationnelle, sous Type, sélectionnez Expression rationnelle.
Traitement de plusieurs formes JSON dans un seul analyseur JSON
S'il existe plusieurs entrées de journal JSON avec le noeud racine $
pour la même source, ajoutez tous les exemples de journaux JSON au exemple de contenu d'un analyseur et mappez l'union des champs contenus dans tous les échantillons.
Par exemple, vous pouvez avoir un analyseur JSON et une source utilisant cet analyseur. Considérez que ce journal peut avoir deux formes. Placez les deux exemples d'entrées de journal (formes) dans le champ Exemple de contenu comme suit :
{ "key_A":value1, "key_B":value2, "key_C":value3, "key_E":value4, "key_F",value5 } { "key_A":value6, "key_B":value7, "key_D":value8, "key_G":value9, "key_H":value10 }
Ensuite, dans la liste des champs de l'analyseur, vous pouvez voir les clés key_A
, key_B
, key_C
, key_D
, key_E
, key_F
, key_G
et key_H
à mapper.
Vous pouvez mapper ces clés à des champs comme ci-dessous :
Touche | Champ |
---|---|
key_A |
Heure |
key_B |
Adresse IP de l'hôte (client) |
key_C |
Message |
key_D |
Message |
key_E |
Gravité |
key_F |
Nom d'utilisateur |
key_G |
Composant |
key_H |
Service |
Dans l'exemple ci-dessus, les clés JSON key_C
et key_D
apparaissent dans des journaux différents. Elles sont considérées comme mutuellement exclusives. En général, key_C
et key_D
n'apparaissent pas ensemble dans une forme de journal. Dans ce cas, les deux peuvent être mappés à un seul champ Message. Quelle que soit la clé qui correspond, est stocké dans le champ Message.
Si key_C
et key_D
ne s'excluent pas mutuellement et que dans une troisième forme d'entrée de journal, key_C
et key_D
apparaissent ensemble, le premier correspondant est stocké dans le champ Message.
Créer un analyseur de type XML
-
Dans le champ Analyseur, entrez le nom de l'analyseur. Par exemple, entrez
Custom Database Audit Log
. -
Sélectionnez le type d'analyseur XML.
-
Facultativement, fournissez une description appropriée pour l'analyseur pour faciliter l'identification.
-
Dans le champ Contenu du journal de l'exemple, collez le contenu d'un fichier journal à analyser, par exemple ExampleA :
<AuditRecord><Audit_Type>1</Audit_Type><Session_ld>201073</Session_ld><Statementid>13</Statementid><Entryld>6</Entryld> <Extended_Timestamp>2016-09-09T01:26:07.832814Z</Extended_Timestamp><DB_User>SYSTEM</DB_User><OS_User>UserA</OS_User><Userhost>host1</Userhost> <OS_Process>25839</OS_Process><Terminal>pts/4</Terminal><Instance_Number>0</Instance_Number><Object_Schema>HR</Object_Schema> <Object_Name>EMPLOYEES</Object_Name><Action>17</Action> <Returncode>0</Returncode><Sen>§703187</Sen><AuthPrivileges>--------¥-----</AuthPrivileges> <Grantee>SUMON</Grantee> <Priv_Used>244</Priv_Used><DBID>2791516383</DBID><Sql_Text>GRANT SELECT ON hr.employees TO sumon</Sql_Text></AuditRecord>
En fonction du contenu de l'exemple de journal, Oracle Logging Analytics identifie automatiquement la liste des éléments XML qui représentent les enregistrements de journal.
-
Facultativement, activez la case à cocher Ignorer l'espace de noms pour ignorer l'espace de noms dans le chemin XML.
-
Facultativement, activez la case à cocher Activer la sensibilisation positionnelle pour détecter plusieurs valeurs d'un élément sous un chemin XML, comme dans le cas d'un tableau d'éléments. Par exemple, pour l'exemple de contenu de journal suivant, ExampleB :
<ListOfTrackingFields> <TrackingField> <Name>NameA</Name> </TrackingField> <TrackingField> <Name>NameB</Name> </TrackingField> <TrackingField> <Name>NameC</Name> </TrackingField> <TrackingField> <Name>NameD</Name> </TrackingField> <TrackingField> <Name>NameE</Name> </TrackingField> </ListOfTrackingFields>
Si la sensibilisation positionnelle n'est pas activée, vous seriez limité au chemin XML
/ListOfTrackingFields/TrackingField/Name
, qui détecterait uniquement la première valeur deName
. Si vous activez la sensibilisation positionnelle, les 5 valeurs suivantes deName
sous l'élémentTrackingField
sont détectées :NameA
,NameB
,NameC
,NameD
,NameE
, si tous les chemins XML correspondants sont configurés. -
Dans le menu Chemin XML de l'entrée de journal, sélectionnez l'élément XML approprié pour les enregistrements de journal qui vous intéressent. Pour le contenu de l'exemple de journal ci-dessus ExampleA, sélectionnez
/AuditRecord
.En fonction de la sélection du chemin XML, les champs sont sélectionnés et affichés dans l'onglet Champs. Dans le contenu de l'exemple de journal ci-dessus, les éléments mis en évidence sont admissibles pour les champs. Pour l'exemple de chemin XML
/AuditRecord
, le chemin XML du champ serait/AuditRecord/<highlighted_element>
, par exemple/AuditRecord/Audit_Type
. -
Dans l'onglet Champs, pour le chemin XML spécifique, sélectionnez le nom du champ parmi les champs définis disponibles.
Pour créer un champ, cliquez sur l'icône
. La boîte de dialogue Créer un champ défini par l'utilisateur s'ouvre. Entrez les valeurs pour Nom, Type de données, Description et cochez la case Champ multivaleur selon le cas pour vos journaux. Pour plus d'informations sur les valeurs à entrer, voir Créer un champ. Pour supprimer le champ sélectionné dans la rangée, cliquez sur l'icône
.
-
Une fois les champs sélectionnés, allez à l'onglet Test de l'analyseur pour voir le statut de la mise en correspondance.
-
Cliquez sur Enregistrer pour enregistrer le nouvel analyseur que vous venez de créer.
Pour abandonner la création d'un analyseur de type XML et passer à la création d'un analyseur de type Expression rationnelle, sous Type, sélectionnez Expression rationnelle.
Créer un analyseur de type délimité
-
Entrez le nom de l'analyseur. Par exemple, entrez
Comma Separated Custom App Log
. -
Facultativement, fournissez une description appropriée pour l'analyseur pour faciliter l'identification.
-
Sélectionnez le type d'analyseur Délimité.
-
Sous Délimiteur, sélectionnez le type de délimiteur utilisé dans les journaux pour séparer les champs, par exemple, virgule, point-virgule, espace ou onglet. Si elle est différente des options listées, sélectionnez Autre et spécifiez le caractère de délimiteur dans l'espace fourni.
Considérons l'exemple de contenu de journal suivant :
helloapi,"host,local", 65427, 29, start, 2021-08-28T17:39:44.880Z
Dans l'exemple ci-dessus, la virgule (
,
) est le délimiteur.Assurez-vous que le caractère de délimiteur que vous spécifiez est différent du qualificateur que vous sélectionnez ensuite.
-
Facultativement, sélectionnez le attribut qui est utilisé pour encapsuler le texte d'un champ dans vos journaux. Sélectionnez Devis double ou Devis unique.
Le qualificatif de texte est utilisé lorsque les délimiteurs sont contenus dans les données du champ. Prenons un scénario où field1 a la valeur
host,local
qui contient un caractère délimiteur (,) et un qualificatif de texte n'est pas utilisé. Ensuite, les données qui se produisent après le délimiteur (local
) seront considérées comme la valeur du champ suivant.Dans l'exemple de contenu du journal de l'étape précédente, la guillemet double (
"
) est le qualificatif.Note
Pour les valeurs des champs de la chaîne de type de données, le caractère d'espace avant et après le qualificatif sera également considéré comme faisant partie de la chaîne. Assurez-vous que le qualificatif est positionné juste à côté du délimiteur de sorte que la valeur de chaîne corresponde. Par exemple, dans,"host,local",
, le caractère d'espace après le premier délimiteur est supprimé. En outre, le caractère d'espace avant le dernier délimiteur est supprimé. Par conséquent, la valeur en vigueur du champ de chaîne correspondant esthost,local
, comme le montre le résultat du test de l'analyseur ultérieurement. -
Facultativement, sous En-tête, collez la ligne d'en-tête de votre journal qui peut ensuite être mappée à la colonne d'en-tête dans l'onglet Champs. Par exemple :
name, hostname, pid, level, msg, time
Lorsque vous spécifiez un en-tête, toutes les lignes de journal des journaux réels qui correspondent exactement à l'en-tête sont filtrées.
-
Dans le champ Contenu de l'exemple de journal, collez le contenu d'un fichier journal à analyser, par exemple :
helloapi,"host,local", 65427, 29, start, 2021-08-28T17:39:44.880Z
Selon le contenu de l'exemple de journal, les champs sont sélectionnés et affichés dans l'onglet Champs, comme dans l'exemple suivant :
- Dans l'onglet Champs, pour la colonne d'en-tête, sélectionnez le nom du champ parmi les champs définis disponibles. Cependant, vous pouvez mapper de manière sélective uniquement vos colonnes d'en-tête préférées, et il n'est pas nécessaire de mapper un champ pour chaque colonne d'en-tête.
Pour créer un champ, cliquez sur l'icône
. La boîte de dialogue Créer un champ défini par l'utilisateur s'ouvre. Entrez les valeurs pour Nom, Type de données, Description et cochez la case Champ multivaleur selon le cas pour vos journaux. Pour plus d'informations sur les valeurs à entrer, voir Créer un champ. Pour supprimer le champ sélectionné dans la rangée, cliquez sur l'icône
.
- Une fois les champs sélectionnés, allez à l'onglet Test de l'analyseur pour voir le statut de la mise en correspondance et les champs sélectionnés à partir du contenu de l'exemple de journal.
- Cliquez sur Créer un analyseur pour enregistrer le nouvel analyseur que vous venez de créer.
Pour abandonner la création d'un analyseur de type délimité et passer à la création d'un autre type d'analyseur, sélectionnez-le sous Type.
Mapper le champ de base à un analyseur
Si le contenu du journal initial est encapsulé avec des informations supplémentaires, vous pouvez mapper le champ de base qui contient le contenu du journal initial à un analyseur et extraire les champs de cet enregistrement de journal initial.
Considérons que votre contenu de journal original est comme indiqué ci-dessous :
####<Feb 01, 2021 10:28:27 AM PST> <Info> <Diagnostics> <soaapps.example.com> <excstg_soa> <[ACTIVE] ExecuteThread: '34' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <kernel_version> <123456> <[severity-value:64] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <BEA-320145> <Size based data retirement operation completed on archive HarvestedDataArchive. Retired 9,720 records in 11,242 ms.>
Lorsque le même contenu de journal est envoyé pour la première fois au service de journalisation pour OCI, puis au moyen du centre de connecteurs envoyé à Oracle Logging Analytics, un encapsuleur JSON est ajouté au contenu de journal initial. Par exemple :
{
"data": {
"Labels": "LogPath:/u01/APPLTOP/instance/wlslogs/FADomain/servers/ServiceServer_1/logs/ServiceServer_1.log;ServiceName:Host;ServiceType:Oracle_Host;LogSet:TEST_POD;HostName:examplehost.oraclecloud.com;IP:192.0.2.1;WLS:NA;Domain:NA;AppName:myApp;Customer:CompanyA, (U.S.) Corp;CustomerType:NonHypercare;PODType:TEST;PODSize:S0;DC:CDC;Version:11.13.20.10.0;",
"action": "ACTION",
"msg": "####<Feb 01, 2021 10:28:27 AM PST> <Info> <Diagnostics> <soaapps.example.com> <excstg_soa> <[ACTIVE] ExecuteThread: '34' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <kernel_version> <123456> <[severity-value:64] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <BEA-320145> <Size based data retirement operation completed on archive HarvestedDataArchive. Retired 9,720 records in 11,242 ms.>"
},
"id": "123123123",
"oracle": {
"compartmentid": "ocid1.compartment.oc1..aaaaaaaauniqueID",
"ingestedtime": "2021-02-01T18:32:49.204Z",
"loggroupid": "ocid1.loggroup.oc1.iad.amaaaaaauniqueID",
"logid": "ocid1.log.oc1.iad.amaaaaaayuniqueID",
"tenantid": "ocid1.tenancy.oc1..aaaaaaaaetuniqueID"
},
"source": "FA-APPS",
"specversion": "1.0",
"time": "2021-02-01T11:48:43.091Z",
"type": "FA Unified Apps Logs"
}
Dans l'exemple ci-dessus, le contenu du journal initial est présent dans le champ de base $.data.msg
.
Notez que dans l'exemple présenté, le contenu du journal comporte un encapsuleur JSON. Toutefois, vous pouvez suivre ces étapes même si le contenu et les wrappers du journal initial sont dans n'importe quel format d'analyseur pris en charge et que les journaux sont ingérés selon n'importe quelle méthode prise en charge.
Pour extraire les champs du contenu du journal initial, procédez comme suit :
-
En fonction du type de contenu de journal initial, identifiez ou créez un analyseur pour extraire les champs pertinents du contenu de journal initial. Voir Créer un analyseur.
Cet analyseur sera utilisé en tant qu'analyseur mappé dans l'analyseur d'encapsuleur que vous créerez ensuite.
-
En fonction du type de contenu d'encapsuleur, créez l'analyseur en suivant les étapes sous Créer un analyseur.
Cet analyseur sera appelé analyseur wrapper dans les étapes suivantes.
-
Pour l'analyseur d'encapsuleur, indiquez un exemple de contenu de journal contenant un encapsuleur sur le contenu de journal initial.
Dans le cas de l'analyseur JSON, le chemin racine par défaut sélectionné est
$
. Pour modifier le chemin d'accès racine JSON, développez la section Options avancées et sélectionnez Chemin JSON de l'entrée de journal dans le menu. -
Dans l'onglet Champs, correspondant au champ de base contenant votre contenu de journal initial, cliquez sur le menu Actions
et sélectionnez Mapper les champs à l'aide d'un analyseur. La boîte de dialogue dans laquelle vous pouvez sélectionner l'analyseur s'ouvre.
Dans l'exemple ci-dessus, la rangée pour laquelle un analyseur mappé doit être ajouté est
$.data.msg
.Dans un analyseur d'encapsuleur, vous ne pouvez mapper qu'un seul champ de base à un analyseur mappé.
-
Dans la boîte de dialogue Mapper les champs au moyen d'un analyseur, sélectionnez l'analyseur à l'aide duquel les champs du champ de base doivent être extraits.
Facultativement, sélectionnez l'une des actions
Base64 decode and unzip
ouBase64 decode
à effectuer sur le champ :- Base64 décoder et décompresser : Sélectionnez cette option si le champ de base est un fichier zip encodé en Base64. Le champ de base est ensuite décodé et décompressé avant l'application de l'analyseur mappé. Comme le champ de base est un fichier zip encodé, l'application de l'analyseur mappé entraîne l'identification d'un ou de plusieurs enregistrements de journal. Ces enregistrements de journal sont affichés sous la forme Contenu du journal initial dans l'explorateur de journaux. Toutefois, le contenu du journal du wrapper n'est pas affiché. Si l'analyseur d'encapsuleur contient des mappages de champ, ces champs sont également affichés.
Cette action ne peut être effectuée que sur les journaux collectés à l'aide de l'agent de gestion.
- Base64 decode : Sélectionnez cette option si le champ de base est Base64 encodé dans le contenu du journal initial. Le champ de base est décodé avant l'application de l'analyseur mappé. De plus,
- Utilisez l'option Enregistrer dans le champ pour enregistrer la chaîne décodée dans un champ.
- Si vous voulez enregistrer la valeur du champ de base décodée en tant que Contenu du journal initial afin qu'elle soit affichée en tant qu'enregistrement de journal dans l'explorateur de journaux, sélectionnez l'option Remplacer le contenu du journal initial. Si cette option est sélectionnée, la valeur du champ de base décodée est enregistrée dans le champ Contenu du journal initial et le contenu du journal de l'encapsuleur est enregistré dans le champ Texte brut.
Cliquez sur Mapper les champs. L'onglet Champs montre maintenant que le champ de base est mappé à l'analyseur mappé sélectionné et à la liste des champs extraits.
Il est possible qu'un analyseur mappé soit inclus dans l'analyseur mappé que vous sélectionnez. Oracle Logging Analytics prend en charge deux niveaux d'analyseurs mappés imbriqués, par exemple, Wrapper-parser contient mapped-parser-1 contient mapped-parser-2.
- Base64 décoder et décompresser : Sélectionnez cette option si le champ de base est un fichier zip encodé en Base64. Le champ de base est ensuite décodé et décompressé avant l'application de l'analyseur mappé. Comme le champ de base est un fichier zip encodé, l'application de l'analyseur mappé entraîne l'identification d'un ou de plusieurs enregistrements de journal. Ces enregistrements de journal sont affichés sous la forme Contenu du journal initial dans l'explorateur de journaux. Toutefois, le contenu du journal du wrapper n'est pas affiché. Si l'analyseur d'encapsuleur contient des mappages de champ, ces champs sont également affichés.
-
Une fois les autres champs sélectionnés, dans l'onglet Test de l'analyseur, exécutez le test de l'analyseur pour vérifier que le statut de correspondance et les champs sélectionnés à partir du contenu de l'exemple de journal.
Prétraiter les entrées de journal
Oracle Logging Analytics fournit les fonctions suivantes qui vous permettent de prétraiter les entrées de journal et d'enrichir les entrées de journal résultantes :
Pour prétraiter les entrées de journal lors de la création d'un analyseur, cliquez sur l'onglet Fonctions, puis sur le bouton Ajouter une fonction.
Dans la boîte de dialogue Ajouter une fonction qui s'affiche, entrez le nom de la fonction, sélectionnez la fonction requise et indiquez les valeurs de champ appropriées.
Pour tester le résultat de l'application de la fonction sur le contenu de l'exemple de journal, cliquez sur Tester. Un résultat comparatif est affiché pour vous aider à déterminer l'exactitude des valeurs de champ.
Fonction Détails d'en-tête
Cette fonction vous permet d'enrichir les entrées de journal avec les champs de l'en-tête des fichiers journaux. Cette fonction est particulièrement utile pour les journaux qui contiennent un bloc de corps en tant qu'en-tête, puis des entrées dans le corps.
Cette fonction enrichit chaque entrée de corps de journal avec les champs de l'entrée de journal d'en-tête. Les fichiers de suivi de base de données sont l'un des exemples de tels journaux.
Pour saisir l'en-tête et les champs correspondants pour enrichir les entrées de journal de corps temporelles, au moment de la création de l'analyseur, sélectionnez l'analyseur du contenu de l'en-tête correspondant dans la boîte de dialogue Ajouter une fonction.
Exemples d'analyseur de contenu d'en-tête d'expression rationnelle :
-
Dans ces types de journaux, l'en-tête apparaît généralement au début du fichier journal, suivi par d'autres entrées. Voir ci-dessous :
Trace file /scratch/emga/DB1212/diag/rdbms/lxr1212/lxr1212_1/trace/lxr1212_1_ora_5071.trc Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options ORACLE_HOME = /scratch/emga/DB1212/dbh System name: Linux Node name: slc00drj Release: 2.6.18-308.4.1.0.1.el5xen Version: #1 SMP Tue Apr 17 16:41:30 EDT 2012 Machine: x86_64 VM name: Xen Version: 3.4 (PVM) Instance name: lxr1212_1 Redo thread mounted by this instance: 1 Oracle process number: 35 Unix process pid: 5071, image: oracle@slc00drj (TNS V1-V3) *** 2020-10-12 21:12:06.169 *** SESSION ID:(355.19953) 2020-10-12 21:12:06.169 *** CLIENT ID:() 2020-10-12 21:12:06.169 *** SERVICE NAME:(SYS$USERS) 2020-10-12 21:12:06.169 *** MODULE NAME:(sqlplus@slc00drj (TNS V1-V3)) 2020-10-12 21:12:06.169 *** CLIENT DRIVER:() 2020-10-12 21:12:06.169 *** ACTION NAME:() 2020-10-12 21:12:06.169 2020-10-12 21:12:06.169: [ GPNP]clsgpnp_dbmsGetItem_profile: [at clsgpnp_dbms.c:345] Result: (0) CLSGPNP_OK. (:GPNP00401:)got ASM-Profile.Mode='legacy' *** CLIENT DRIVER:(SQL*PLUS) 2020-10-12 21:12:06.290 SERVER COMPONENT id=UTLRP_BGN: timestamp=2020-10-12 21:12:06 *** 2020-10-12 21:12:10.078 SERVER COMPONENT id=UTLRP_END: timestamp=2020-10-12 21:12:10 *** 2020-10-12 21:12:39.209 KJHA:2phase clscrs_flag:840 instSid: KJHA:2phase ctx 2 clscrs_flag:840 instSid:lxr1212_1 KJHA:2phase clscrs_flag:840 dbname: KJHA:2phase ctx 2 clscrs_flag:840 dbname:lxr1212 KJHA:2phase WARNING!!! Instance:lxr1212_1 of kspins type:1 does not support 2 phase CRS *** 2020-10-12 21:12:39.222 Stopping background process SMCO *** 2020-10-12 21:12:40.220 ksimdel: READY status 5 *** 2020-10-12 21:12:47.628 ... KJHA:2phase WARNING!!! Instance:lxr1212_1 of kspins type:1 does not support 2 phase CRS
Pour l'exemple précédent, à l'aide de la fonction Détails d'en-tête, Oracle Logging Analytics enrichit les entrées de journal de corps temporelles avec les champs du contenu d'en-tête.
-
Observons l'exemple de journal suivant :
Server: prodsrv123 Application: OrderAppA 2020-08-01 23:02:43 INFO DataLifecycle Starting backup process 2020-08-01 23:02:43 ERROR OrderModule Order failed due to transaction timeout 2020-08-01 23:02:43 INFO DataLifecycle Backup process completed. Status=success 2020-08-01 23:02:43 WARN OrderModule Order completed with warnings: inventory on backorder
Dans l'exemple précédent, nous avons quatre entrées de journal à saisir dans Oracle Logging Analytics. Le nom du serveur et le nom de l'application apparaissent uniquement au début du fichier journal. Pour inclure le nom du serveur et le nom de l'application dans chaque entrée de journal :
-
Définissez un analyseur pour l'en-tête qui analysera les champs de serveur et d'application :
Server:\s*(\S+).*?Application:\s*(\S+)
-
Définissez un second analyseur pour analyser le corps restant du journal :
{TIMEDATE}\s(\S+)\s(\S+)\s(.*)
-
Dans l'analyseur de corps, ajoutez une instance de fonction Détails d'en-tête et sélectionnez l'analyseur d'en-tête que vous avez défini à l'étape 1.
-
Ajoutez l'analyseur de corps que vous avez défini à l'étape 2 à une source de journaux, puis associez la source de journaux à une entité pour démarrer la collecte de journaux.
Vous pourrez alors obtenir quatre entrées de journal avec le nom du serveur et le nom de l'application ajoutés à chaque entrée.
-
Exemples d'analyseur de contenu d'en-tête JSON :
Voici des exemples de différents cas pour Header-Detail. Les entrées de journal détaillées sont enrichies avec les champs des entrées de journal d'en-tête. Les champs mis en surbrillance dans l'entrée de journal détaillé enrichi sont les champs copiés à partir de l'entrée de journal d'en-tête.
-
JSON PATH : En-tête =
$
, détails =$.data
{ "id" : "id_ERROR1", "data": { "id" : "id_data_ERROR1", "childblock0": { "src": "127.0.0.1" }, "childblocks": [ { "childblock": { "srchost1": "host1_ERROR1" } }, { "childblock": { "srchost2": "host2_ERROR1" } } ], "hdr": { "time_ms": "2021-05-21T04:27:18.89714589Z", "error": "hdr_ERROR1" } }, "compartmentName": "comp_name_ERROR1", "eventName": "GetBucket_ERROR1" }
Entrées de journal extraites et enrichies :
Entrée du journal d'en-tête :
{"id":"id_ERROR1","compartmentName":"comp_name_ERROR1","eventName":"GetBucket_ERROR1"}
Entrée du journal des détails :
{"compartmentName":"comp_name_ERROR1","eventName":"GetBucket_ERROR1", "id": "id_data_ERROR1", "childblock0":{"src":"127.0.0.1"},"childblocks":[{"childblock":{"srchost1":"host1_ERROR1"}},{"childblock":{"srchost2":"host2_ERROR1"}}],"hdr":{"time_ms":"2021-05-21T04:27:18.89714589Z","error":"hdr_ERROR1"}}
Le champ
id
est disponible à la fois dans l'en-tête et dans les détails. Le champ des détails est sélectionné dans ce cas. -
JSON PATH : En-tête =
$.metadata
, détails =$.datapoints[*]
Dans cet exemple, le premier bloc a à la fois un en-tête et des détails, mais le deuxième bloc n'a qu'une entrée de journal de détails.
{ "namespace":"oci_streaming", "resourceGroup":null, "name":"GetMessagesThroughput.Count1", "dimensions":{ "region":"phx1", "resourceId":"ocid1.stream.oc1.phx.1" }, "datapoints":[ { "timestamp":1652942170000, "value":1.1, "count":11 }, { "timestamp":1652942171001, "value":1.2, "count":12 } ], "metadata":{ "displayName":"Get Messages 1", "unit":"count1" } } { "namespace":"oci_streaming", "resourceGroup":null, "name":"GetMessagesThroughput.Count1", "dimensions":{ "region":"phx1", "resourceId":"ocid1.stream.oc1.phx.1" }, "datapoints":[ { "timestamp":1652942170002, "value":2.1, "count":21 }, { "timestamp":1652942171003, "value":3.2, "count":32 } ] }
Entrées de journal extraites et enrichies :
Entrée du journal d'en-tête :
{"displayName":"Get Messages 1","unit":"count1"}
Entrée du journal des détails :
{"displayName":"Get Messages 1","unit":"count1", "timestamp":1652942170000,"value":1.1,"count":11}
Entrée du journal des détails :
{"displayName":"Get Messages 1","unit":"count1", "timestamp":1652942171001,"value":1.2,"count":12}
Entrée du journal des détails :
{"timestamp":1652942170002,"value":2.1,"count":21}
Entrée du journal des détails :
{"timestamp":1652942171003,"value":3.2,"count":32}
-
JSON PATH : En-tête =
$.instanceHealths:[*]
, détails =$.instanceHealths[*].instanceHealthChecks[*]
{ "reportType": "Health Status Report 1", "instanceHealths": [ { "instanceHealthChecks": [ { "HealthCheckName": "Check-A1", "Result": "Passed", "time": "2022-11-17T06:05:01Z" }, { "HealthCheckName": "Check-A2", "Result": "Passed", "time": "2022-11-17T06:05:01Z" } ], "Datacenter-A" : "Remote A" } ] }
Entrées de journal extraites et enrichies :
Entrée du journal d'en-tête :
{"Datacenter-A":"Remote A"}
Entrée du journal des détails :
{"Datacenter-A":"Remote A", "HealthCheckName":"Check-A1","Result":"Passed","time":"2022-11-17T06:05:01Z"}
Entrée du journal des détails :
{"Datacenter-A":"Remote A", "HealthCheckName":"Check-A2","Result":"Passed","time":"2022-11-17T06:05:01Z"}
-
Chemin JSON : Header1 =
$.dimensions
, Header2 =$.metadata
, Détails =$.datapoints[*]
Dans cet exemple, deux en-têtes différents sont appliqués.
{ "namespace":"oci_streaming", "resourceGroup":null, "name":"GetMessagesThroughput.Count1", "dimensions":{ "region":"phx1", "resourceId":"ocid1.stream.oc1.phx.1" }, "datapoints":[ { "timestamp":1652942170000, "value":1.1, "count":11 }, { "timestamp":1652942171001, "value":1.2, "count":12 } ], "metadata":{ "displayName":"Get Messages 1", "unit":"count1" } }
Entrées de journal extraites et enrichies :
Entrée du journal Header1 :
{"region":"phx1","resourceId":"ocid1.stream.oc1.phx.1"}
Entrée du journal Header2 :
{"displayName":"Get Messages 1","unit":"count1"}
Entrée du journal des détails :
{"region":"phx1","resourceId":"ocid1.stream.oc1.phx.1", displayName":"Get Messages 1","unit":"count1", "timestamp":1652942170000,"value":1.1,"count":11}
Entrée du journal des détails :
{"region":"phx1","resourceId":"ocid1.stream.oc1.phx.1", displayName":"Get Messages 1","unit":"count1", "timestamp":1652942171001,"value":1.2,"count":12}
-
Chemin JSON : Header1 =
$.hdr1
, Header2 =$.hdr2
, Détails =$.body
Dans ce cas, l'entrée de journal d'en-tête est associée à l'entrée de journal de détails si les deux se trouvent dans le même bloc.
{ "hdr1": { "module": "mod1", "error": "hdr1_error1" } } { "body": { "id": "data_id_ERROR2", "error": "body_ERROR2" } } { "hdr2": { "module": "mod3", "error": "hdr2_error3" } "body": { "id": "data_id_ERROR4", "error": "body_ERROR4" } }
Entrées de journal extraites et enrichies :
Entrée du journal d'en-tête :
{"id":"data_id_ERROR1","error":"hdr1_error1"}
Entrée du journal des détails :
{"id":"data_id_ERROR2","error":"body_ERROR2"}
Entrée du journal d'en-tête :
{"module":"mod3","error":"hdr2_error3"}
Entrée du journal des détails :
{"module":"mod3", "id":"data_id_ERROR4","error":"body_ERROR4"}
Notez que dans la deuxième entrée du journal Détails, la valeur
error
est sélectionnée dans les détails lorsque le même élément est disponible dans l'en-tête et dans les détails. -
JSON PATH : En-tête =
$
, Details1 =$.JDBC
, Details2 =$.THREADS
Dans ce cas, une seule entrée de journal d'en-tête est associée à plusieurs entrées de journal détaillées :
{ "time": "2024-09-10T00:20:00", "instance": "GBOSBMXR1PR", "name": "gbosbmxr1pr_server_2", "JDBC": [ { "name":"XXAlsGoldXADS", "Status": "Running", "Url": "jdbc:oracle:thin:@PSOAPR1" } ], "THREADS": [ { "name": "[HOGGING][ACTIVE] ExecuteThread 56 ", "WORKMGR": "OneWayJTACoordinatorWM", "CATEGORY": "Internal", "APPNAME": "None" } ] }
Entrées de journal extraites et enrichies :
Entrée de journal d'en-tête (appliquée aux entrées de journal de détails ci-dessous) :
{ "time": "2024-09-10T00:20:00", "instance": "GBOSBMXR1PR", "name": "gbosbmxr1pr_server_2" }
Entrée du journal des détails :
{ "name":"XXAlsGoldXADS", "Status": "Running", "Url": "jdbc:oracle:thin:@PSOAPR1" }
Entrée du journal des détails :
{ "name": "[HOGGING][ACTIVE] ExecuteThread 56 ", "WORKMGR": "OneWayJTACoordinatorWM", "CATEGORY": "Internal", "APPNAME": "None" }
Fonction Rechercher/Remplacer
Cette fonction vous permet d'extraire du texte d'une ligne de journal et de l'ajouter à d'autres lignes de journal sous certaines conditions en fonction des modèles indiqués. Par exemple, vous pouvez utiliser cette fonctionnalité pour ajouter des horodatages manquants aux journaux d'interrogation généraux et lents de MySQL.
La fonction Rechercher/Remplacer possède les attributs suivants :
-
Expression rationnelle Catch : L'expression rationnelle qui est mise en correspondance avec chaque ligne de journal et l'expression rationnelle correspondante nommée texte de groupe est enregistrée en mémoire pour être utilisée dans l'expression Replace.
-
Si l'expression Catch correspond à une ligne complète, l'expression Replace ne sera pas appliquée à la ligne de journal suivante. Ceci permet d'éviter d'avoir la même ligne deux fois dans le cas où vous souhaitez ajouter une ligne manquante au début.
-
Une ligne correspondant à l'expression Catch ne sera pas traitée pour l'expression Find. Par conséquent, une opération de recherche et de remplacement ne peut pas être effectuée dans la même ligne de journal.
-
Vous pouvez indiquer plusieurs groupes portant des noms différents.
-
-
Expression rationnelle Find : Cette expression rationnelle indique le texte à remplacer par le texte correspondant aux groupes nommés dans l'expression Catch dans les lignes de journal.
-
Le modèle à mettre en correspondance doit être regroupé.
-
L'expression Find n'est pas exécutée sur les lignes qui correspondent à l'expression Catch. Par conséquent, une opération de recherche et de remplacement ne peut pas être effectuée dans la même ligne de journal.
-
L'expression Find peut comporter plusieurs groupes. Le texte correspondant dans chaque groupe sera remplacé par le texte créé par l'expression Replace.
-
-
Expression rationnelle Replace : Cette notation personnalisée indique le texte à remplacer par les groupes trouvés dans l'expression Find. Les noms de groupe doivent figurer entre parenthèses.
-
Le nom du groupe doit être entre crochets.
-
Vous pouvez inclure le texte statique.
-
Le texte créé par l'expression Replace remplacera le texte correspondant dans tous les groupes de l'expression Find.
-
Cliquez sur l'icône Aide située à côté des champs Expression rationnelle Catch, Expression rationnelle Find et Expression rationnelle Replace pour voir la description du champ, l'exemple d'expression, le contenu de l'exemple et l'action effectuée. Pour ajouter d'autres expressions Catch, cliquez sur Ajouter une expression sous Expression rationnelle Catch.
Exemples :
- L'objectif de cet exemple est d'obtenir l'horodatage à partir de la ligne de journal contenant le texte
# Time:
et de l'ajouter aux lignes de journal avec# User@Host
sans horodatage.Examinons les données de journal suivantes :
# Time: 160201 1:55:58 # User@Host: root[root] @ localhost [] Id: 1 # Query_time: 0.001320 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 select @@version_comment limit 1; # User@Host: root[root] @ localhost [] Id: 2 # Query_time: 0.000138 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 2 SET timestamp=1454579783; SELECT DATABASE();
Les valeurs des attributs Expression rationnelle Catch, Expression rationnelle Find et Expression rationnelle Replace peuvent être :
-
La valeur Expression rationnelle Catch pour mettre en correspondance la ligne de journal d'horodatage et l'enregistrer dans la mémoire avec le nom timestr est
^(?<timestr>^# Time:.*)
. -
La valeur Expression rationnelle Find pour rechercher les lignes auxquelles la ligne de journal d'horodatage doit être ajoutée est
(^)# User@Host:.*
. -
La valeur Expression rationnelle Replace pour remplacer le début des lignes de journal dont l'horodatage est manquant est
(timestr)
.
Après avoir ajouté la fonction Rechercher/Remplacer, vous constaterez la modification suivante des lignes de journal :
# Time: 160201 1:55:58 # User@Host: root[root] @ localhost [] Id: 1 # Query_time: 0.001320 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 select @@version_comment limit 1; # Time: 160201 1:55:58 # User@Host: root[root] @ localhost [] Id: 2 # Query_time: 0.000138 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 2 SET timestamp=1454579783; SELECT DATABASE();
Dans le résultat précédent de l'exemple, vous pouvez remarquer que la fonction Rechercher/Remplacer a inséré l'horodatage avant l'entrée
User@host
dans chaque ligne de journal détectée lors du prétraitement du journal. -
-
L'objectif de cet exemple est de détecter plusieurs paramètres et de les remplacer à plusieurs endroits des données du journal.
Examinons les données de journal suivantes :
160203 21:23:54 Child process "proc1", owner foo, SUCCESS, parent init 160203 21:23:54 Child process "proc2" - 160203 21:23:54 Child process "proc3" -
Dans les lignes de journal précédentes, les deuxième et troisième lignes ne contiennent pas les données d'utilisateur. La fonction Rechercher/Remplacer doit donc sélectionner les valeurs de la première ligne du journal et remplacer les valeurs des deuxième et troisième lignes.
Les valeurs des attributs Expression rationnelle Catch, Expression rationnelle Find et Expression rationnelle Replace peuvent être :
-
La valeur Expression rationnelle Catch pour obtenir les informations sur les utilisateurs
foo
etinit
de la première ligne de journal et l'enregistrer dans la mémoire avec les paramètres user1 et user2 est^.*?owner\s+(?<user1>\w+)\s*,\s*.*?parent\s+(?<user2>\w+).*
. -
La valeur Expression rationnelle Find pour rechercher les lignes comportant le trait d'union (
-
) est.*?(-).*
. -
La valeur Expression rationnelle Replace est
, owner (user1), UNKNOWN, parent (user2)
.
Après avoir ajouté la fonction Rechercher/Remplacer, vous constaterez la modification suivante des lignes de journal :
160203 21:23:54 Child process "proc1", owner foo, SUCCESS, parent init 160203 21:23:54 Child process "proc2", owner foo, UNKNOWN, parent init 160203 21:23:54 Child process "proc3", owner foo, UNKNOWN, parent init
Dans le résultat précédent de l'exemple, vous pouvez remarquer que la fonction Rechercher/Remplacer a inséré les informations user1 et user2 à la place de l'entrée de caractère de trait d'union (
-
) dans chaque ligne de journal détectée lors du prétraitement du journal. -
Fonction de décalage horaire
Certains enregistrements de journal n'ont pas d'horodatage, d'autres n'auront que le décalage horaire et d'autres n'en auront aucun. Oracle Logging Analytics extrait les informations requises et affecte l'heure à chaque enregistrement de journal.
Voici quelques scénarios et solutions correspondantes pour affecter l'horodatage à l'aide de la fonction de décalage temporel :
Contenu de l'exemple de journal | Scénario | Solution |
---|---|---|
|
Le fichier journal comporte un horodatage dans les journaux initiaux et des décalages ultérieurs. |
Sélectionnez l'horodatage à partir des enregistrements de journal initiaux et affectez-les aux enregistrements de journal ultérieurs ajustés avec les décalages horaires. |
|
Le fichier journal contient des journaux initiaux avec des décalages horaires et aucun journal d'horodatage antérieur. |
Sélectionnez l'horodatage à partir des enregistrements de journal ultérieurs et affectez-les aux enregistrements de journal précédents ajustés avec les décalages horaires. Lorsque le décalage horaire est réinitialisé dans l'intervalle, c'est-à-dire qu'un décalage horaire plus petit se produit dans un enregistrement de journal, il est alors corrigé en tenant compte de l'horodatage de l'enregistrement de journal précédent comme référence. |
|
Le fichier journal contient des enregistrements de journal avec uniquement des décalages horaires et aucun horodatage. |
horodatage de la dernière modification du fichier : Une fois tous les enregistrements de journal parcourus, l'horodatage est calculé en soustrayant le décalage horaire calculé de l'heure de la dernière modification du fichier. horodatage du nom de fichier : Lorsque cette option est sélectionnée dans l'interface utilisateur, l'horodatage est extrait du nom du fichier dans le format spécifié par l'expression Timestamp. |
Les décalages horaires des entrées de journal sont relatifs à l'horodatage mis en correspondance précédemment. Il s'agit de l'horodatage de base figurant dans ce document.
Utilisez la fonction de décalage horaire de l'analyseur pour extraire l'horodatage et le décalage horaire des enregistrements de journal. Dans la boîte de dialogue Ajouter une fonction :
-
Où puis-je trouver l'horodatage? : Pour indiquer l'emplacement à partir duquel l'horodatage doit être sélectionné, sélectionnez Nom du fichier, Dernière modification du fichier à et Entrée de journal. Par défaut, Nom du fichier est sélectionné.
Si ce paramètre n'est pas précisé, la recherche de l'horodatage est effectuée dans l'ordre suivant :
- Parcourez les enregistrements de journal et recherchez une correspondance avec l'analyseur d'horodatage que vous indiquerez à l'étape suivante.
- Sélectionnez l'heure de dernière modification comme horodatage.
- Si l'heure de la dernière modification n'est pas disponible pour le fichier, sélectionnez l'heure système comme horodatage.
- Recherchez une correspondance avec l'expression d'horodatage dans le nom du fichier, que vous indiquerez à l'étape suivante.
-
En fonction de la sélection de la source de l'horodatage, indiquez les valeurs suivantes :
- Si vous avez sélectionné Nom du fichier à l'étape 1 :
Expression Timestamp : Spécifiez l'expression rationnelle pour rechercher l'horodatage dans le nom du fichier. Par défaut, il utilise la directive
{TIMEDATE}
.Exemple de nom de fichier : Spécifiez le nom de fichier d'un exemple de journal pouvant être utilisé pour tester les paramètres ci-dessus.
-
Si vous avez sélectionné Dernière modification du fichier à à l'étape 1, sélectionnez Dernière modification du fichier d'exemple à.
-
Si vous avez sélectionné Entrée de journal à l'étape 1, sélectionnez l'analyseur dans le menu Analyseur d'horodatage pour spécifier le format de l'horodatage.
- Si vous avez sélectionné Nom du fichier à l'étape 1 :
-
Expression Timestamp Offset : Spécifiez l'expression rationnelle pour extraire le décalage horaire en secondes et en millisecondes pour affecter l'horodatage à un enregistrement de journal. Seuls les groupes
sec
etmsec
sont pris en charge. Par exemple,(?<sec>\d+)\.(?<msec>\d+)
.Prenons l'exemple d'enregistrement de journal suivant :
15.225 hostA debug services started
L'exemple d'expression Offset sélectionne
15
secondes et225
millisecondes comme décalage horaire par rapport à l'enregistrement de journal. -
Après les sélections effectuées dans les étapes précédentes, le contenu du journal est affiché dans le champ Exemple de journal.
Cliquez sur Tester pour tester les paramètres.
Vous pouvez consulter la comparaison entre le contenu du journal initial et l'heure calculée en fonction de vos spécifications.
-
Pour enregistrer la fonction de décalage horaire ci-dessus, cliquez sur Ajouter.