Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Change log for risclog.logging
2.2.2 (unreleased)
==================

- Nothing changed yet.
- fix: Fix log_decorator type hints


2.2.1 (2026-02-27)
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
# Add your dependencies here
"structlog",
"stamina",
"typing_extensions",
],
extras_require={
"docs": [
Expand Down
9 changes: 4 additions & 5 deletions src/risclog/logging/__init__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
from typing import Any, Callable, TypeVar
from typing import Callable

from risclog.logging.decorators import log_decorator as logging_decorator
from risclog.logging.decorators import log_decorator
from risclog.logging.log import HybridLogger, get_logger as old_get_logger
from risclog.logging.log import getLogger as logger

F = TypeVar("F", bound=Callable[..., Any])

getLogger: Callable[[str], HybridLogger] = logger
log_decorator: Callable[[F], F] = logging_decorator

# DeprecationWarning: 'get_logger' is obsolete and will be removed from version 2.1.0. Please use 'getLogger' instead.
get_logger: Callable[[str], HybridLogger] = old_get_logger

__all__ = ["getLogger", "get_logger", "log_decorator"]
33 changes: 27 additions & 6 deletions src/risclog/logging/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@
from concurrent.futures import ThreadPoolExecutor
from functools import partial, wraps
from pathlib import Path
from typing import Any
from typing import Any, Callable, TypeVar, cast, overload

from typing_extensions import ParamSpec

from risclog.logging.log import HybridLogger, getLogger

P = ParamSpec("P")
R = TypeVar("R")


def exception_to_string(excp: BaseException) -> str:
stack = traceback.extract_stack()[:-3] + traceback.extract_tb(excp.__traceback__)
Expand All @@ -31,19 +36,35 @@ def format_args(func: Any, args: tuple, kwargs: dict) -> tuple: # type: ignore[
return tuple(formatted_args + formatted_kwargs)


def log_decorator(func=None, send_email=False): # type: ignore[no-untyped-def]
@overload
def log_decorator(func: Callable[P, R], send_email: bool = False) -> Callable[P, R]: ...


@overload
def log_decorator(
func: None = None, send_email: bool = False
) -> Callable[[Callable[P, R]], Callable[P, R]]: ...


def log_decorator(
func: Callable[P, R] | None = None, send_email: bool = False
) -> Callable[P, R] | Callable[[Callable[P, R]], Callable[P, R]]:
from risclog.logging.sender import smtp_email_send

if func is None:
return lambda m: log_decorator(m, send_email)

def _decorator(method: Callable[P, R]) -> Callable[P, R]:
return log_decorator(method, send_email)

return _decorator

logger: HybridLogger = getLogger(func.__module__)
method_id = id(func.__name__)

if inspect.iscoroutinefunction(func):

@wraps(func)
async def wrapper(*args, **kwargs): # type: ignore[no-untyped-def]
async def wrapper(*args: P.args, **kwargs: P.kwargs) -> Any:
if not logging.getLogger(logger.name).isEnabledFor(logging.DEBUG):
try:
return await func(*args, **kwargs)
Expand Down Expand Up @@ -108,7 +129,7 @@ async def wrapper(*args, **kwargs): # type: ignore[no-untyped-def]
else:

@wraps(func)
def wrapper(*args, **kwargs): # type: ignore[no-untyped-def]
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
if not logging.getLogger(logger.name).isEnabledFor(logging.DEBUG):
try:
return func(*args, **kwargs)
Expand Down Expand Up @@ -168,4 +189,4 @@ def wrapper(*args, **kwargs): # type: ignore[no-untyped-def]
)
raise

return wrapper
return cast(Callable[P, R], wrapper)
2 changes: 1 addition & 1 deletion src/risclog/logging/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ def decorator(self, send_email: bool = False): # type: ignore[no-untyped-def]
)
from risclog.logging import log_decorator

return partial(log_decorator, send_email=send_email) # type: ignore[call-arg]
return partial(log_decorator, send_email=send_email)


# -----------------------------------
Expand Down
Loading