
Un kit de herramientas de aprendizaje automático para el análisis de logs [ICSE'19, DSN'16]
Logparser ofrece un conjunto de herramientas de aprendizaje automático y benchmarks para el parseo automático de logs, un paso crucial para el análisis estructurado de logs. Al aplicar logparser, los usuarios pueden extraer automáticamente plantillas de eventos de logs no estructurados y convertir los mensajes de log sin procesar en una secuencia de eventos estructurados. Este proceso también se conoce en la literatura como extracción de plantillas de mensajes, extracción de claves de log o agrupación de mensajes de log.

Un ejemplo de parseo de logs
pip install logparser3.💡 Te invitamos a enviar un PR para incorporar tu código de parser a logparser y añadir tu artículo a la tabla.
Recomendamos instalar el paquete logparser y sus dependencias mediante pip install.``` pip install logparser3
En particular, el paquete depende de los siguientes requisitos. Ten en cuenta que la coincidencia de expresiones regulares en Python es frágil, por lo que recomendamos fijar la biblioteca regex en la versión 2022.3.2.
Nota: Si te encuentras con ``"Error: need to escape..."``, sigue las instrucciones [aquí](https://github.com/logpai/logparser/issues/122).
+ python 3.6+
+ regex 2022.3.2
+ numpy
+ pandas
+ scipy
+ scikit-learn
Requisitos condicionales:
+ Si usas MoLFI: `deap`
+ Si usas SHISO: `nltk`
+ Si usas SLCT: `gcc`
+ Si usas LogCluster: `perl`
+ Si usas NuLog: `torch`, `torchvision`, `keras_preprocessing`
+ Si usas DivLog: `openai`, `tiktoken` (requieren python 3.8+)
### Primeros pasos
1. Ejecuta la demo:
Para cada analizador de logs, proporcionamos una demo para ayudarte a empezar. Cada demo muestra el uso básico de un analizador de logs específico y los hiperparámetros a configurar. Por ejemplo, el siguiente comando muestra cómo ejecutar la demo para Drain.
```
cd logparser/Drain
python demo.py
```
2. Ejecuta el benchmark:
Para cada analizador de logs, proporcionamos un script de benchmark para ejecutar el análisis de logs en los [datasets loghub_2k](https://github.com/logpai/logparser/tree/main/data#loghub_2k) con el fin de evaluar la precisión del análisis. También puedes usar [otros datasets de benchmark para el análisis de logs](https://github.com/logpai/logparser/tree/main/data#datasets).
```
cd logparser/Drain
python benchmark.py
```
Los resultados del benchmark se pueden encontrar en el archivo readme de cada analizador, p. ej., https://github.com/logpai/logparser/tree/main/logparser/Drain#benchmark.
3. Analiza tus propios logs:
Es fácil aplicar logparser para analizar tus propios datos de logs. Para ello, primero debes instalar el paquete logparser3. Luego puedes desarrollar tu propio script siguiendo el siguiente fragmento de código para comenzar el análisis de logs. Consulta el código de ejemplo completo en [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)
```
Después de ejecutar logparser, puedes obtener las plantillas de eventos extraídas y los logs estructurados analizados en la carpeta de salida.
+ `*_templates.csv` (Consulta el ejemplo [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` (Consulta el ejemplo [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 en producción
El objetivo principal de logparser es el uso con fines de investigación y benchmark. Los investigadores pueden usar logparser como base de código para desarrollar nuevos analizadores de logs, mientras que los profesionales pueden evaluar el rendimiento y la escalabilidad de los métodos actuales de análisis de logs a través de nuestro benchmark. Recomendamos encarecidamente a los profesionales que prueben logparser en su entorno de producción. Pero ten en cuenta que la implementación actual de logparser está lejos de estar lista para su uso en producción. Aunque actualmente no tenemos planes de hacerlo, sí tenemos algunas sugerencias para los desarrolladores que quieran construir un analizador de logs inteligente de nivel de producción.
+ Ten en cuenta las [licencias de bibliotecas de terceros](https://github.com/logpai/logparser/blob/main/LICENSE.md) utilizadas en logparser. Sugerimos conservar un solo analizador y eliminar los demás, y luego reconstruir el wheel del paquete. Esto no rompe el uso de logparser.
+ Mejora logparser en cuanto a eficiencia y escalabilidad con multiprocesamiento, añade recuperación de fallos y añade persistencia en disco o en la cola de mensajes Kafka.
+ [Drain3](https://github.com/logpai/Drain3) proporciona un buen ejemplo de referencia que se ha construido con [mejoras prácticas](https://github.com/logpai/Drain3#new-features) para escenarios de producción.
### 🔥 Citación
Si utilizas nuestras herramientas logparser o los resultados del benchmark en tu publicación, cita los siguientes artículos.
+ [**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.
### 🤗 Colaboradores
<!-- 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 -->
### Discusión
Te invitamos a unirte a nuestro grupo de WeChat para cualquier pregunta o discusión. Alternativamente, puedes [abrir un issue aquí](https://github.com/logpai/logparser/issues/new).

| Publicación | Parser | Título del artículo | Benchmark |
|---|
| IPOM'03 | SLCT | A Data Clustering Algorithm for Mining Patterns from Event Logs, por Risto Vaarandi. | ↗️ |
| QSIC'08 | AEL | Abstracting Execution Logs to Execution Events for Enterprise Applications, por Zhen Ming Jiang, Ahmed E. Hassan, Parminder Flora, Gilbert Hamann. | ↗️ |
| KDD'09 | IPLoM | Clustering Event Logs Using Iterative Partitioning, por Adetokunbo Makanju, A. Nur Zincir-Heywood y Evangelos E. Milios. | ↗️ |
| ICDM'09 | LKE | Execution Anomaly Detection in Distributed Systems through Unstructured Log Analysis, por Qiang Fu, Jian-Guang Lou, Yi Wang, Jiang Li. [Microsoft] | ↗️ |
| MSR'10 | LFA | Abstracting Log Lines to Log Event Types for Mining Software System Logs, por Meiyappan Nagappan y Mladen A. Vouk. | ↗️ |
| CIKM'11 | LogSig | LogSig: Generating System Events from Raw Textual Logs, por Liang Tang, Tao Li y Chang-Shing Perng. | ↗️ |
| SCC'13 | SHISO | Incremental Mining of System Log Format, por Masayoshi Mizutani. | ↗️ |
| CNSM'15 | LogCluster | LogCluster - A Data Clustering and Pattern Mining Algorithm for Event Logs, por Risto Vaarandi y Mauno Pihelgas. | ↗️ |
| CNSM'15 | LenMa | Length Matters: Clustering System Log Messages using Length of Words, por Keiichi Shima. | ↗️ |
| CIKM'16 | LogMine | LogMine: Fast Pattern Recognition for Log Analytics, por Hossein Hamooni, Biplob Debnath, Jianwu Xu, Hui Zhang, Geoff Jiang y Adbullah Mueen. [NEC] | ↗️ |
| ICDM'16 | Spell | Spell: Streaming Parsing of System Event Logs, por Min Du y Feifei Li. | ↗️ |
| ICWS'17 | Drain | Drain: An Online Log Parsing Approach with Fixed Depth Tree, por Pinjia He, Jieming Zhu, Zibin Zheng y Michael R. Lyu. | ↗️ |
| ICPC'18 | MoLFI | A Search-based Approach for Accurate Identification of Log Message Formats, por Salma Messaoudi, Annibale Panichella, Domenico Bianculli, Lionel Briand y Raimondas Sasnauskas. | ↗️ |
| TSE'20 | Logram | Logram: Efficient Log Parsing Using n-Gram Dictionaries, por Hetong Dai, Heng Li, Che-Shao Chen, Weiyi Shang y Tse-Hsun (Peter) Chen. | ↗️ |
| ECML-PKDD'20 | NuLog | Self-Supervised Log Parsing, por Sasho Nedelkoski, Jasmin Bogatinovski, Alexander Acker, Jorge Cardoso y Odej Kao. | ↗️ |
| ICSME'22 | ULP | An Effective Approach for Parsing Large Log Files, por Issam Sedki, Abdelwahab Hamou-Lhadj, Otmane Ait-Mohamed y Mohammed A. Shehab. | ↗️ |
| TSC'23 | Brain | Brain: Log Parsing with Bidirectional Parallel Tree, por Siyu Yu, Pinjia He, Ningjiang Chen y Yifan Wu. | ↗️ |
| ICSE'24 | DivLog | DivLog: Log Parsing with Prompt Enhanced In-Context Learning, por Junjielong Xu, Ruichun Yang, Yintong Huo, Chengyu Zhang y Pinjia He. | ↗️ |