Skip to main content

backgroundlog

Thread-based log handler for better performance

test License Maintenance made-with-python Code style: black Imports: isort Checked with mypy PyPI pyversions PyPI version backgroundlog PyPI status PyPI download month

Do not have your python program slowed down by your logging.

Introduction

Most of the time we log on disk, and all I/O is time consuming. By leveraging a thread, it is possible to speed up your python application considerably.

Use

Default use

import logging
from backgroundlog.handlers.thread_handler import ThreadHandler

# Setting up the logging thread handler
file_handler = logging.FileHandler('/var/log/myapp.log', mode="a", encoding="utf-8")
thread_handler = ThreadHandler(file_handler)

# Creating a new logger
bg_logger = logging.getLogger('bg_logger')
bg_logger.setLevel(logging.INFO)

# Adding the thread handler
bg_logger.addHandler(thread_handler)

# Using the logger
bg_logger.info('This is a log message')

Options

Set a queue size

from backgroundlog.handlers.thread_handler import ThreadHandler

thread_handler = ThreadHandler(file_handler, queue_size=5000)

By default, the queue size is 1000.

Set a blocking policy by logging record levels

When putting the records in the queue, it could reach the queue size. We provide a way to deal with this issue: set a blocking policy by logging record level, and in the case of a non-blocking policy, the record will be discarded and we will increment a dropped log record.

Only info, error and critical records are blocking:
from backgroundlog.handlers.thread_handler import ThreadHandler
from logging import CRITICAL, ERROR, INFO

thread_handler = ThreadHandler(file_handler, blocking_levels={INFO, ERROR, CRITICAL})
Only error and critical records are blocking
from backgroundlog.handlers.thread_handler import ThreadHandler
from logging import CRITICAL, ERROR

thread_handler = ThreadHandler(file_handler, blocking_levels={ERROR, CRITICAL})
Only critical records are blocking
from backgroundlog.handlers.thread_handler import ThreadHandler
from logging import CRITICAL

thread_handler = ThreadHandler(file_handler, blocking_levels={CRITICAL})
No records are blocking
from backgroundlog.handlers.thread_handler import ThreadHandler

thread_handler = ThreadHandler(file_handler, blocking_levels=None)

By default, the error and critical records are blocking, the rest are not.

Performance testing

We have done several local testing with different logging handlers. See the file run_performance_comparison.py for a full catalog of the performance tests we run.

We used two versions of Python depending on if they had or not the global interpret lock:

  • Python 3.15.3 (with GIL)
  • Python 3.15.3t (without GIL)

All tests are 100_000 iterations of creating the same logging message, and were run in a Macbook Pro M1 with 16 GB of RAM.

Python 3.15.3 (with GIL)

Logging Handler Spent Time vs. Baseline
Mean Time (ms) Std Dev (ms)
StreamHandler 0.685 0.006 baseline
FileHandler 0.685 0.018 +0.03%
ThreadHandler (StreamHandler) 0.487 0.03 -28.911%
ThreadHandler (FileHandler) 0.475 0.002 -30.66%

There is a ~30% of improvement when running the thread handler.

Python 3.15.3t (without GIL)

Logging Handler Spent Time vs. Baseline
Mean Time (ms) Std Dev (ms)
StreamHandler 0.539 0.004 baseline
FileHandler 0.545 0.013 +1.109%
ThreadHandler (StreamHandler) 0.344 0.002 -36.301%
ThreadHandler (FileHandler) 0.339 0.001 -37.118%

There is a ~36% of improvement when running the thread handler. +6% with respect of the Python version with GIL.

Conclusions

Not blocking the main flow of your program by making use of backgroundlog gives you a 30% speed gain.

Dependencies

This package has no dependencies.

Python version support

Minimum version support is 3.10.

License

MIT license, but if you need any other contact me.

Metadata

Release files for backgroundlog 0.2.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for backgroundlog 0.2.6
File Size Uploaded
backgroundlog-0.2.6.tar.gz 9.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for backgroundlog 0.2.6
File Interpreter ABI Platform
backgroundlog-0.2.6-py3-none-any.whl Python 3 none any Details

Total release size: 17.8 kB

Release files / backgroundlog-0.2.6.tar.gz

Download URL backgroundlog-0.2.6.tar.gz
Size 9.0 kB
Tags Source
SHA-256 checksum
How to use checksums
3c6073600df61219961e4d3f85d48e352d0f87b4e8943520ecffe7cf0682c5f1
BLAKE2b-256 checksum
How to use checksums
48bc7bc7febc28732858e876f4727ada003b14251ba7f54eb98a07292fe7fc9a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2025.

Transparency log

Release files / backgroundlog-0.2.6-py3-none-any.whl

Download URL backgroundlog-0.2.6-py3-none-any.whl
Size 8.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8ee267f0f07669d38fe16d4a2ace7ad25b34f9ae1fb2d998264a92fbca663953
BLAKE2b-256 checksum
How to use checksums
60b53a3ac0483ef1749ddd06770bddba54d816802770b414d36ca0be4ec6563e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.6 This release

2 release files

0.2.4

2 release files

0.2.3

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page