Files
basegame-vcko/python3-vckonline/lib/python3.8/site-packages/aiologger/loggers/json.py
2020-11-03 18:30:14 -08:00

113 lines
3.3 KiB
Python

import json
from datetime import timezone
from asyncio import AbstractEventLoop, Task
from typing import Dict, Iterable, Callable, Tuple, Any, Optional, Mapping
from aiologger import Logger
from aiologger.utils import create_task, loop_compat
from aiologger.formatters.base import Formatter
from aiologger.formatters.json import ExtendedJsonFormatter
from aiologger.levels import LogLevel
from aiologger.logger import _Caller
from aiologger.records import ExtendedLogRecord
@loop_compat
class JsonLogger(Logger):
def __init__(
self,
name: str = "aiologger-json",
level: int = LogLevel.DEBUG,
flatten: bool = False,
serializer_kwargs: Dict = None,
extra: Dict = None,
) -> None:
super().__init__(name=name, level=level)
self.flatten = flatten
if serializer_kwargs is None:
serializer_kwargs = {}
self.serializer_kwargs = serializer_kwargs
if extra is None:
extra = {}
self.extra = extra
@classmethod
def with_default_handlers( # type: ignore
cls,
*,
name: str = "aiologger-json",
level: int = LogLevel.NOTSET,
serializer: Callable[..., str] = json.dumps,
flatten: bool = False,
serializer_kwargs: Dict = None,
extra: Dict = None,
exclude_fields: Iterable[str] = None,
tz: timezone = None,
formatter: Optional[Formatter] = None,
**kwargs,
):
if formatter is None:
formatter = ExtendedJsonFormatter(
serializer=serializer, exclude_fields=exclude_fields, tz=tz
)
return super(JsonLogger, cls).with_default_handlers(
name=name,
level=level,
flatten=flatten,
serializer_kwargs=serializer_kwargs,
extra=extra,
formatter=formatter,
**kwargs,
)
def _log( # type: ignore
self,
level: LogLevel,
msg: Any,
args: Optional[Tuple[Mapping]],
exc_info=None,
extra: Dict = None,
stack_info=False,
flatten: bool = False,
serializer_kwargs: Dict = None,
caller: _Caller = None,
) -> Task:
"""
Low-level logging routine which creates a ExtendedLogRecord and
then calls all the handlers of this logger to handle the record.
Overwritten to properly handle log methods kwargs
"""
sinfo = None
if caller:
fn, lno, func, sinfo = caller
else: # pragma: no cover
fn, lno, func = "(unknown file)", 0, "(unknown function)"
if exc_info and isinstance(exc_info, BaseException):
exc_info = (type(exc_info), exc_info, exc_info.__traceback__)
joined_extra = {}
joined_extra.update(self.extra)
if extra:
joined_extra.update(extra)
record = ExtendedLogRecord(
name=self.name,
level=level,
pathname=fn,
lineno=lno,
msg=msg,
args=args,
exc_info=exc_info,
func=func,
sinfo=sinfo,
extra=joined_extra,
flatten=flatten or self.flatten,
serializer_kwargs=serializer_kwargs or self.serializer_kwargs,
)
return create_task(self.handle(record))