Switching From Other Libraries
Logly works best when sinks are configured explicitly at application startup. After that, pass either the module-level logger or independent Logger() instances to components that need logging.
Common Migration Steps
- Replace imports with
from logly import loggerorfrom logly import Logger. - Add sinks with
logger.add(...). - Use
logger.bind(...)for persistent context. - Use
logger.contextualize(...)for request-scoped fields. - Call
logger.complete()before process shutdown when using queued sinks.
From Feature-Rich Python Logging Libraries
Replace the import and keep the same application-level sink setup shape:
python
from logly import logger
logger.add("app.log", rotation="10 MB", retention="7 days", compression="gzip")
logger.info("service started")For contextual logging:
python
request_logger = logger.bind(request_id="req-123")
request_logger.info("request accepted")For isolated handlers, use independent Logger() instances instead of bound views.
From logging
Use the stdlib bridge when you cannot change all call sites at once:
python
import logging
from logly.integrations.stdlib import InterceptHandler
logging.basicConfig(handlers=[InterceptHandler()], level=logging.INFO)From Structlog
Start with bind() and contextualize() for structured context:
python
from logly import logger
log = logger.bind(service="billing")
log.info("invoice created")Independent Loggers
Use independent Logger() instances when separate subsystems need completely separate sink sets.
python
from logly import Logger
api_logger = Logger()
worker_logger = Logger()
api_logger.add("api.log", level="INFO")
worker_logger.add("worker.log", level="DEBUG")
api_logger.info("request accepted")
worker_logger.debug("job claimed")