logger: rewrite logger module
Make logging interface more pythonic
This commit is contained in:
parent
820fa1760d
commit
9258b98a9a
3 changed files with 76 additions and 22 deletions
|
|
@ -1,5 +1,20 @@
|
||||||
import logging
|
from __future__ import annotations
|
||||||
|
|
||||||
import enum
|
import enum
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
_TRACE = (logging.DEBUG + logging.NOTSET) // 2
|
||||||
|
logging.addLevelName(_TRACE, "TRACE")
|
||||||
|
|
||||||
|
rootLogger = logging.getLogger()
|
||||||
|
|
||||||
|
loglevel = os.getenv("LOGLEVEL", None)
|
||||||
|
if loglevel is not None:
|
||||||
|
rootLogger.setLevel(loglevel.upper())
|
||||||
|
rootLogger.debug("Set loglevel from LOGLEVEL environment variable: %s", loglevel)
|
||||||
|
|
||||||
|
rootLogger.handlers.clear()
|
||||||
|
|
||||||
|
|
||||||
class LogLevel(enum.IntEnum):
|
class LogLevel(enum.IntEnum):
|
||||||
|
|
@ -8,11 +23,24 @@ class LogLevel(enum.IntEnum):
|
||||||
Warning = logging.WARNING
|
Warning = logging.WARNING
|
||||||
Info = logging.INFO
|
Info = logging.INFO
|
||||||
Debug = logging.DEBUG
|
Debug = logging.DEBUG
|
||||||
|
Trace = _TRACE
|
||||||
|
Notset = logging.NOTSET
|
||||||
|
|
||||||
|
|
||||||
def make_logger(name: str, level: LogLevel = LogLevel.Debug) -> logging.Logger:
|
class Logger:
|
||||||
|
def __init__(self, name: str, level: LogLevel | None = None):
|
||||||
|
self.name = name
|
||||||
|
if level is None:
|
||||||
|
level = rootLogger.level
|
||||||
|
self.level = level
|
||||||
|
self.logger = Logger._make_logger(self.name, self.level)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _make_logger(name: str, level: LogLevel) -> logging.Logger:
|
||||||
_logger = logging.getLogger(name)
|
_logger = logging.getLogger(name)
|
||||||
_logger.setLevel(level)
|
_logger.setLevel(level)
|
||||||
|
_logger.propagate = False
|
||||||
|
|
||||||
# create console handler and set level to debug
|
# create console handler and set level to debug
|
||||||
ch = logging.StreamHandler()
|
ch = logging.StreamHandler()
|
||||||
ch.setLevel(level)
|
ch.setLevel(level)
|
||||||
|
|
@ -24,5 +52,30 @@ def make_logger(name: str, level: LogLevel = LogLevel.Debug) -> logging.Logger:
|
||||||
|
|
||||||
return _logger
|
return _logger
|
||||||
|
|
||||||
|
def log(self, level: LogLevel, *args, exc_info: bool = False, **kwargs):
|
||||||
|
assert args[0] != "%s"
|
||||||
|
message = " ".join(arg if type(arg) == str else repr(arg) for arg in args)
|
||||||
|
self.logger.log(level, "%s",
|
||||||
|
message,
|
||||||
|
exc_info=exc_info, **kwargs)
|
||||||
|
|
||||||
logger = make_logger("compiler")
|
def critical(self, *args):
|
||||||
|
self.log(LogLevel.Critical, *args)
|
||||||
|
|
||||||
|
def error(self, *args):
|
||||||
|
self.log(LogLevel.Error, *args)
|
||||||
|
|
||||||
|
def warning(self, *args):
|
||||||
|
self.log(LogLevel.Warning, *args)
|
||||||
|
|
||||||
|
def info(self, *args):
|
||||||
|
self.log(LogLevel.Info, *args)
|
||||||
|
|
||||||
|
def debug(self, *args):
|
||||||
|
self.log(LogLevel.Debug, *args)
|
||||||
|
|
||||||
|
def trace(self, *args):
|
||||||
|
self.log(LogLevel.Trace, *args)
|
||||||
|
|
||||||
|
|
||||||
|
logger = Logger("compiler")
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,14 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from beartype.typing import List
|
|
||||||
|
|
||||||
from .logger import make_logger
|
from beartype.typing import List, Dict, Callable
|
||||||
from .nodes import Number, Sum, Expression, Product
|
|
||||||
|
from .logger import Logger
|
||||||
|
from .nodes import Float, Sum, Value, Product, Node, Division, Sub, Integer, Expression
|
||||||
from .source import SourceLocation
|
from .source import SourceLocation
|
||||||
from .tokenizer import Tokens, Token
|
from .tokenizer import Tokens, Token
|
||||||
|
|
||||||
logger = make_logger(__name__)
|
logger = Logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class ParsingError(Exception):
|
class ParsingError(Exception):
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,12 @@ from dataclasses import dataclass, field
|
||||||
from beartype import beartype
|
from beartype import beartype
|
||||||
from beartype.typing import Optional, List
|
from beartype.typing import Optional, List
|
||||||
|
|
||||||
import enum
|
from .logger import Logger
|
||||||
import re
|
|
||||||
|
|
||||||
from .logger import logger
|
|
||||||
from .source import SourceLocation, Location
|
from .source import SourceLocation, Location
|
||||||
|
|
||||||
|
logger = Logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@beartype
|
@beartype
|
||||||
@dataclass
|
@dataclass
|
||||||
class Token:
|
class Token:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue