diff --git a/loguru/README.md b/loguru/README.md new file mode 100644 index 0000000000..994b34d7bf --- /dev/null +++ b/loguru/README.md @@ -0,0 +1,24 @@ +# How to Use Loguru for Simpler Python Logging + +This repository contains code related to the Real Python tutorial [How to Use Loguru for Simpler Python Logging](https://realpython.com/python-loguru/). + +## Setup + +You should first create and activate a virtual environment: + +```sh +$ python -m venv venv/ +$ source venv/bin/activate +``` + +Install the pinned dependencies from `requirements.txt`: + +```sh +(venv) $ python -m pip install -r requirements.txt +``` + +Then you can execute the provided Python scripts, for example: + +```sh +(venv) $ python basic_logging.py +``` diff --git a/loguru/basic_logging.py b/loguru/basic_logging.py new file mode 100644 index 0000000000..251a709f7b --- /dev/null +++ b/loguru/basic_logging.py @@ -0,0 +1,5 @@ +from loguru import logger + +logger.debug("Debug message") +logger.info("Info message") +logger.error("Error message") diff --git a/loguru/catch_and_log_errors.py b/loguru/catch_and_log_errors.py new file mode 100644 index 0000000000..1c392bd125 --- /dev/null +++ b/loguru/catch_and_log_errors.py @@ -0,0 +1,9 @@ +from loguru import logger + + +@logger.catch +def divide(a, b): + return a / b + + +divide(10, 0) diff --git a/loguru/context_logging.py b/loguru/context_logging.py new file mode 100644 index 0000000000..e23dc95858 --- /dev/null +++ b/loguru/context_logging.py @@ -0,0 +1,16 @@ +import sys + +from loguru import logger + +logger.remove() +logger.add(sys.stderr, format="{time} | {level} | {message} | {extra}") + +user_logger = logger.bind(user_id=123) +user_logger.info("User logged in") +user_logger.info("User started a session") + +with logger.contextualize(request_id="abc789"): + logger.info("Processing request") + logger.info("Request completed") + +logger.info("Request is processed, this will not show extra context") diff --git a/loguru/custom_json_logging.py b/loguru/custom_json_logging.py new file mode 100644 index 0000000000..bd3e5529d1 --- /dev/null +++ b/loguru/custom_json_logging.py @@ -0,0 +1,24 @@ +import json + +from loguru import logger + + +def simple_serializer(record): + subset = { + "time": record["time"].timestamp(), + "level": record["level"].name, + "message": record["message"], + "context": record["extra"], # Include any bound context + } + return json.dumps(subset) + + +def add_serialization(record): + record["extra"]["json_output"] = simple_serializer(record) + + +logger.remove() +logger = logger.patch(add_serialization) +logger.add("custom.json", format="{extra[json_output]}") +logger.bind(user="john").info("User logged in") +logger.bind(order_id=12345).info("Order processed") diff --git a/loguru/customized_log_errors.py b/loguru/customized_log_errors.py new file mode 100644 index 0000000000..b3bd395437 --- /dev/null +++ b/loguru/customized_log_errors.py @@ -0,0 +1,12 @@ +from loguru import logger + + +@logger.catch(message="Database connection failed", level="ERROR") +def connect_to_db(host, port): + if port < 1000: + raise ValueError("Invalid port number") + # Simulated database connection + return 1 / 0 # Simulate error + + +connect_to_db("localhost", 123) diff --git a/loguru/debug_with_context.py b/loguru/debug_with_context.py new file mode 100644 index 0000000000..e9e46749ca --- /dev/null +++ b/loguru/debug_with_context.py @@ -0,0 +1,22 @@ +import sys + +from loguru import logger + +logger.remove() +logger.add( + sys.stderr, format="{time} | {level} | {message} | {extra}", level="TRACE" +) + + +@logger.catch +def perform_action(user, action): + with logger.contextualize(user=user, action=action): + logger.trace("Starting action") + logger.info("Performing action") + if action not in ["login", "logout"]: + logger.trace("Invalid action detected") + raise ValueError("Invalid action") + logger.success("Action completed") + + +perform_action("alice", "delete") diff --git a/loguru/file_logging.py b/loguru/file_logging.py new file mode 100644 index 0000000000..626289dd40 --- /dev/null +++ b/loguru/file_logging.py @@ -0,0 +1,8 @@ +import time + +from loguru import logger + +logger.add(sink="app.log", rotation="5 seconds", retention="1 minute") +for i in range(100): + logger.info(f"Processing item #{i}") + time.sleep(2) diff --git a/loguru/loguru_json_file.py b/loguru/loguru_json_file.py new file mode 100644 index 0000000000..3d727ae720 --- /dev/null +++ b/loguru/loguru_json_file.py @@ -0,0 +1,6 @@ +from loguru import logger + +logger.remove() +logger.add("app.json", serialize=True, format="{time} | {level} | {message}") +logger.info("Application started") +logger.warning("Memory usage high") diff --git a/loguru/loguru_json_format.py b/loguru/loguru_json_format.py new file mode 100644 index 0000000000..863db3fdf9 --- /dev/null +++ b/loguru/loguru_json_format.py @@ -0,0 +1,7 @@ +import sys + +from loguru import logger + +logger.remove() +logger.add(sys.stderr, serialize=True) +logger.info("User logged in", user_id=123) diff --git a/loguru/requirements.txt b/loguru/requirements.txt new file mode 100644 index 0000000000..6c11c4caa9 --- /dev/null +++ b/loguru/requirements.txt @@ -0,0 +1 @@ +loguru==0.7.3