logger-tracker 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
File without changes
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: logger-tracker
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Libreria estandar para manejo de logs estandar
|
|
5
|
+
Author: damian27goa@gmail.com
|
|
6
|
+
Requires-Python: >=3.13,<4.0
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
9
|
+
Requires-Dist: pytest
|
|
10
|
+
Requires-Dist: rich
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
|
|
13
|
+
# Logger Tracker
|
|
14
|
+
|
|
15
|
+
Una librería de logging estandarizada para Python que proporciona trazabilidad mediante UUIDs únicos por hilo de ejecución, con soporte para salida enriquecida en consola.
|
|
16
|
+
|
|
17
|
+
## Descripción
|
|
18
|
+
|
|
19
|
+
Logger Tracker es un módulo de logging diseñado para entornos concurrentes y aplicaciones web. Proporciona:
|
|
20
|
+
|
|
21
|
+
- **UUIDs únicos por hilo**: Cada log incluye un identificador único para trazabilidad en entornos multi-hilo
|
|
22
|
+
- **Salida enriquecida**: Usa Rich para tracebacks y formateo mejorado en consola
|
|
23
|
+
- **Configuración automática**: Se configura al importar el módulo
|
|
24
|
+
- **API simple**: Funciones de logging estandarizadas con acceso directo
|
|
25
|
+
- **Integración con frameworks**: Soporte nativo para Flask/Werkzeug
|
|
26
|
+
|
|
27
|
+
## Instalación
|
|
28
|
+
|
|
29
|
+
Instala desde PyPI:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
pip install logguer-tracker
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
O desde el código fuente:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
git clone https://github.com/tu-usuario/logguer-tracker.git
|
|
39
|
+
cd logguer-tracker
|
|
40
|
+
pip install -e .
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Uso Básico
|
|
44
|
+
|
|
45
|
+
### Importación y configuración automática
|
|
46
|
+
|
|
47
|
+
Simplemente importa el módulo para configurar el logging automáticamente:
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
import logger_tracker
|
|
51
|
+
|
|
52
|
+
# El logging ya está configurado con UUIDs y Rich handler
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Uso de la API principal
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
from logger_tracker import get_logger
|
|
59
|
+
|
|
60
|
+
# Obtener un logger con funciones de logging
|
|
61
|
+
logger = get_logger("mi_modulo")
|
|
62
|
+
|
|
63
|
+
logger["info"]("Mensaje informativo")
|
|
64
|
+
logger["debug"]("Mensaje de debug")
|
|
65
|
+
logger["warning"]("Mensaje de advertencia")
|
|
66
|
+
logger["error"]("Mensaje de error")
|
|
67
|
+
logger["critical"]("Mensaje crítico")
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Uso de funciones legacy
|
|
71
|
+
|
|
72
|
+
Para compatibilidad con código existente:
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
from logger_tracker import logg_info, logg_debug, logg_warning, logg_error, logg_critical
|
|
76
|
+
|
|
77
|
+
logg_info("Mensaje informativo")
|
|
78
|
+
logg_debug("Mensaje de debug")
|
|
79
|
+
logg_warning("Mensaje de advertencia")
|
|
80
|
+
logg_error("Mensaje de error")
|
|
81
|
+
logg_critical("Mensaje crítico")
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Características
|
|
85
|
+
|
|
86
|
+
- **Thread-safe**: UUIDs únicos por hilo de ejecución
|
|
87
|
+
- **Trazabilidad**: Cada log incluye un UUID para seguimiento
|
|
88
|
+
- **Salida enriquecida**: Tracebacks coloreados y formateados con Rich
|
|
89
|
+
- **Configuración automática**: No requiere configuración manual
|
|
90
|
+
- **Integración con Flask**: Soporte automático para logging de Werkzeug
|
|
91
|
+
- **API flexible**: Tanto dict-based como funciones directas
|
|
92
|
+
|
|
93
|
+
## API
|
|
94
|
+
|
|
95
|
+
### Funciones principales
|
|
96
|
+
|
|
97
|
+
- `setup_logging()`: Configura el sistema de logging (llamado automáticamente al importar)
|
|
98
|
+
- `get_logger(name: str) -> dict`: Devuelve un diccionario con funciones de logging
|
|
99
|
+
- `attach_logger_to_werkzeug()`: Integra el logging con Flask/Werkzeug
|
|
100
|
+
|
|
101
|
+
### Funciones legacy
|
|
102
|
+
|
|
103
|
+
- `logg_info(message)`
|
|
104
|
+
- `logg_debug(message)`
|
|
105
|
+
- `logg_warning(message)`
|
|
106
|
+
- `logg_error(message)`
|
|
107
|
+
- `logg_critical(message)`
|
|
108
|
+
|
|
109
|
+
## Ejemplos
|
|
110
|
+
|
|
111
|
+
### En una aplicación Flask
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
from flask import Flask
|
|
115
|
+
from logger_tracker import get_logger, attach_logger_to_werkzeug
|
|
116
|
+
|
|
117
|
+
app = Flask(__name__)
|
|
118
|
+
|
|
119
|
+
# Configurar logging para Flask
|
|
120
|
+
attach_logger_to_werkzeug()
|
|
121
|
+
|
|
122
|
+
logger = get_logger("flask_app")
|
|
123
|
+
|
|
124
|
+
@app.route('/')
|
|
125
|
+
def hello():
|
|
126
|
+
logger["info"]("Solicitud a la ruta principal")
|
|
127
|
+
return "Hello World!"
|
|
128
|
+
|
|
129
|
+
if __name__ == '__main__':
|
|
130
|
+
app.run()
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### En un script multi-hilo
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
import threading
|
|
137
|
+
import time
|
|
138
|
+
from logger_tracker import get_logger
|
|
139
|
+
|
|
140
|
+
def worker(worker_id):
|
|
141
|
+
logger = get_logger(f"worker_{worker_id}")
|
|
142
|
+
logger["info"](f"Trabajador {worker_id} iniciado")
|
|
143
|
+
time.sleep(1)
|
|
144
|
+
logger["info"](f"Trabajador {worker_id} finalizado")
|
|
145
|
+
|
|
146
|
+
# Crear múltiples hilos
|
|
147
|
+
threads = []
|
|
148
|
+
for i in range(3):
|
|
149
|
+
t = threading.Thread(target=worker, args=(i,))
|
|
150
|
+
threads.append(t)
|
|
151
|
+
t.start()
|
|
152
|
+
|
|
153
|
+
for t in threads:
|
|
154
|
+
t.join()
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Cada hilo tendrá su propio UUID en los logs, permitiendo trazabilidad completa.
|
|
158
|
+
|
|
159
|
+
## Formato de salida
|
|
160
|
+
|
|
161
|
+
Los logs se muestran en el formato:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
[UUID] Mensaje
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Ejemplo:
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
[550e8400-e29b-41d4-a716-446655440000] Aplicación iniciada
|
|
171
|
+
[550e8400-e29b-41d4-a716-446655440000] Procesando solicitud
|
|
172
|
+
[6ba7b810-9dad-11d1-80b4-00c04fd430c8] Nuevo hilo iniciado
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Requisitos
|
|
176
|
+
|
|
177
|
+
- Python >= 3.13
|
|
178
|
+
- rich
|
|
179
|
+
- pytest (para tests)
|
|
180
|
+
|
|
181
|
+
## Licencia
|
|
182
|
+
|
|
183
|
+
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
|
|
184
|
+
|
|
185
|
+
## Contribución
|
|
186
|
+
|
|
187
|
+
Para contribuir:
|
|
188
|
+
|
|
189
|
+
1. Fork el repositorio
|
|
190
|
+
2. Crea una rama para tu feature
|
|
191
|
+
3. Ejecuta los tests: `pytest`
|
|
192
|
+
4. Envía un pull request
|
|
193
|
+
|
|
194
|
+
## Soporte
|
|
195
|
+
|
|
196
|
+
Para reportar bugs o solicitar features, usa los issues de GitHub.
|
|
197
|
+
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Logger Tracker
|
|
2
|
+
|
|
3
|
+
Una librería de logging estandarizada para Python que proporciona trazabilidad mediante UUIDs únicos por hilo de ejecución, con soporte para salida enriquecida en consola.
|
|
4
|
+
|
|
5
|
+
## Descripción
|
|
6
|
+
|
|
7
|
+
Logger Tracker es un módulo de logging diseñado para entornos concurrentes y aplicaciones web. Proporciona:
|
|
8
|
+
|
|
9
|
+
- **UUIDs únicos por hilo**: Cada log incluye un identificador único para trazabilidad en entornos multi-hilo
|
|
10
|
+
- **Salida enriquecida**: Usa Rich para tracebacks y formateo mejorado en consola
|
|
11
|
+
- **Configuración automática**: Se configura al importar el módulo
|
|
12
|
+
- **API simple**: Funciones de logging estandarizadas con acceso directo
|
|
13
|
+
- **Integración con frameworks**: Soporte nativo para Flask/Werkzeug
|
|
14
|
+
|
|
15
|
+
## Instalación
|
|
16
|
+
|
|
17
|
+
Instala desde PyPI:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pip install logguer-tracker
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
O desde el código fuente:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
git clone https://github.com/tu-usuario/logguer-tracker.git
|
|
27
|
+
cd logguer-tracker
|
|
28
|
+
pip install -e .
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Uso Básico
|
|
32
|
+
|
|
33
|
+
### Importación y configuración automática
|
|
34
|
+
|
|
35
|
+
Simplemente importa el módulo para configurar el logging automáticamente:
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
import logger_tracker
|
|
39
|
+
|
|
40
|
+
# El logging ya está configurado con UUIDs y Rich handler
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Uso de la API principal
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
from logger_tracker import get_logger
|
|
47
|
+
|
|
48
|
+
# Obtener un logger con funciones de logging
|
|
49
|
+
logger = get_logger("mi_modulo")
|
|
50
|
+
|
|
51
|
+
logger["info"]("Mensaje informativo")
|
|
52
|
+
logger["debug"]("Mensaje de debug")
|
|
53
|
+
logger["warning"]("Mensaje de advertencia")
|
|
54
|
+
logger["error"]("Mensaje de error")
|
|
55
|
+
logger["critical"]("Mensaje crítico")
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Uso de funciones legacy
|
|
59
|
+
|
|
60
|
+
Para compatibilidad con código existente:
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from logger_tracker import logg_info, logg_debug, logg_warning, logg_error, logg_critical
|
|
64
|
+
|
|
65
|
+
logg_info("Mensaje informativo")
|
|
66
|
+
logg_debug("Mensaje de debug")
|
|
67
|
+
logg_warning("Mensaje de advertencia")
|
|
68
|
+
logg_error("Mensaje de error")
|
|
69
|
+
logg_critical("Mensaje crítico")
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Características
|
|
73
|
+
|
|
74
|
+
- **Thread-safe**: UUIDs únicos por hilo de ejecución
|
|
75
|
+
- **Trazabilidad**: Cada log incluye un UUID para seguimiento
|
|
76
|
+
- **Salida enriquecida**: Tracebacks coloreados y formateados con Rich
|
|
77
|
+
- **Configuración automática**: No requiere configuración manual
|
|
78
|
+
- **Integración con Flask**: Soporte automático para logging de Werkzeug
|
|
79
|
+
- **API flexible**: Tanto dict-based como funciones directas
|
|
80
|
+
|
|
81
|
+
## API
|
|
82
|
+
|
|
83
|
+
### Funciones principales
|
|
84
|
+
|
|
85
|
+
- `setup_logging()`: Configura el sistema de logging (llamado automáticamente al importar)
|
|
86
|
+
- `get_logger(name: str) -> dict`: Devuelve un diccionario con funciones de logging
|
|
87
|
+
- `attach_logger_to_werkzeug()`: Integra el logging con Flask/Werkzeug
|
|
88
|
+
|
|
89
|
+
### Funciones legacy
|
|
90
|
+
|
|
91
|
+
- `logg_info(message)`
|
|
92
|
+
- `logg_debug(message)`
|
|
93
|
+
- `logg_warning(message)`
|
|
94
|
+
- `logg_error(message)`
|
|
95
|
+
- `logg_critical(message)`
|
|
96
|
+
|
|
97
|
+
## Ejemplos
|
|
98
|
+
|
|
99
|
+
### En una aplicación Flask
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
from flask import Flask
|
|
103
|
+
from logger_tracker import get_logger, attach_logger_to_werkzeug
|
|
104
|
+
|
|
105
|
+
app = Flask(__name__)
|
|
106
|
+
|
|
107
|
+
# Configurar logging para Flask
|
|
108
|
+
attach_logger_to_werkzeug()
|
|
109
|
+
|
|
110
|
+
logger = get_logger("flask_app")
|
|
111
|
+
|
|
112
|
+
@app.route('/')
|
|
113
|
+
def hello():
|
|
114
|
+
logger["info"]("Solicitud a la ruta principal")
|
|
115
|
+
return "Hello World!"
|
|
116
|
+
|
|
117
|
+
if __name__ == '__main__':
|
|
118
|
+
app.run()
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### En un script multi-hilo
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
import threading
|
|
125
|
+
import time
|
|
126
|
+
from logger_tracker import get_logger
|
|
127
|
+
|
|
128
|
+
def worker(worker_id):
|
|
129
|
+
logger = get_logger(f"worker_{worker_id}")
|
|
130
|
+
logger["info"](f"Trabajador {worker_id} iniciado")
|
|
131
|
+
time.sleep(1)
|
|
132
|
+
logger["info"](f"Trabajador {worker_id} finalizado")
|
|
133
|
+
|
|
134
|
+
# Crear múltiples hilos
|
|
135
|
+
threads = []
|
|
136
|
+
for i in range(3):
|
|
137
|
+
t = threading.Thread(target=worker, args=(i,))
|
|
138
|
+
threads.append(t)
|
|
139
|
+
t.start()
|
|
140
|
+
|
|
141
|
+
for t in threads:
|
|
142
|
+
t.join()
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Cada hilo tendrá su propio UUID en los logs, permitiendo trazabilidad completa.
|
|
146
|
+
|
|
147
|
+
## Formato de salida
|
|
148
|
+
|
|
149
|
+
Los logs se muestran en el formato:
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
[UUID] Mensaje
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Ejemplo:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
[550e8400-e29b-41d4-a716-446655440000] Aplicación iniciada
|
|
159
|
+
[550e8400-e29b-41d4-a716-446655440000] Procesando solicitud
|
|
160
|
+
[6ba7b810-9dad-11d1-80b4-00c04fd430c8] Nuevo hilo iniciado
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Requisitos
|
|
164
|
+
|
|
165
|
+
- Python >= 3.13
|
|
166
|
+
- rich
|
|
167
|
+
- pytest (para tests)
|
|
168
|
+
|
|
169
|
+
## Licencia
|
|
170
|
+
|
|
171
|
+
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
|
|
172
|
+
|
|
173
|
+
## Contribución
|
|
174
|
+
|
|
175
|
+
Para contribuir:
|
|
176
|
+
|
|
177
|
+
1. Fork el repositorio
|
|
178
|
+
2. Crea una rama para tu feature
|
|
179
|
+
3. Ejecuta los tests: `pytest`
|
|
180
|
+
4. Envía un pull request
|
|
181
|
+
|
|
182
|
+
## Soporte
|
|
183
|
+
|
|
184
|
+
Para reportar bugs o solicitar features, usa los issues de GitHub.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
[tool.poetry]
|
|
2
|
+
name = "logger-tracker"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Libreria estandar para manejo de logs estandar"
|
|
5
|
+
authors = ["damian27goa@gmail.com"]
|
|
6
|
+
readme = "README.md"
|
|
7
|
+
packages = [
|
|
8
|
+
{ include = "logger_tracker", from = "src" }
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
[tool.poetry.dependencies]
|
|
12
|
+
python = "^3.13"
|
|
13
|
+
rich = "*"
|
|
14
|
+
pytest = "*"
|
|
15
|
+
|
|
16
|
+
[tool.poetry.group.dev.dependencies]
|
|
17
|
+
# Dependencias de desarrollo aquí si las tienes
|
|
18
|
+
|
|
19
|
+
[tool.pytest.ini_options]
|
|
20
|
+
testpaths = ["tests"]
|
|
21
|
+
python_files = ["test_*.py"]
|
|
22
|
+
python_classes = ["Test*"]
|
|
23
|
+
python_functions = ["test_*"]
|
|
24
|
+
|
|
25
|
+
[build-system]
|
|
26
|
+
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
|
27
|
+
build-backend = "poetry.core.masonry.api"
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# -------------------------
|
|
2
|
+
# Copyright (c) 2026 Erick Damian Gonzalez Aranda
|
|
3
|
+
#
|
|
4
|
+
# Este software y su código fuente han sido desarrollados por Erick Damian Gonzalez Aranda, mediante
|
|
5
|
+
# NeuronexoTec Organizacion de desarrollo de Software.
|
|
6
|
+
# Todos los derechos están reservados.
|
|
7
|
+
#
|
|
8
|
+
# Se permite el uso, copia y modificación del código únicamente para fines
|
|
9
|
+
# personales, educativos o internos, siempre que se conserve este aviso
|
|
10
|
+
# de copyright y no se redistribuya el software, total o parcialmente,
|
|
11
|
+
# sin autorización expresa del autor.
|
|
12
|
+
#
|
|
13
|
+
# Queda estrictamente prohibida la venta, sublicencia, redistribución,
|
|
14
|
+
# exposición como servicio (SaaS), o incorporación en productos comerciales
|
|
15
|
+
# sin consentimiento previo y por escrito del autor.
|
|
16
|
+
#
|
|
17
|
+
# Este software se proporciona "tal cual", sin garantía de ningún tipo,
|
|
18
|
+
# expresa o implícita, incluyendo pero no limitado a garantías de
|
|
19
|
+
# comercialización, idoneidad para un propósito particular o ausencia
|
|
20
|
+
# de defectos.
|
|
21
|
+
#
|
|
22
|
+
# El autor no será responsable por ningún daño directo o indirecto
|
|
23
|
+
# derivado del uso de este software.
|
|
24
|
+
# -------------------------
|
|
25
|
+
|
|
26
|
+
import logging
|
|
27
|
+
import threading
|
|
28
|
+
import uuid
|
|
29
|
+
from typing import Callable
|
|
30
|
+
|
|
31
|
+
from rich.logging import RichHandler
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# -------------------------
|
|
35
|
+
# Almacenamiento thread-local
|
|
36
|
+
# Responsabilidad:
|
|
37
|
+
# Mantener un UUID único por hilo de ejecución
|
|
38
|
+
# para trazabilidad de logs en entornos concurrentes
|
|
39
|
+
# -------------------------
|
|
40
|
+
_request_uuid = threading.local()
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# -------------------------
|
|
44
|
+
# Filtro de logging con UUID
|
|
45
|
+
# Responsabilidad:
|
|
46
|
+
# Inyectar un UUID por request/hilo
|
|
47
|
+
# en cada registro de log
|
|
48
|
+
#
|
|
49
|
+
# Uso:
|
|
50
|
+
# Se asocia a handlers de logging
|
|
51
|
+
# -------------------------
|
|
52
|
+
class UUIDLogFilter(logging.Filter):
|
|
53
|
+
|
|
54
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
|
55
|
+
if not hasattr(_request_uuid, "id"):
|
|
56
|
+
_request_uuid.id = str(uuid.uuid4())
|
|
57
|
+
|
|
58
|
+
record.uuid = _request_uuid.id
|
|
59
|
+
return True
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# -------------------------
|
|
63
|
+
# Configuración del sistema de logging
|
|
64
|
+
# Responsabilidad:
|
|
65
|
+
# Inicializar logging global con:
|
|
66
|
+
# - UUID por request
|
|
67
|
+
# - RichHandler para salida en consola
|
|
68
|
+
# - Formato uniforme
|
|
69
|
+
#
|
|
70
|
+
# Side effects:
|
|
71
|
+
# - Configura logging root
|
|
72
|
+
# - Expone funciones de logging de uso rápido
|
|
73
|
+
# -------------------------
|
|
74
|
+
def setup_logging() -> None:
|
|
75
|
+
uuid_filter = UUIDLogFilter()
|
|
76
|
+
|
|
77
|
+
handler = RichHandler(
|
|
78
|
+
rich_tracebacks=True,
|
|
79
|
+
tracebacks_suppress=[logging]
|
|
80
|
+
)
|
|
81
|
+
handler.addFilter(uuid_filter)
|
|
82
|
+
|
|
83
|
+
logging.basicConfig(
|
|
84
|
+
level=logging.DEBUG,
|
|
85
|
+
format="[%(uuid)s] %(message)s",
|
|
86
|
+
datefmt="[%X]",
|
|
87
|
+
handlers=[handler]
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# -------------------------
|
|
92
|
+
# API pública de logging
|
|
93
|
+
# Responsabilidad:
|
|
94
|
+
# Proveer accesos directos a niveles
|
|
95
|
+
# de logging estandarizados
|
|
96
|
+
# -------------------------
|
|
97
|
+
def get_logger(name: str = __name__) -> dict[str, Callable]:
|
|
98
|
+
logger = logging.getLogger(name)
|
|
99
|
+
return {
|
|
100
|
+
"info": logger.info,
|
|
101
|
+
"debug": logger.debug,
|
|
102
|
+
"warning": logger.warning,
|
|
103
|
+
"error": logger.error,
|
|
104
|
+
"critical": logger.critical,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
def attach_logger_to_werkzeug():
|
|
108
|
+
werkzeug_logger = logging.getLogger("werkzeug")
|
|
109
|
+
app_logger = logging.getLogger("app")
|
|
110
|
+
|
|
111
|
+
werkzeug_logger.handlers = app_logger.handlers
|
|
112
|
+
werkzeug_logger.setLevel(logging.INFO)
|
|
113
|
+
werkzeug_logger.propagate = False
|
|
114
|
+
|
|
115
|
+
# -------------------------
|
|
116
|
+
# API LEGACY (compatibilidad)
|
|
117
|
+
# Responsabilidad:
|
|
118
|
+
# Mantener compatibilidad con imports existentes:
|
|
119
|
+
# logger.logg_info(...)
|
|
120
|
+
# -------------------------
|
|
121
|
+
_logger = logging.getLogger("app")
|
|
122
|
+
|
|
123
|
+
logg_info = _logger.info
|
|
124
|
+
logg_debug = _logger.debug
|
|
125
|
+
logg_warning = _logger.warning
|
|
126
|
+
logg_error = _logger.error
|
|
127
|
+
logg_critical = _logger.critical
|
|
128
|
+
|
|
129
|
+
# -------------------------
|
|
130
|
+
# Bootstrap automático del logging
|
|
131
|
+
# -------------------------
|
|
132
|
+
setup_logging()
|