Skip to content

Commit 1098e39

Browse files
committed
wip: replace AppLogger with AppStructLogger
1 parent d0d2668 commit 1098e39

File tree

10 files changed

+53
-65
lines changed

10 files changed

+53
-65
lines changed

app/api/health.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
from starlette.concurrency import run_in_threadpool
77

88
from app.services.smtp import SMTPEmailService
9-
from app.utils.logging import AppLogger
9+
from app.utils.logging import AppStructLogger
1010

11-
logger = AppLogger().get_logger()
11+
logger = AppStructLogger().get_logger()
1212

1313
router = APIRouter()
1414

app/api/ml.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
from fastapi.responses import StreamingResponse
55

66
from app.services.llm import get_llm_service
7-
from app.utils.logging import AppLogger
7+
from app.utils.logging import AppStructLogger
88

9-
logger = AppLogger().get_logger()
9+
logger = AppStructLogger().get_logger()
1010

1111
router = APIRouter()
1212

app/api/stuff.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
from app.database import get_db
66
from app.models.stuff import Stuff
77
from app.schemas.stuff import StuffResponse, StuffSchema
8-
from app.utils.logging import AppLogger
8+
from app.utils.logging import AppStructLogger
99

10-
logger = AppLogger().get_logger()
10+
logger = AppStructLogger().get_logger()
1111

1212
router = APIRouter(prefix="/v1/stuff")
1313

app/api/user.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
from app.models.user import User
88
from app.schemas.user import TokenResponse, UserLogin, UserResponse, UserSchema
99
from app.services.auth import create_access_token
10-
from app.utils.logging import AppLogger
10+
from app.utils.logging import AppStructLogger
1111

12-
logger = AppLogger().get_logger()
12+
logger = AppStructLogger().get_logger()
1313

1414
router = APIRouter(prefix="/v1/user")
1515

app/database.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
44

55
from app.config import settings as global_settings
6-
from app.utils.logging import setup_structlog
6+
from app.utils.logging import AppStructLogger
77

8-
logger = setup_structlog()
8+
logger = AppStructLogger().get_logger()
99

1010
engine = create_async_engine(
1111
global_settings.asyncpg_url.unicode_string(),

app/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
from app.config import settings as global_settings
1616
from app.redis import get_redis
1717
from app.services.auth import AuthBearer
18-
from app.utils.logging import setup_structlog
18+
from app.utils.logging import AppStructLogger
1919

20-
logger = setup_structlog()
20+
logger = AppStructLogger().get_logger()
2121
templates = Jinja2Templates(directory=Path(__file__).parent.parent / "templates")
2222

2323
@asynccontextmanager

app/models/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
from sqlalchemy.ext.asyncio import AsyncSession
77
from sqlalchemy.orm import DeclarativeBase, declared_attr
88

9-
from app.utils.logging import AppLogger
9+
from app.utils.logging import AppStructLogger
1010

11-
logger = AppLogger().get_logger()
11+
logger = AppStructLogger().get_logger()
1212

1313

1414
class Base(DeclarativeBase):

app/services/auth.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
from app.config import settings as global_settings
88
from app.models.user import User
9-
from app.utils.logging import AppLogger
9+
from app.utils.logging import AppStructLogger
1010

11-
logger = AppLogger().get_logger()
11+
logger = AppStructLogger().get_logger()
1212

1313

1414
async def get_from_redis(request: Request, key: str):

app/services/smtp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
from pydantic import EmailStr
88

99
from app.config import settings as global_settings
10-
from app.utils.logging import AppLogger
10+
from app.utils.logging import AppStructLogger
1111
from app.utils.singleton import SingletonMetaNoArgs
1212

13-
logger = AppLogger().get_logger()
13+
logger = AppStructLogger().get_logger()
1414

1515

1616
@define

app/utils/logging.py

Lines changed: 35 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,9 @@
55

66
import orjson
77
import structlog
8-
from rich.console import Console
9-
from rich.logging import RichHandler
108
from whenever._whenever import Instant
119

12-
from app.utils.singleton import SingletonMeta
13-
14-
15-
class AppLogger(metaclass=SingletonMeta):
16-
_logger = None
17-
18-
def __init__(self):
19-
self._logger = logging.getLogger(__name__)
20-
21-
def get_logger(self):
22-
return self._logger
23-
24-
25-
class RichConsoleHandler(RichHandler):
26-
def __init__(self, width=200, style=None, **kwargs):
27-
super().__init__(
28-
console=Console(color_system="256", width=width, style=style, stderr=True),
29-
**kwargs,
30-
)
31-
10+
from app.utils.singleton import SingletonMetaNoArgs
3211

3312

3413
# TODO: merge this wrapper with the one in structlog under one hood of AppLogger
@@ -50,30 +29,39 @@ def flush(self):
5029
def close(self):
5130
self.handler.close()
5231

32+
# @define
33+
class AppStructLogger(metaclass=SingletonMetaNoArgs):
34+
_logger = None
5335

54-
def setup_structlog() -> structlog.BoundLogger:
55-
log_date = Instant.now().py_datetime().strftime("%Y%m%d")
56-
log_path = Path(f"{log_date}_{os.getpid()}.log")
57-
handler = RotatingFileHandler(
58-
filename=log_path,
59-
mode="a", # text mode
60-
maxBytes=10 * 1024 * 1024,
61-
backupCount=5,
62-
encoding="utf-8"
63-
)
64-
file_like = BytesToTextIOWrapper(handler)
65-
structlog.configure(
66-
cache_logger_on_first_use=True,
67-
wrapper_class=structlog.make_filtering_bound_logger(logging.INFO),
68-
processors=[
69-
structlog.contextvars.merge_contextvars,
70-
structlog.processors.add_log_level,
71-
structlog.processors.format_exc_info,
72-
structlog.processors.TimeStamper(fmt="iso", utc=True),
73-
structlog.processors.JSONRenderer(serializer=orjson.dumps),
74-
],
75-
logger_factory=structlog.BytesLoggerFactory(
76-
file=file_like
36+
def __init__(self):
37+
_log_date = Instant.now().py_datetime().strftime("%Y%m%d")
38+
_log_path = Path(f"{_log_date}_{os.getpid()}.log")
39+
_handler = RotatingFileHandler(
40+
filename=_log_path,
41+
mode="a", # text mode
42+
maxBytes=10 * 1024 * 1024,
43+
backupCount=5,
44+
encoding="utf-8"
45+
)
46+
structlog.configure(
47+
cache_logger_on_first_use=True,
48+
wrapper_class=structlog.make_filtering_bound_logger(logging.INFO),
49+
processors=[
50+
structlog.contextvars.merge_contextvars,
51+
structlog.processors.add_log_level,
52+
structlog.processors.format_exc_info,
53+
structlog.processors.TimeStamper(fmt="iso", utc=True),
54+
structlog.processors.JSONRenderer(serializer=orjson.dumps),
55+
],
56+
logger_factory=structlog.BytesLoggerFactory(
57+
file=BytesToTextIOWrapper(_handler)
58+
)
7759
)
78-
)
79-
return structlog.get_logger()
60+
self._logger = structlog.get_logger()
61+
62+
def get_logger(self) -> structlog.BoundLogger:
63+
"""
64+
Returns:
65+
structlog.BoundLogger: The configured logger instance.
66+
"""
67+
return self._logger

0 commit comments

Comments
 (0)