Skip to content

Commit f0e4d77

Browse files
authored
refactor: Logger parse structure (#431)
* fix: set default logging handlers to NullHandlers * fix: replace log instancing with new handler funct * ref: pre-commit hook * fix: pass errors and higher by default * fix: add docstring and fix typo * fix: reference conflicts with formatter * pre-commit: fix complaint from isort
1 parent ca93602 commit f0e4d77

File tree

7 files changed

+52
-22
lines changed

7 files changed

+52
-22
lines changed

interactions/api/dispatch.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
from asyncio import get_event_loop
2-
from logging import Logger, getLogger
2+
from logging import Logger
33
from typing import Coroutine, Optional
44

5-
log: Logger = getLogger("dispatch")
5+
from interactions.base import get_logger
6+
7+
log: Logger = get_logger("dispatch")
68

79

810
class Listener:

interactions/api/gateway.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22
from asyncio import get_event_loop, run_coroutine_threadsafe
33
from json import dumps
4-
from logging import Logger, getLogger
4+
from logging import Logger
55
from random import random
66
from threading import Event, Thread
77
from typing import Any, List, Optional, Union
@@ -10,6 +10,7 @@
1010
from orjson import loads
1111

1212
from interactions.api.models.gw import Presence
13+
from interactions.base import get_logger
1314
from interactions.enums import InteractionType, OptionType
1415

1516
from .dispatch import Listener
@@ -18,7 +19,7 @@
1819
from .http import HTTPClient
1920
from .models.flags import Intents
2021

21-
log: Logger = getLogger("gateway")
22+
log: Logger = get_logger("gateway")
2223

2324
__all__ = ("Heartbeat", "WebSocket")
2425

interactions/api/http.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import traceback
33
from asyncio import AbstractEventLoop, Lock, get_event_loop, get_running_loop
44
from json import dumps
5-
from logging import Logger, getLogger
5+
from logging import Logger
66
from sys import version_info
77
from typing import Any, ClassVar, Dict, List, Optional, Tuple, Union
88
from urllib.parse import quote
@@ -11,6 +11,7 @@
1111
from aiohttp import __version__ as http_version
1212

1313
import interactions.api.cache
14+
from interactions.base import __version__, get_logger
1415
from interactions.models.misc import MISSING
1516

1617
from ..api.cache import Cache, Item
@@ -31,9 +32,8 @@
3132
User,
3233
WelcomeScreen,
3334
)
34-
from ..base import __version__
3535

36-
log: Logger = getLogger("http")
36+
log: Logger = get_logger("http")
3737

3838
__all__ = ("Route", "Request", "HTTPClient")
3939
_session: ClientSession = ClientSession()

interactions/api/models/misc.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
# TODO: Reorganise mixins to its own thing, currently placed here because circular import sucks.
55
# also, it should be serialiser* but idk, fl0w'd say something if I left it like that. /shrug
66
import datetime
7-
import logging
7+
from logging import Logger
88
from math import floor
99
from typing import Union
1010

11-
log = logging.getLogger("mixin")
11+
from interactions.base import get_logger
12+
13+
log: Logger = get_logger("mixin")
1214

1315

1416
class DictSerializerMixin(object):

interactions/base.py

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from typing import ClassVar
2+
from typing import ClassVar, List, Optional, Union
33

44
from colorama import Fore, Style, init
55

@@ -18,21 +18,44 @@
1818

1919

2020
class Data:
21-
"""A class representing constants for the library."""
21+
"""A class representing constants for the library.
2222
23-
LOGGER: ClassVar[int] = logging.WARNING
23+
:ivar LOG_LEVEL ClassVar[int]: The default level of logging as an integer
24+
:ivar LOGGERS List[str]: A list of all loggers registered from this library
25+
"""
26+
27+
LOG_LEVEL: ClassVar[int] = logging.ERROR
28+
LOGGERS: List[str] = []
29+
30+
31+
def get_logger(
32+
logger: Optional[Union[logging.Logger, str]] = None,
33+
handler: Optional[logging.Handler] = logging.StreamHandler(),
34+
) -> logging.Logger:
35+
_logger = logging.getLogger(logger) if isinstance(logger, str) else logger
36+
_logger_name = logger if isinstance(logger, str) else logger.name
37+
if len(_logger.handlers) > 1:
38+
_logger.removeHandler(_logger.handlers[0])
39+
_handler = handler
40+
_handler.setFormatter(CustomFormatter)
41+
_handler.setLevel(Data.LOG_LEVEL)
42+
_logger.addHandler(_handler)
43+
_logger.propagate = True
44+
45+
Data.LOGGERS.append(_logger_name)
46+
return _logger
2447

2548

2649
class CustomFormatter(logging.Formatter):
2750
"""A class that allows for customized logged outputs from the library."""
2851

29-
format: str = "%(levelname)s:%(name)s:(ln.%(lineno)d):%(message)s"
52+
format_str: str = "%(levelname)s:%(name)s:(ln.%(lineno)d):%(message)s"
3053
formats: dict = {
31-
logging.DEBUG: Fore.CYAN + format + Fore.RESET,
32-
logging.INFO: Fore.GREEN + format + Fore.RESET,
33-
logging.WARNING: Fore.YELLOW + format + Fore.RESET,
34-
logging.ERROR: Fore.RED + format + Fore.RESET,
35-
logging.CRITICAL: Style.BRIGHT + Fore.RED + format + Fore.RESET + Style.NORMAL,
54+
logging.DEBUG: Fore.CYAN + format_str + Fore.RESET,
55+
logging.INFO: Fore.GREEN + format_str + Fore.RESET,
56+
logging.WARNING: Fore.YELLOW + format_str + Fore.RESET,
57+
logging.ERROR: Fore.RED + format_str + Fore.RESET,
58+
logging.CRITICAL: Style.BRIGHT + Fore.RED + format_str + Fore.RESET + Style.NORMAL,
3659
}
3760

3861
def __init__(self):

interactions/client.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from asyncio import get_event_loop
33
from importlib import import_module
44
from importlib.util import resolve_name
5-
from logging import Logger, getLogger
5+
from logging import Logger
66
from typing import Any, Callable, Coroutine, Dict, List, Optional, Union
77

88
from .api.cache import Cache
@@ -15,14 +15,15 @@
1515
from .api.models.guild import Guild
1616
from .api.models.misc import Snowflake
1717
from .api.models.team import Application
18+
from .base import get_logger
1819
from .decor import command
1920
from .decor import component as _component
2021
from .enums import ApplicationCommandType
2122
from .models.command import ApplicationCommand, Option
2223
from .models.component import Button, Modal, SelectMenu
2324
from .models.misc import MISSING
2425

25-
log: Logger = getLogger("client")
26+
log: Logger = get_logger("client")
2627
_token: str = "" # noqa
2728
_cache: Optional[Cache] = None
2829

interactions/context.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from logging import Logger, getLogger
1+
from logging import Logger
22
from typing import List, Optional, Union
33

44
from .api.models.channel import Channel
@@ -7,12 +7,13 @@
77
from .api.models.message import Embed, Message, MessageInteraction, MessageReference
88
from .api.models.misc import DictSerializerMixin, Snowflake
99
from .api.models.user import User
10+
from .base import get_logger
1011
from .enums import InteractionCallbackType, InteractionType
1112
from .models.command import Choice
1213
from .models.component import ActionRow, Button, Modal, SelectMenu
1314
from .models.misc import InteractionData
1415

15-
log: Logger = getLogger("context")
16+
log: Logger = get_logger("context")
1617

1718

1819
class Context(DictSerializerMixin):

0 commit comments

Comments
 (0)