
Un toolkit di machine learning per il parsing dei log [ICSE'19, DSN'16]
Logparser fornisce un toolkit di machine learning e benchmark per il parsing automatico dei log, un passaggio fondamentale per l'analisi strutturata dei log. Applicando logparser, gli utenti possono estrarre automaticamente modelli di eventi da log non strutturati e convertire i messaggi di log grezzi in una sequenza di eventi strutturati. Il processo di parsing dei log è noto anche come estrazione di template di messaggi, estrazione di log key o clustering di messaggi di log in letteratura.

Un esempio di log parsing
pip install logparser3.💡 Ti invitiamo a inviare una PR per integrare il tuo parser in logparser e aggiungere il tuo articolo alla tabella.
Consigliamo di installare il pacchetto logparser e le dipendenze tramite pip install.``` pip install logparser3
In particolare, il pacchetto dipende dai seguenti requisiti. Nota: il matching con regex in Python è fragile, quindi consigliamo di fissare la libreria regex alla versione 2022.3.2.
Nota: Se incontri ``"Error: need to escape..."``, segui le istruzioni [qui](https://github.com/logpai/logparser/issues/122).
+ python 3.6+
+ regex 2022.3.2
+ numpy
+ pandas
+ scipy
+ scikit-learn
Requisiti condizionali:
+ Se usi MoLFI: `deap`
+ Se usi SHISO: `nltk`
+ Se usi SLCT: `gcc`
+ Se usi LogCluster: `perl`
+ Se usi NuLog: `torch`, `torchvision`, `keras_preprocessing`
+ Se usi DivLog: `openai`, `tiktoken` (richiedono python 3.8+)
### Per iniziare
1. Esegui la demo:
Per ogni parser di log, forniamo una demo per aiutarti a iniziare. Ogni demo mostra l'uso di base di un parser di log specifico e gli iperparametri da configurare. Ad esempio, il seguente comando mostra come eseguire la demo per Drain.
```
cd logparser/Drain
python demo.py
```
2. Esegui il benchmark:
Per ogni parser di log, forniamo uno script di benchmark per eseguire il parsing dei log sui [dataset loghub_2k](https://github.com/logpai/logparser/tree/main/data#loghub_2k) per valutare l'accuratezza del parsing. Puoi anche usare [altri dataset di benchmark per il parsing dei log](https://github.com/logpai/logparser/tree/main/data#datasets).
```
cd logparser/Drain
python benchmark.py
```
I risultati del benchmark sono disponibili nel file readme di ciascun parser, ad es., https://github.com/logpai/logparser/tree/main/logparser/Drain#benchmark.
3. Analizza i tuoi log:
È facile applicare logparser all'analisi dei tuoi dati di log. Per farlo, devi prima installare il pacchetto logparser3. Poi puoi sviluppare il tuo script seguendo il frammento di codice qui sotto per avviare il parsing dei log. Vedi il codice di esempio completo in [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)
```
Dopo aver eseguito logparser, puoi ottenere i template degli eventi estratti e i log strutturati analizzati nella cartella di output.
+ `*_templates.csv` (Vedi esempio [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` (Vedi esempio [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'] |
### Uso in produzione
L'obiettivo principale di logparser è l'uso per scopi di ricerca e benchmark. I ricercatori possono usare logparser come base di codice per sviluppare nuovi parser di log, mentre i professionisti possono valutare le prestazioni e la scalabilità degli attuali metodi di parsing dei log tramite il nostro benchmark. Consigliamo vivamente ai professionisti di provare logparser nel proprio ambiente di produzione. Ma siate consapevoli che l'implementazione attuale di logparser è lontana dall'essere pronta per l'uso in produzione. Anche se al momento non abbiamo intenzione di farlo, abbiamo alcuni suggerimenti per gli sviluppatori che vogliono costruire un parser di log intelligente di livello produttivo.
+ Si prega di prestare attenzione alle [licenze delle librerie di terze parti](https://github.com/logpai/logparser/blob/main/LICENSE.md) utilizzate in logparser. Suggeriamo di mantenere un solo parser ed eliminare gli altri, quindi ricostruire la wheel del pacchetto. Questo non romperà l'uso di logparser.
+ Si prega di migliorare logparser con efficienza e scalabilità tramite multi-processing, aggiungere il recupero dagli errori e la persistenza su disco o su code di messaggi come Kafka.
+ [Drain3](https://github.com/logpai/Drain3) fornisce un buon esempio di riferimento, costruito con [miglioramenti pratici](https://github.com/logpai/Drain3#new-features) per scenari di produzione.
### 🔥 Citazione
Se utilizzi i nostri strumenti logparser o i risultati del benchmark in una pubblicazione, ti preghiamo di citare i seguenti articoli.
+ [**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.
### 🤗 Contributori
<!-- 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 -->
### Discussione
Ti invitiamo a unirti al nostro gruppo WeChat per qualsiasi domanda o discussione. In alternativa, puoi [aprire una segnalazione qui](https://github.com/logpai/logparser/issues/new).

| Pubblicazione | Parser | Titolo dell'articolo | Benchmark |
|---|