Flushing - RobertoPrevato/rolog GitHub Wiki
rolog
has built-in support for log targets that flush messages in groups. For example, this is necessary to optimize the number of web requests when sending log records to a web api, or enabling bulk-inserts inside a database, instead of contacting external services for each log record.
FlushLogTarget
is an abstract class, derived from LogTarget
, implementing methods to handle groups of records and failures.
Below is an example of flush target class that sends log records to some web api, in groups of 500
:
from typing import List
from rolog import FlushLogTarget, LogRecord
class SomeApiLogTarget(FlushLogTarget):
def __init__(self, http_client):
super().__init__()
self.http_client = http_client
async def log_records(self, records: List[LogRecord]):
# NB: implement here your own logic to make web requests to send log records
# to a web api, such as Azure Application Insights
# (see for example https://pypi.org/project/asynapplicationinsights/)
pass
When logging a group of records fails, flush targets handle retries with configurable and progressive delays.
By default, in case of failure a flush target tries to log records 3 times, using a progressive delay of 0.6 seconds * attempt number,
finally falling back to a configurable target if logging always failed. Warning messages are issued, using built-in
Warnings
module to notify of these failures. For example, it is possible to configure a FlushLogTarget
to store log records on the local file system, as a last resort when sending logs to an intended endpoint fails repeatedly.
These parameters are configurable using constructor parameters fallback_target
, max_size
, retry_delay
, progressive_delay
.
Parameter | Type | Description |
---|---|---|
max_size | int, default 500 | The number of log records to store in memory, before flushing and calling log_records method. |
max_retries | int, default 3 | The number of max retries, when a call to log_records fails. |
retry_delay | float, default 0.6 | The number of seconds before a retry, when an attempt to send records to desired destination fails. |
progressive_delay | bool, default True | Whether to increase the retry_delay , multiplying it by the attempt number. |
fallback_target | LogTarget, default None | A fallback target to use when calls to log_records fails more than max_retries times. |
class FlushLogTarget(LogTarget, ABC):
"""Base class for flushing log targets: targets that send the log records
(created by loggers) to the appropriate destination in groups."""
def __init__(self,
queue: Optional[Queue]=None,
max_length: int=500,
fallback_target: Optional[LogTarget]=None,
max_retries: int=3,
retry_delay: float=0.6,
progressive_delay: bool=True):
Flushing when application stops
Since flushing targets hold log records in memory before flushing them, it's necessary to flush when an application stops.
Assuming that a single LoggerFactory
is configured in the configuration root of an application, this
can be done conveniently, by calling the dispose
method of the logger factory.
# on application shutdown:
await logger_factory.dispose()