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()