Module pyboiler.internal.log.format

Wrap python.logging Formatters

Classes

class Formatter (fmt: str = None, datefmt: str = None, color=False)

Log record formatter

Expand source code
class Formatter:
    """Log record formatter"""

    __slots__ = ("fmt", "datefmt", "color")

    def __init__(self, fmt: str = None, datefmt: str = None, color=False):  # type: ignore
        if fmt is None:
            fmt = config.DFLT_FMT
        if datefmt is None:
            datefmt = config.DFLT_DATEFMT
        self.fmt = fmt
        self.datefmt = datefmt
        self.color = color

    @staticmethod
    def _parse(string):
        return Tags.parse(string)

    @staticmethod
    def _add_vals(tags, record: Record, datefmt, color: bool):
        mapping = {
            Tags.name: record.name,
            Tags.levelnum: record.level.value,
            Tags.levelname: record.level.name,
            Tags.filepath: str(record.meta.filepath),
            Tags.filename: record.meta.filepath.name,
            Tags.linenum: record.meta.line,
            Tags.func: record.meta.func,
            Tags.time: record.time.strftime(datefmt),
            Tags.message: record.msg,
        }
        if not color:
            for tag in tags:
                tag.val = mapping[tag.inst]
        else:
            for tag in tags:
                col = TagsColor[tag.inst.name].value
                if tag.inst.name == "message":
                    col = LevelColors[record.level.name].value
                tag.val = ""
                if col:
                    col_fmt = c_parse(col)
                    for fmt in col_fmt:
                        tag.val += fmt.val
                    tag.val += f"{mapping[tag.inst]}{ST.RESET.code()}"
                else:
                    tag.val = mapping[tag.inst]

    def format(self, record: Record) -> str:
        tags = type(self)._parse(self.fmt)
        type(self)._add_vals(tags, record, self.datefmt, self.color)

        message = self.fmt
        for tag in tags:
            message = message.replace(tag.tag, tag.val)
        return message

Instance variables

var color
var datefmt
var fmt

Methods

def format(self, record: Record) ‑> str
class TagWrapper (idx: int, tag: str, inst, val: Any = None)

Children of this class must have slots defined

Expand source code
class TagWrapper(slot_storage):
    __slots__ = ("tag", "inst", "val")

    def __init__(self, idx: int, tag: str, inst, val: Any = None):
        self.idx: int
        self.tag = tag
        self.inst = inst
        self.val = val

    def __str__(self) -> str:
        return f"{type(self).__name__} tag: {self.tag}, val: {self.val}"

Ancestors

Instance variables

var inst
var tag
var val

Inherited members

class Tags (*args, **kwds)

Create a collection of name/value pairs.

Example enumeration:

>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3

Access them by:

  • attribute access:

Color.RED

  • value lookup:

Color(1)

  • name lookup:

Color['RED']

Enumerations can be iterated over, and know how many members they have:

>>> len(Color)
3
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

Methods can be added to enumerations, and members can have their own attributes – see the documentation for details.

Expand source code
class Tags(Enum):
    name = auto()
    levelnum = auto()
    levelname = auto()
    filepath = auto()
    filename = auto()
    linenum = auto()
    func = auto()
    time = auto()
    message = auto()

    @staticmethod
    def parse(string: str):
        raw_tags = re.findall(config.TAG_RE, string)
        tags = []
        for idx, item in enumerate(raw_tags):
            tag = item[2:-1]
            wrap = TagWrapper(idx, item, Tags[tag])
            tags.append(wrap)
        return tags

Ancestors

  • enum.Enum

Class variables

var filename
var filepath
var func
var levelname
var levelnum
var linenum
var message
var name
var time

Static methods

def parse(string: str)
class TagsColor (*args, **kwds)

Create a collection of name/value pairs.

Example enumeration:

>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3

Access them by:

  • attribute access:

Color.RED

  • value lookup:

Color(1)

  • name lookup:

Color['RED']

Enumerations can be iterated over, and know how many members they have:

>>> len(Color)
3
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

Methods can be added to enumerations, and members can have their own attributes – see the documentation for details.

Expand source code
class TagsColor(Enum):
    name = f"{c_conf.TAG_START}sBOLD{c_conf.TAG_END}{c_conf.TAG_START}bBLACK{c_conf.TAG_END}{c_conf.TAG_START}fGREEN{c_conf.TAG_END}"
    levelnum = f"{c_conf.TAG_START}sBOLD{c_conf.TAG_END}{c_conf.TAG_START}fWHITE{c_conf.TAG_END}"
    levelname = f"{c_conf.TAG_START}sBOLD{c_conf.TAG_END}{c_conf.TAG_START}fWHITE{c_conf.TAG_END}"
    filepath = f"{c_conf.TAG_START}fBLUE{c_conf.TAG_END}"
    filename = f"{c_conf.TAG_START}fBLUE{c_conf.TAG_END}"
    linenum = f"{c_conf.TAG_START}fGREEN{c_conf.TAG_END}"
    func = f"{c_conf.TAG_START}fGREEN{c_conf.TAG_END}"
    time = f"{c_conf.TAG_START}fYELLOW{c_conf.TAG_END}"
    message = ""  # Defined in level.LevelColors

Ancestors

  • enum.Enum

Class variables

var filename
var filepath
var func
var levelname
var levelnum
var linenum
var message
var name
var time