
Une boîte à outils d'apprentissage automatique pour le parsing de logs [ICSE'19, DSN'16]
Logparser fournit une boîte à outils d'apprentissage automatique et des références (benchmarks) pour l'analyse automatique de journaux, une étape cruciale pour l'analytique structurée des journaux. En appliquant logparser, les utilisateurs peuvent extraire automatiquement des modèles d'événements à partir de journaux non structurés et convertir les messages de journal bruts en une séquence d'événements structurés. Le processus d'analyse de journaux est également connu sous le nom d'extraction de modèles de messages, d'extraction de clés de journal ou de regroupement de messages de journal dans la littérature.

Un exemple d'analyse de journaux
pip install logparser3.💡 N'hésitez pas à soumettre une PR pour intégrer votre analyseur à logparser et ajouter votre article au tableau.
Nous recommandons d'installer le paquet logparser et ses dépendances via pip install.``` pip install logparser3
En particulier, le paquet dépend des exigences suivantes. Notez que la correspondance regex en Python est fragile, nous vous recommandons donc de fixer la bibliothèque regex à la version 2022.3.2.
Note : Si vous rencontrez ``"Error: need to escape..."``, veuillez suivre les instructions [ici](https://github.com/logpai/logparser/issues/122).
+ python 3.6+
+ regex 2022.3.2
+ numpy
+ pandas
+ scipy
+ scikit-learn
Exigences conditionnelles :
+ Si vous utilisez MoLFI : `deap`
+ Si vous utilisez SHISO : `nltk`
+ Si vous utilisez SLCT : `gcc`
+ Si vous utilisez LogCluster : `perl`
+ Si vous utilisez NuLog : `torch`, `torchvision`, `keras_preprocessing`
+ Si vous utilisez DivLog : `openai`, `tiktoken` (nécessite python 3.8+)
### Pour commencer
1. Exécutez la démo :
Pour chaque analyseur de logs, nous fournissons une démo pour vous aider à démarrer. Chaque démo montre l'utilisation de base d'un analyseur de logs cible et les hyper-paramètres à configurer. Par exemple, la commande suivante montre comment exécuter la démo pour Drain.
```
cd logparser/Drain
python demo.py
```
2. Exécutez le benchmark :
Pour chaque analyseur de logs, nous fournissons un script de benchmark pour exécuter l'analyse de logs sur les [jeux de données loghub_2k](https://github.com/logpai/logparser/tree/main/data#loghub_2k) afin d'évaluer la précision de l'analyse. Vous pouvez également utiliser [d'autres jeux de données de benchmark pour l'analyse de logs](https://github.com/logpai/logparser/tree/main/data#datasets).
```
cd logparser/Drain
python benchmark.py
```
Les résultats du benchmark se trouvent dans le fichier readme de chaque analyseur, par exemple https://github.com/logpai/logparser/tree/main/logparser/Drain#benchmark.
3. Analysez vos propres logs :
Il est facile d'utiliser logparser pour analyser vos propres données de logs. Pour ce faire, vous devez d'abord installer le paquet logparser3. Ensuite, vous pouvez développer votre propre script en suivant l'extrait de code ci-dessous pour démarrer l'analyse de logs. Voir le code d'exemple complet sur [example/parse_your_own_logs.py](https://github.com/logpai/logparser/blob/main/example/parse_your_own_logs.py).
```python
from logparser.Drain import LogParser
input_dir = 'PATH_TO_LOGS/' # The input directory of log file
output_dir = 'result/' # The output directory of parsing results
log_file = 'unknow.log' # The input log file name
log_format = '<Date> <Time> <Level>:<Content>' # Define log format to split message fields
# Regular expression list for optional preprocessing (default: [])
regex = [
r'(/|)([0-9]+\.){3}[0-9]+(:[0-9]+|)(:|)' # IP
]
st = 0.5 # Similarity threshold
depth = 4 # Depth of all leaf nodes
parser = LogParser(log_format, indir=input_dir, outdir=output_dir, depth=depth, st=st, rex=regex)
parser.parse(log_file)
```
Après avoir exécuté logparser, vous pouvez obtenir les modèles d'événements extraits et les logs structurés analysés dans le dossier de sortie.
+ `*_templates.csv` (Voir l'exemple [HDFS_2k.log_templates.csv](https://github.com/logpai/logparser/blob/main/logparser/Drain/demo_result/HDFS_2k.log_templates.csv))
| EventId | EventTemplate | Occurrences |
|----------|------------------------------------------------|-------------|
| dc2c74b7 | PacketResponder <*> for block <*> terminating | 311 |
| e3df2680 | Received block <*> of size <*> from <*> | 292 |
| 09a53393 | Receiving block <*> src: <*> dest: <*> | 292 |
+ `*_structured.csv` (Voir l'exemple [HDFS_2k.log_structured.csv](https://github.com/logpai/logparser/blob/main/logparser/Drain/demo_result/HDFS_2k.log_structured.csv))
| ... | Level | Content | EventId | EventTemplate | ParameterList |
|-----|-------|-----------------------------------------------------------------------------------------------|----------|---------------------------------------------------------------------|--------------------------------------------|
| ... | INFO | PacketResponder 1 for block blk_38865049064139660 terminating | dc2c74b7 | PacketResponder <*> for block <*> terminating | ['1', 'blk_38865049064139660'] |
| ... | INFO | Received block blk_3587508140051953248 of size 67108864 from /10.251.42.84 | e3df2680 | Received block <*> of size <*> from <*> | ['blk_3587508140051953248', '67108864', '/10.251.42.84'] |
| ... | INFO | Verification succeeded for blk_-4980916519894289629 | 32777b38 | Verification succeeded for <*> | ['blk_-4980916519894289629'] |
### Utilisation en production
L'objectif principal de logparser est de servir à la recherche et aux benchmarks. Les chercheurs peuvent utiliser logparser comme base de code pour développer de nouveaux analyseurs de logs, tandis que les praticiens peuvent évaluer les performances et l'évolutivité des méthodes actuelles d'analyse de logs grâce à nos benchmarks. Nous recommandons vivement aux praticiens d'essayer logparser dans votre environnement de production. Mais sachez que l'implémentation actuelle de logparser est loin d'être prête pour une utilisation en production. Bien que nous n'ayons actuellement aucun plan pour cela, nous avons quelques suggestions pour les développeurs qui souhaitent créer un analyseur de logs intelligent de niveau production.
+ Veuillez être conscient des [licences des bibliothèques tierces](https://github.com/logpai/logparser/blob/main/LICENSE.md) utilisées dans logparser. Nous suggérons de conserver un analyseur et de supprimer les autres, puis de reconstruire la wheel du paquet. Cela ne cassera pas l'utilisation de logparser.
+ Veuillez améliorer logparser en termes d'efficacité et d'évolutivité avec le multi-traitement, ajouter la reprise après échec, ajouter la persistance sur disque ou sur la file de messages Kafka.
+ [Drain3](https://github.com/logpai/Drain3) fournit un bon exemple de référence, construit avec des [améliorations pratiques](https://github.com/logpai/Drain3#new-features) pour les scénarios de production.
### 🔥 Citation
Si vous utilisez nos outils logparser ou les résultats de nos benchmarks dans vos publications, veuillez citer les articles suivants.
+ [**ICSE'19**] Jieming Zhu, Shilin He, Jinyang Liu, Pinjia He, Qi Xie, Zibin Zheng, Michael R. Lyu. [Tools and Benchmarks for Automated Log Parsing](https://arxiv.org/pdf/1811.03509.pdf). *International Conference on Software Engineering (ICSE)*, 2019.
+ [**DSN'16**] Pinjia He, Jieming Zhu, Shilin He, Jian Li, Michael R. Lyu. [An Evaluation Study on Log Parsing and Its Use in Log Mining](https://jiemingzhu.github.io/pub/pjhe_dsn2016.pdf). *IEEE/IFIP International Conference on Dependable Systems and Networks (DSN)*, 2016.
### 🤗 Contributeurs
<!-- readme: zhujiem,contributors -start -->
<table>
<tbody>
<tr>
<td align="center">
<a href="https://github.com/zhujiem">
<img src="https://assets.kitploit.com/production/public/readmes/51023/471767126e4450e42b40b8e3f5437c2d9d0616f468675dde6feccac1976b18d0/ee334336551226b1483445bee71089fdf5e61115652a2a99375e54566f34c9bf-display-v1.webp" width="80;" alt="zhujiem"/>
<br />
<sub><b>Zhujiem</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/PinjiaHe">
<img src="https://assets.kitploit.com/production/public/readmes/51023/e9f83f96ab3d84e92152317c8d85d54a12fb0b0baea267d29e7d317a5caff94b/5b4a6af1bda6245edbb5c40ea1467625828536aeb88e984716753945b6235da2-display-v1.webp" width="80;" alt="PinjiaHe"/>
<br />
<sub><b>Pinjia He</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/JinYang88">
<img src="https://assets.kitploit.com/production/public/readmes/51023/7785c7974d5753fa21792097907be1e20efb5fc5bbf3aba61b0b4d2f4fe26fec/19a47a39c4db07a8a052ed05304e166cca4cf18683d89a1400688c576ae48b52-display-v1.webp" width="80;" alt="JinYang88"/>
<br />
<sub><b>LIU, Jinyang</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Siyuexi">
<img src="https://assets.kitploit.com/production/public/readmes/51023/fe7de7203a407b36e2f44a57603594e01266d124ef558b53cb95ba28afc6127c/f7a7173a142ced37b910b650e3ad957b27fcf2f13f4c828ff6a72fb87111435f-display-v1.webp" width="80;" alt="Siyuexi"/>
<br />
<sub><b>Junjielong Xu</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/ShilinHe">
<img src="https://assets.kitploit.com/production/public/readmes/51023/c8b37cadfeb622c955b807776ab0fa19f058c8ad512ebb22eb98c79ad5e90c17/fc476296c1b1aa6b1dd7c3220a81a1b70838d5c113a65e6b2f98196d0615b8a3-display-v1.webp" width="80;" alt="ShilinHe"/>
<br />
<sub><b>Shilin HE</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/JosephMeghanathD">
<img src="https://assets.kitploit.com/production/public/readmes/51023/c2036c74a3116c7de955cae32687ffae61d8be46868cbcc61f771a7e9be4fa33/011ea30ec30f0db362d75632b310850b2783bd2c2428dfee7dc0fff182dc1bf8-display-v1.webp" width="80;" alt="JosephMeghanathD"/>
<br />
<sub><b>Joseph</b></sub>
</a>
</td>
</tr>
<tr>
<td align="center">
<a href="https://github.com/jcordon5">
<img src="https://assets.kitploit.com/production/public/readmes/51023/a4f67dd9f820a1dc763ae05e6d66ec6418d7e70abad8a9b5906413ab909f709e/4c8dc9fc08525d6d3c2334983160c0c9a48077fcc22b3498fe658aa133a2da02-display-v1.webp" width="80;" alt="jcordon5"/>
<br />
<sub><b>José A. Cordón </b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/rustamtemirov">
<img src="https://assets.kitploit.com/production/public/readmes/51023/3690f9e2cd318e8555a586fb32e221080e59e5de8917d82584da1f69e00be8cc/95300504879ab023f96e1cd73ca726c6720367b23e0d476e9a0b6cc23b89ff4d-display-v1.webp" width="80;" alt="rustamtemirov"/>
<br />
<sub><b>Rustam Temirov</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/gaiusyu">
<img src="https://assets.kitploit.com/production/public/readmes/51023/68c5eeea49f8a2ee2cd39b633ed1fb9765cde38399b12636dea0a3dd0920c86d/8faa00619c5b17d96e80dff1b124695997ece681c0931519346fa0e62407c578-display-v1.webp" width="80;" alt="gaiusyu"/>
<br />
<sub><b>Siyu Yu (Youth Yu)</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/thomasryck">
<img src="https://assets.kitploit.com/production/public/readmes/51023/ad3710fbbe7106ffe560fe918f87e77a95a6bf7a21dbf65827f93138c96aca5a/ed736bf9ffd9aa54686cc7a3d404f7c0072ecaced2403ff467d112482255c2b3-display-v1.webp" width="80;" alt="thomasryck"/>
<br />
<sub><b>Thomas Ryckeboer</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/IsuruBoyagane15">
<img src="https://assets.kitploit.com/production/public/readmes/51023/dca9ea34301dd9441404246eb535a39d034518fd1311bebd68f1725bc38ba6b3/57b77cdaafca63553a32d53d83f1859d971c1628ef640c36ab1125939bb43a00-display-v1.webp" width="80;" alt="IsuruBoyagane15"/>
<br />
<sub><b>Isuru Boyagane</b></sub>
</a>
</td>
</tr>
<tbody>
</table>
<!-- readme: zhujiem,contributors -end -->
### Discussion
Bienvenue dans notre groupe WeChat pour toute question ou discussion. Vous pouvez également [ouvrir une issue ici](https://github.com/logpai/logparser/issues/new).

| Publication | Parser | Titre de l'article | Benchmark |
|---|