Automatic function logging with decorators — output to SQLite, CSV, and Markdown
Project description
lg
Tak, istnieją biblioteki Pythona, które automatyzują generowanie logów w funkcjach na podstawie analizy kodu, typów danych czy struktur jak try-except.
Loguru
Loguru to popularna biblioteka oferująca dekoratory do automatycznego logowania wejścia/wyjścia funkcji oraz wyjątków.
Używa się jej prosto: @loguru.logger.catch na funkcji automatycznie przechwytuje błędy i loguje szczegóły, w tym argumenty i typy.
Przykład: dekorator loguje parametry wejściowe, wyjątki z traceback oraz czas wykonania bez pisania ręcznych logów. pktiuk.github
Decorator logowania
Biblioteka funcy lub proste dekoratory z functools pozwalają tworzyć customowe wrappery analizujące inspect.signature() dla typów argumentów.
Można dynamicznie logować nazwy parametrów, ich typy (type(arg)) i wartości przy wejściu/wyjściu.
Dla zaawansowanych przypadków pydantic integruje walidację typów z automatycznymi logami błędów walidacji w blokach try-except. bulldogjob
Funkcjonalne podejście
Własny dekorator z inspect i logging może skanować strukturę kodu (ast.parse) i generować logi debug na podstawie obecności try-catch czy typów.
Biblioteki jak wrapt ułatwiają takie wrappingi bez modyfikacji oryginalnych funkcji.
To idealne dla Twoich projektów z embedded systems i automatyzacją, gdzie chcesz minimalizować boilerplate. pktiuk.github
Tak, Loguru i standardowy logging z custom handlerami umożliwiają eksport logów bezpośrednio do SQLite, CSV czy Markdown poprzez konfigurację sinków lub handlerów. Poniżej przykłady użycia z automatycznym logowaniem (dekoratory) i outputem do plików.
Przykład Loguru z dekoratorem i CSV
Loguru pozwala dodać sink do pliku CSV, logując automatycznie argumenty, wyjątki z try-catch i typy danych.
from loguru import logger
# Dodaj sink CSV (automatycznie strukturyzuje logi)
logger.add("logs.csv", format="{time} | {level} | {name}:{function}:{line} | {message}", serialize=True)
@logger.catch # Automatycznie loguje wejście/wyjście i wyjątki
def moja_funkcja(x: int, y: str):
return x / len(y) # Przykładowy błąd
moja_funkcja(10, "") # Loguje do CSV z typami i traceback [web:23][web:13]
Wynik w CSV: kolumny jak time, level, message z JSON-serializowanymi danymi (argumenty, typy). github
Loguru do Markdown
Loguru sink do Markdown generuje czytelne logi z nagłówkami i formatowaniem.
logger.add("logs.md", format="## {time:YYYY-MM-DD HH:mm:ss} | {level}\n{ message }\n", colorize=False)
@logger.catch
def test_funkcja(data):
raise ValueError("Błąd typów")
test_funkcja({"key": "value"}) # Logi z markdown: ## nagłówki, kody bloków [web:21]
Plik MD: struktura z datą, poziomem, pełnym traceback i zmiennymi. jojoduquartier.github
SQLite Handler dla logging/Loguru
Użyj python-sqlite-log-handler lub custom handler do bazy danych; integruje z dekoratorami.
import logging
from python_sqlite_log_handler import SQLiteLogHandler # pip install python-sqlite-log-handler
logger = logging.getLogger("app")
handler = SQLiteLogHandler(db_path="logs.db") # Tworzy tabelę logs
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
def try_catch_logger(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
logger.error(f"Błąd w {func.__name__}: {e}", exc_info=True)
raise
return wrapper
@try_catch_logger
def funkcja_z_db(arg: dict):
if not arg: raise KeyError("Brak danych")
funkcja_z_db({}) # Loguje do SQLite: created_at, level, message, extra z typami [web:15][web:12]
Query SQL: SELECT * FROM logs WHERE level >= 30 – łatwe filtrowanie. pypi
Porównanie outputów
| Biblioteka/Handler | SQLite | CSV | Markdown | Automatyczne dekoratory |
|---|---|---|---|---|
| Loguru | Tak (custom sink) stackoverflow | Tak (serialize=True) github | Tak (format MD) jojoduquartier.github | @logger.catch datacamp |
| logging + sqlite-handler | Tak (natywnie) pypi | Tak (CSVHandler) | Custom formatter | Custom @try_catch jojoduquartier.github |
Analiza rozwiązań do automatycznego logowania w Pythonie
Istnieją cztery główne biblioteki umożliwiające automatyczne logi w funkcjach na bazie typów danych, struktur kodu (try-catch) i dekoratorów. Loguru jest najpopularniejszy (15k+ gwiazdek GitHub), structlog skupia się na strukturyzowanych logach, Eliot na wizualizacji, a standardowy logging z rozszerzeniami na elastyczność. betterstack
Szczegółowa tabela porównawcza
| Biblioteka | Automatyczne logi (dekoratory) | Analiza typów/struktury kodu | Obsługa SQLite | Obsługa CSV | Obsługa Markdown | Zalety | Wady | GitHub Stars (2026) | Ostatnia aktualizacja |
|---|---|---|---|---|---|---|---|---|---|
| Loguru betterstack | Tak (@logger.catch: wejście/wyjście, wyjątki, traceback) | Częściowa (loguje args via inspect, typy w serializacji) | Tak (custom sink z sqlite3) stackoverflow | Tak (serialize=True, CSV format) github | Tak (custom format z ## nagłówkami) jojoduquartier.github | Zero-config, rotation plików, structured JSON, kolorowanie | Nie threaded-safe domyślnie | 15k+ betterstack | Aktywna (2024-12) pypi |
| structlog matthewstrawbridge | Tak (bind_context, processors dla func args) | Tak (structured metadata z typami, AST via processors) | Tak (via JSON + sqlite insert) stackoverflow | Tak (JSON/CSV processors) | Tak (custom renderer) | Structured logs, async, OpenTelemetry | Więcej configu niż Loguru | Wysokie (top 6) betterstack | Aktywna dash0 |
| Eliot betterstack | Tak (@log_call: pełne wejście/wyjście funkcji) | Tak (strukturyzowane eventy z typami) | Tak (JSON do SQLite) | Tak (JSON export) | Częściowa (JSON -> MD via tree) | Wizualizacja (eliot-tree CLI), narracyjne logi | Brak poziomów logów | Średnie betterstack | Stabilna |
| logging std + handlers reddit | Tak (custom @decorator z inspect/traceback) jojoduquartier.github | Tak (via inspect.signature, ast.parse) | Tak (python-sqlite-log-handler) pypi | Tak (CSVHandler/FileHandler) | Tak (custom Formatter) | Natywny, config files, threaded | Boilerplate bez dekoratorów | Wbudowany | Python 3.14 docs.python |
Rekomendacje dla Twoich projektów
Dla embedded/automatyzacji (RPi/ESP32) wybierz Loguru – prosty, lekki, integruje z Docker/K8s. Do biznesu (ERP/legal) structlog dla searchable JSON/SQLite. Przykłady kodu z poprzednich odpowiedzi działają out-of-box po pip install loguru python-sqlite-log-handler. reddit
W dobie LLM i multisrodowiskowych aplikacji (embedded, Docker/K8s, CI/CD) brakuje kilku kluczowych funkcji w bibliotekach logujących jak Loguru/structlog.
Braki w automatycznym logowaniu
Brak natywnej integracji z LLM do kontekstowego parsowania logów
Żadna biblioteka nie analizuje logów przez LLM w locie (np. "ten wyjątek TypeError sugeruje brak walidacji int w argumencie x") ani nie generuje sugestii fixów bezpośrednio w logu. W CI/CD z LLM to kluczowe dla szybkiej iteracji. ijamjournal
Tabela brakujących funkcji
| Brakująca funkcja | Opis problemu | Przykład zastosowania w Twoich projektach |
|---|---|---|
| LLM-powered log parsing | Logi tylko statyczne; brak AI do grupowania podobnych błędów czy predykcji root cause | W embedded RPi: LLM grupuje "I2C timeout" z sensorami i sugeruje "sprawdź zasilanie" |
| Multi-env log correlation | Brak automatycznego tagowania środowisk (dev/staging/prod) + trace ID dla K8s pods | CI/CD deploy do Docker: brak linku "błąd w pod-3 → Git commit abc123" |
| Dynamic sink routing | Ręczne config sinków (SQLite/CSV); brak auto-przełączania na bazie env/variable types | Prod → Elasticsearch, dev → Markdown; bez config files |
| Structured diff logs | Nie loguje zmian input/output między wersjami funkcji w CI/CD | A/B test funkcji: "v1.2.1 input dict → output None, v1.2.2 → output list" |
| Prompt injection detection | Brak auto-detektu LLM prompt injection w logach API calls | Twoja automatyzacja prawna: loguje "znajdź lukę w umowie X" → flaga bezpieczeństwa |
Proponowane rozszerzenia dla CI/CD + LLM
# Wyobrażone Loguru 3.0 z LLM integration
from loguru_llm import LLMAnalyzer
@logger.catch(llm_analyzer=LLMAnalyzer(model="gpt-4o-mini"))
def risky_function(user_input: str):
# LLM auto-parsuje exception i dodaje: "Prawdopodobna przyczyna: SQL injection"
return eval(user_input) # danger!
Dla Twoich projektów: Stwórz custom sink z LangChain + Pinecone vector DB do semantycznego searchu logów ("pokaż wszystkie TypeError z dict arg w ciągu 7 dni") i GitHub Actions step z LLM code review na bazie logów z failed builds. github
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nfo-0.1.11.tar.gz.
File metadata
- Download URL: nfo-0.1.11.tar.gz
- Upload date:
- Size: 20.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7213907ec0b7e9f1d30f7d03a46e727912fe4da32a328d6d9d483ee165f0103d
|
|
| MD5 |
4a7de5cb6dc435ddba1c5ff5d14f16e8
|
|
| BLAKE2b-256 |
9857725f7bb4cc43aaae3dc23a6cde28f56b81a0b0bbd86feb2d095659e04013
|
File details
Details for the file nfo-0.1.11-py3-none-any.whl.
File metadata
- Download URL: nfo-0.1.11-py3-none-any.whl
- Upload date:
- Size: 15.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
85b6d5b5136d89b06000b2e07c7d6f74dd0bd9cc8be18591a14007eb1b37bc6e
|
|
| MD5 |
906a71adb74c1a1a77e4fd1d30cc8925
|
|
| BLAKE2b-256 |
0c969ccf273dc8ad21566c86c9665f8f2bd8efb2434367cfb5b9a547cb24738b
|