
Ein Machine-Learning-Toolkit für Log-Parsing [ICSE'19, DSN'16]
Logparser bietet ein Machine-Learning-Toolkit und Benchmarks für das automatisierte Log-Parsing, das ein entscheidender Schritt für die strukturierte Log-Analyse ist. Mit logparser können Benutzer automatisch Ereignisvorlagen aus unstrukturierten Logs extrahieren und rohe Lognachrichten in eine Sequenz strukturierter Ereignisse umwandeln. Der Prozess des Log-Parsings wird in der Literatur auch als Message-Template-Extraktion, Log-Key-Extraktion oder Log-Message-Clustering bezeichnet.

Ein Beispiel für Log-Parsing
Seit der ersten Veröffentlichung von logparser wurden aufgrund der Inkompatibilität mit Python 3 viele PRs und Issues eingereicht. Schließlich aktualisieren wir logparser v1.0.0 mit Unterstützung für Python 3. Danke für alle Beiträge (#PR86, #PR85, #PR83, #PR80, #PR65, #PR57, #PR53, #PR52, #PR51, #PR49, #PR18, #PR22)!
Wir bauen das Paket-Wheel logparser3 und veröffentlichen es auf pypi. Bitte per pip install logparser3 installieren.
Wir refaktorieren die Codestruktur und verschönern den Code mit dem Python-Codeformatierer black.
💡 Du bist eingeladen, einen PR einzureichen, um deinen Parser-Code zu logparser beizutragen und dein Paper zur Tabelle hinzuzufügen.
Wir empfehlen, das logparser-Paket und die Abhängigkeiten per pip install zu installieren.``` pip install logparser3
Insbesondere hängt das Paket von den folgenden Anforderungen ab. Beachten Sie, dass Regex-Matching in Python fehleranfällig ist. Daher empfehlen wir, die Regex-Bibliothek auf die Version 2022.3.2 zu fixieren.
Hinweis: Falls Ihnen ``"Error: need to escape..."`` begegnet, folgen Sie bitte den Anweisungen [hier](https://github.com/logpai/logparser/issues/122).
+ python 3.6+
+ regex 2022.3.2
+ numpy
+ pandas
+ scipy
+ scikit-learn
Bedingte Anforderungen:
+ If using MoLFI: `deap`
+ If using SHISO: `nltk`
+ If using SLCT: `gcc`
+ If using LogCluster: `perl`
+ If using NuLog: `torch`, `torchvision`, `keras_preprocessing`
+ If using DivLog: `openai`, `tiktoken` (require python 3.8+)
### Erste Schritte
1. Demo ausführen:
Für jeden Log-Parser bieten wir eine Demo an, die Ihnen den Einstieg erleichtert. Jede Demo zeigt die grundlegende Verwendung des jeweiligen Log-Parsers und die zu konfigurierenden Hyperparameter. Beispielsweise zeigt der folgende Befehl, wie Sie die Demo für Drain ausführen.
```
cd logparser/Drain
python demo.py
```
2. Benchmark ausführen:
Für jeden Log-Parser stellen wir ein Benchmark-Skript bereit, um das Log-Parsing auf den [loghub_2k-Datensätzen](https://github.com/logpai/logparser/tree/main/data#loghub_2k) zur Bewertung der Parsing-Genauigkeit auszuführen. Sie können auch [andere Benchmark-Datensätze für das Log-Parsing](https://github.com/logpai/logparser/tree/main/data#datasets) verwenden.
```
cd logparser/Drain
python benchmark.py
```
Die Benchmark-Ergebnisse finden Sie in der Readme-Datei jedes Parsers, z. B. https://github.com/logpai/logparser/tree/main/logparser/Drain#benchmark.
3. Eigene Logs parsen:
Es ist einfach, logparser zum Parsen Ihrer eigenen Log-Daten einzusetzen. Dazu müssen Sie zunächst das Paket logparser3 installieren. Anschließend können Sie Ihr eigenes Skript anhand des folgenden Codeausschnitts entwickeln, um mit dem Log-Parsing zu beginnen. Den vollständigen Beispielcode finden Sie unter [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)
```
Nach der Ausführung von logparser erhalten Sie im Ausgabeordner extrahierte Ereignisvorlagen und geparste strukturierte Logs.
+ `*_templates.csv` (Siehe Beispiel [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` (Siehe Beispiel [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'] |
### Produktionseinsatz
Der Hauptzweck von logparser ist die Verwendung zu Forschungs- und Benchmark-Zwecken. Forscher können logparser als Codebasis verwenden, um neue Log-Parser zu entwickeln, während Praktiker die Leistung und Skalierbarkeit aktueller Log-Parsing-Methoden anhand unserer Benchmarks bewerten können. Wir empfehlen Praktikern ausdrücklich, logparser in Ihrer Produktionsumgebung auszuprobieren. Beachten Sie jedoch, dass die derzeitige Implementierung von logparser noch lange nicht für den Produktionseinsatz bereit ist. Wir haben zwar derzeit keinen Plan, dies zu ändern, aber wir haben einige Vorschläge für Entwickler, die einen intelligenten Log-Parser auf Produktionsniveau entwickeln möchten.
+ Bitte beachten Sie die [Lizenzen der Drittanbieter-Bibliotheken](https://github.com/logpai/logparser/blob/main/LICENSE.md), die in logparser verwendet werden. Wir empfehlen, einen Parser zu behalten und die anderen zu löschen und anschließend das Paket-Wheel neu zu erstellen. Dies würde die Verwendung von logparser nicht beeinträchtigen.
+ Bitte verbessern Sie logparser hinsichtlich Effizienz und Skalierbarkeit durch Multiprocessing, ergänzen Sie eine Fehlerwiederherstellung und eine Persistierung auf der Festplatte oder in der Message-Queue Kafka.
+ [Drain3](https://github.com/logpai/Drain3) ist ein gutes Referenzbeispiel, das mit [praktischen Verbesserungen](https://github.com/logpai/Drain3#new-features) für Produktionsszenarien entwickelt wurde.
### 🔥 Zitieren
Wenn Sie unsere logparser-Werkzeuge oder Benchmark-Ergebnisse in Ihrer Publikation verwenden, zitieren Sie bitte die folgenden Arbeiten.
+ [**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.
### 🤗 Mitwirkende
<!-- 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 -->
### Diskussion
Wir laden Sie ein, unserer WeChat-Gruppe beizutreten, wenn Sie Fragen haben oder diskutieren möchten. Alternativ können Sie [hier ein Issue eröffnen](https://github.com/logpai/logparser/issues/new).

| Publikation | Parser | Paper-Titel | Benchmark |
|---|