banner("1) logger.configure(): handlers + custom level + extra + patcher")
mem = MemorySink()
logger.configure(
handlers=[
"sink": sys.stderr, "format": console_formatter, "level": "DEBUG",
"colorize": True, "backtrace": True, "diagnose": True,
"sink": mem, "level": "DEBUG", "format": "message",
"sink": "structured.jsonl", "serialize": True, "level": "DEBUG",
"enqueue": True,
level ,
],
levels=["name": "NOTICE", "no": 22, "color": "<blue><bold>", "icon": "📢"],
extra="app": "loguru-advanced",
patcher=global_patcher,
)
logger.debug("debug"); logger.info("info"); logger.success("SUCCESS level ships built-in")
logger.warning("warning"); logger.log("NOTICE", "custom level between INFO and SUCCESS")
banner("2) bind() / contextualize() / patch()")
logger.bind(user_id=42, request_id="abc-123").info("bound context")
with logger.contextualize(task="batch-job", run=7):
logger.info("inside contextualized block")
logger.patch(lambda r: r["extra"].update(epoch=round(time.time()))).info("per-call patched record")
banner("3) @logger.catch + context-manager form")
def inner(d): return d["a"] / d["b"]
def outer(d): return inner(d)
@logger.catch(reraise=False)
def compute(d): return outer(d)
compute("a": 1, "b": 0)
with logger.catch(message="handled inside a with-block"):
raise ValueError("boom in block")
banner("4) opt(lazy=True), inline colors, record access")
logger.opt(lazy=True).debug("lazy sum = ", lambda: sum(i*i for i in range(1_000_000)))
logger.opt(colors=True).info("inline <red>colors</red> <green>work</green>")
logger.opt(record=True).info("emitted from source line record[line]")