Skip to content

Commit 0814328

Browse files
authored
Enhanced Logging Configuration and Uvicorn Integration (#9)
1 parent 1508ee9 commit 0814328

File tree

4 files changed

+42
-4
lines changed

4 files changed

+42
-4
lines changed

py_spring_core/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from py_spring_core.event.commons import ApplicationEvent
1717
from py_spring_core.event.application_event_handler_registry import EventListener
1818

19-
__version__ = "0.0.14"
19+
__version__ = "0.0.15"
2020

2121
__all__ = [
2222
"PySpringApplication",

py_spring_core/core/application/loguru_config.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ class LogLevel(str, Enum):
1414
CRITICAL = "CRITICAL"
1515

1616

17+
class LogFormat(str, Enum):
18+
TEXT = "text"
19+
JSON = "json"
20+
1721
class LoguruConfig(BaseModel):
1822
log_format: str = (
1923
"<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
@@ -27,3 +31,4 @@ class LoguruConfig(BaseModel):
2731
log_file_path: Optional[str] = "./logs/app.log"
2832
enable_backtrace: bool = True
2933
enable_diagnose: bool = True
34+
format: LogFormat = LogFormat.TEXT

py_spring_core/core/application/py_spring_application.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
import os
23
from typing import Any, Callable, Iterable, Type
34

@@ -21,6 +22,7 @@
2122
from py_spring_core.core.application.context.application_context_config import (
2223
ApplicationContextConfig,
2324
)
25+
from py_spring_core.core.application.loguru_config import LogFormat
2426
from py_spring_core.core.entities.bean_collection import BeanCollection
2527
from py_spring_core.core.entities.component import Component, ComponentLifeCycle
2628
from py_spring_core.core.entities.controllers.rest_controller import RestController
@@ -97,14 +99,16 @@ def __configure_logging(self):
9799
config = self.app_config.loguru_config
98100
if not config.log_file_path:
99101
return
100-
102+
103+
# Use the format field from config which contains the actual format string
101104
logger.add(
102105
config.log_file_path,
103-
format=config.log_format,
104106
level=config.log_level,
105107
rotation=config.log_rotation,
106108
retention=config.log_retention,
109+
serialize=config.format == LogFormat.JSON,
107110
)
111+
self.__configure_uvicorn_logging()
108112

109113
def _get_system_managed_classes(self) -> Iterable[Type[Component]]:
110114
return [
@@ -209,11 +213,40 @@ def __init_controllers(self) -> None:
209213
self.fastapi.include_router(router)
210214
controller.register_middlewares()
211215

216+
def __configure_uvicorn_logging(self):
217+
"""Configure Uvicorn to use Loguru instead of default logging."""
218+
219+
220+
# Intercept standard logging and redirect to loguru
221+
class InterceptHandler(logging.Handler):
222+
def emit(self, record):
223+
# Get corresponding Loguru level if it exists
224+
try:
225+
level = logger.level(record.levelname).name
226+
except ValueError:
227+
level = record.levelno
228+
229+
# Find caller from where originated the logged message
230+
frame, depth = logging.currentframe(), 2
231+
while frame and frame.f_code.co_filename == logging.__file__:
232+
frame = frame.f_back
233+
depth += 1
234+
235+
logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())
236+
237+
# Remove default uvicorn logger and add intercept handler
238+
logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)
239+
212240
def __run_server(self) -> None:
241+
# Configure Uvicorn to use Loguru
242+
243+
244+
# Run uvicorn server
213245
uvicorn.run(
214246
self.fastapi,
215247
host=self.app_config.server_config.host,
216248
port=self.app_config.server_config.port,
249+
log_config=None, # Disable uvicorn's default logging
217250
)
218251

219252
def run(self) -> None:

py_spring_core/event/application_event_handler_registry.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def post_construct(self) -> None:
6161
logger.info("Initializing event handlers...")
6262
self._init_event_handlers()
6363
logger.info("Starting event message handler thread...")
64-
Thread(target= self._handle_messages).start()
64+
Thread(target= self._handle_messages, daemon=True).start()
6565

6666
def _init_event_handlers(self) -> None:
6767
app_context = self.get_application_context()

0 commit comments

Comments
 (0)