
Um kit de ferramentas de aprendizado de máquina para análise de logs [ICSE'19, DSN'16]
O Logparser fornece um kit de ferramentas de aprendizado de máquina e benchmarks para análise automatizada de logs, uma etapa crucial para a análise estruturada de logs. Ao aplicar o logparser, os usuários podem extrair automaticamente modelos de eventos de logs não estruturados e converter mensagens de log brutas em uma sequência de eventos estruturados. O processo de log parsing também é conhecido na literatura como extração de templates de mensagens, extração de chaves de log ou agrupamento de mensagens de log.

Um exemplo de log parsing
pip install logparser3.💡 Fique à vontade para enviar um PR para adicionar o código do seu parser ao logparser e incluir seu artigo na tabela.
Recomendamos instalar o pacote logparser e as dependências via pip install.``` pip install logparser3
Em particular, o pacote depende dos seguintes requisitos. Observe que a correspondência de regex em Python é frágil, por isso recomendamos fixar a biblioteca regex na versão 2022.3.2.
Nota: Se você encontrar ``"Error: need to escape..."``, siga as instruções [aqui](https://github.com/logpai/logparser/issues/122).
+ python 3.6+
+ regex 2022.3.2
+ numpy
+ pandas
+ scipy
+ scikit-learn
Requisitos condicionais:
+ Se usar MoLFI: `deap`
+ Se usar SHISO: `nltk`
+ Se usar SLCT: `gcc`
+ Se usar LogCluster: `perl`
+ Se usar NuLog: `torch`, `torchvision`, `keras_preprocessing`
+ Se usar DivLog: `openai`, `tiktoken` (requer python 3.8+)
### Primeiros passos
1. Execute a demonstração:
Para cada parser de logs, fornecemos uma demonstração para ajudar você a começar. Cada demonstração mostra o uso básico de um parser de logs específico e os hiperparâmetros a configurar. Por exemplo, o comando a seguir mostra como executar a demonstração para o Drain.
```
cd logparser/Drain
python demo.py
```
2. Execute o benchmark:
Para cada parser de logs, fornecemos um script de benchmark para executar o parsing de logs nos [conjuntos de dados loghub_2k](https://github.com/logpai/logparser/tree/main/data#loghub_2k) para avaliar a precisão do parsing. Você também pode usar [outros conjuntos de dados de benchmark para parsing de logs](https://github.com/logpai/logparser/tree/main/data#datasets).
```
cd logparser/Drain
python benchmark.py
```
Os resultados do benchmark podem ser encontrados no arquivo readme de cada parser, por exemplo, https://github.com/logpai/logparser/tree/main/logparser/Drain#benchmark.
3. Faça o parsing dos seus próprios logs:
É fácil aplicar o logparser para fazer o parsing dos seus próprios dados de log. Para isso, você precisa instalar o pacote logparser3 primeiro. Depois, você pode desenvolver seu próprio script seguindo o trecho de código abaixo para iniciar o parsing de logs. Veja o código de exemplo completo em [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)
```
Após executar o logparser, você pode obter os templates de eventos extraídos e os logs estruturados analisados na pasta de saída.
+ `*_templates.csv` (Veja o exemplo [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` (Veja o exemplo [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 em produção
O principal objetivo do logparser é o uso em pesquisa e benchmark. Pesquisadores podem usar o logparser como base de código para desenvolver novos parsers de logs, enquanto profissionais podem avaliar o desempenho e a escalabilidade dos métodos atuais de parsing de logs por meio de nossos benchmarks. Recomendamos fortemente que os profissionais experimentem o logparser em seu ambiente de produção. Mas esteja ciente de que a implementação atual do logparser está longe de estar pronta para uso em produção. Embora atualmente não tenhamos planos para isso, temos algumas sugestões para desenvolvedores que queiram construir um parser de logs inteligente em nível de produção.
+ Esteja ciente das [licenças de bibliotecas de terceiros](https://github.com/logpai/logparser/blob/main/LICENSE.md) usadas no logparser. Sugerimos manter um parser e excluir os demais e, em seguida, reconstruir a wheel do pacote. Isso não quebraria o uso do logparser.
+ Aprimore o logparser com eficiência e escalabilidade usando multiprocessamento, adicione recuperação de falhas, adicione persistência em disco ou na fila de mensagens Kafka.
+ O [Drain3](https://github.com/logpai/Drain3) fornece um bom exemplo de referência, construído com [melhorias práticas](https://github.com/logpai/Drain3#new-features) para cenários de produção.
### 🔥 Citação
Se você usar nossas ferramentas logparser ou resultados de benchmark em sua publicação, cite os seguintes artigos.
+ [**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.
### 🤗 Contribuidores
<!-- 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 -->
### Discussão
Bem-vindo(a) a participar do nosso grupo WeChat para qualquer pergunta ou discussão. Alternativamente, você pode [abrir uma issue aqui](https://github.com/logpai/logparser/issues/new).

| Publicação | Parser | Título do Artigo | Benchmark |
|---|