Module licenseware.utils.logger
Docs: https://github.com/Delgan/loguru
Basic functionality:
from loguru import logger
log._debug("Debug log") log.info("Info log") log.success("Success log") log.warning("Warning log") log.error("Error log") log.critical("Critical log")
try: raise Exception("Demo exception") except: log.exception("Exception log") log.trace("Trace log")
datetime | level | module_name:function_name:line - message
2021-05-27 10:00:35.276 | DEBUG | m1:testm1:8 - Debug log 2021-05-27 10:00:35.277 | INFO | m1:testm1:9 - Info log 2021-05-27 10:00:35.277 | SUCCESS | m1:testm1:10 - Success log 2021-05-27 10:00:35.277 | WARNING | m1:testm1:11 - Warning log 2021-05-27 10:00:35.278 | ERROR | m1:testm1:12 - Error log 2021-05-27 10:00:35.278 | CRITICAL | m1:testm1:13 - Critical log 2021-05-27 10:00:35.278 | ERROR | m1:testm1:18 - Exception log Traceback (most recent call last):
File "main.py", line 30, in 
File "/home/acmt/Documents/licenseware-sdk/logs/m1.py", line 16, in testm1 raise Exception("Demo exception")
Exception: Demo exception
To see log colors in docker logs add the following in docker-compose file:
tty: true environment: - 'TERM=xterm-256color'
Expand source code
"""
Docs: 
https://github.com/Delgan/loguru
Basic functionality:
from loguru import logger
log._debug("Debug log")
log.info("Info log")
log.success("Success log")
log.warning("Warning log")
log.error("Error log")
log.critical("Critical log")
try:
    raise Exception("Demo exception")
except:
    log.exception("Exception log")
    log.trace("Trace log")
datetime | level | module_name:function_name:line - message
2021-05-27 10:00:35.276 | DEBUG    | m1:testm1:8 - Debug log
2021-05-27 10:00:35.277 | INFO     | m1:testm1:9 - Info log
2021-05-27 10:00:35.277 | SUCCESS  | m1:testm1:10 - Success log
2021-05-27 10:00:35.277 | WARNING  | m1:testm1:11 - Warning log
2021-05-27 10:00:35.278 | ERROR    | m1:testm1:12 - Error log
2021-05-27 10:00:35.278 | CRITICAL | m1:testm1:13 - Critical log
2021-05-27 10:00:35.278 | ERROR    | m1:testm1:18 - Exception log
Traceback (most recent call last):
  File "main.py", line 30, in <module>
    testm1()
    └ <function testm1 at 0x7f1ece69db80>
> File "/home/acmt/Documents/licenseware-sdk/logs/m1.py", line 16, in testm1
    raise Exception("Demo exception")
Exception: Demo exception
To see log colors in docker logs add the following in docker-compose file:
tty: true
environment:
    - 'TERM=xterm-256color'
"""
from contextlib import suppress
import os, sys, json
from loguru import logger as log
try:
    from flask import request, has_request_context
    outside_flask = False
except Exception as err:
    print("Outside flask context")
    outside_flask = True
_debug = os.getenv("DEBUG", "").lower() == "true"
_log_level = "DEBUG" if _debug else "WARNING"
if 'local' in os.getenv('ENVIRONMENT', 'local').lower():
    _log_format = """<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green>[ <level>{level}</level> ]
    <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan>
    <level>{message}</level>
    """
else:
    _log_format = '[{level}] [----- {name}:{function}:{line} -----]    [+++++ METADATA: {extra} +++++]    [***** MESSAGE: {message}\n'
try:
    log.remove(0)
except:
    pass  # No default logger
class Placeholder(dict):  # HACK: to avoid `str.format_map` error on missing keys
    def __missing__(self, key):
        return str(key)
CRITICALS = [
    "password",
    "new_password",
    "old_password",
]
def _get_payload(json_payload):
    json_payload_str = str(json_payload)
    for key in CRITICALS:
        if key in json_payload_str:
            return {"sensitive_information_alert": "no passwords allowed in logger"} 
    return json_payload
if not outside_flask:
    log.configure(
        patcher=lambda record: record["extra"].update(
            tenant_id=request.headers.get("Tenantid"),
            host=request.headers.get("Host"),
            user_agent=request.headers.get("User-Agent"),
            accept=request.headers.get("Accept"),
            content_type=request.headers.get("Content-Type"),
            request_url=request.url,
            request_method=request.method,
            json_payload=_get_payload(request.get_json()) if request.get_json() else None,
            multiform_payload=request.files if request.files else None,
        )
        if has_request_context()
        else None,
        extra=Placeholder(),
    )
log.add(
    "app.log",
    rotation="monthly",
    level=_log_level,
    format=_log_format
)
log.add(sys.stderr, format=_log_format)
# Pretty logs for dict data
log_dict = lambda dict_: log.info(json.dumps(dict_, indent=4, sort_keys=True))
## Test
# log.debug("Debug log")
# log.info("Info log")
# log.success("Success log")
# log.warning("Warning log")
# log.error("Error log")
# log.critical("Critical log")
# try:
#     raise Exception("Demo exception")
# except:
#     log.exception("Exception log")
#     log.trace("Trace log")
Functions
def log_dict(dict_)- 
Expand source code
log_dict = lambda dict_: log.info(json.dumps(dict_, indent=4, sort_keys=True)) 
Classes
class Placeholder (*args, **kwargs)- 
dict() -> new empty dictionary dict(mapping) -> new dictionary initialized from a mapping object's (key, value) pairs dict(iterable) -> new dictionary initialized as if via: d = {} for k, v in iterable: d[k] = v dict(**kwargs) -> new dictionary initialized with the name=value pairs in the keyword argument list. For example: dict(one=1, two=2)
Expand source code
class Placeholder(dict): # HACK: to avoid `str.format_map` error on missing keys def __missing__(self, key): return str(key)Ancestors
- builtins.dict