JSON formatter for Python's built-in logging package that enables structured, machine-readable log output
—
Helper functions for package management, compatibility checking, and error handling. These utilities support the core functionality of python-json-logger.
from pythonjsonlogger.utils import package_is_available
from pythonjsonlogger.exception import PythonJsonLoggerError, MissingPackageErrorFor checking availability constants:
import pythonjsonlogger
# pythonjsonlogger.ORJSON_AVAILABLE
# pythonjsonlogger.MSGSPEC_AVAILABLEFunction to check if optional dependencies are available for import.
def package_is_available(
name: str,
*,
throw_error: bool = False,
extras_name: str | None = None
) -> bool:
"""
Determine if the given package is available for import.
Used internally to check for optional dependencies like orjson
and msgspec before attempting to import them.
Parameters:
- name: import name of the package to check
- throw_error: raise MissingPackageError if package is unavailable
- extras_name: extra dependency name for error message
Returns:
True if package is available for import, False otherwise
Raises:
MissingPackageError: when throw_error is True and package is unavailable
"""Custom exception classes for python-json-logger specific errors.
class PythonJsonLoggerError(Exception):
"""
Generic base class for all Python JSON Logger exceptions.
Serves as the parent class for all custom exceptions
raised by the python-json-logger package.
"""
class MissingPackageError(ImportError, PythonJsonLoggerError):
"""
Exception raised when a required package is missing.
Inherits from both ImportError and PythonJsonLoggerError
to provide appropriate exception hierarchy.
"""
def __init__(self, name: str, extras_name: str | None = None) -> None:
"""
Initialize MissingPackageError with package information.
Parameters:
- name: name of the missing package
- extras_name: optional extras name for installation instructions
"""Module-level constants indicating availability of optional dependencies.
ORJSON_AVAILABLE: bool
"""
Boolean indicating whether the orjson package is available.
Set automatically at import time by checking if orjson can be imported.
Used to conditionally enable high-performance JSON formatting features.
"""
MSGSPEC_AVAILABLE: bool
"""
Boolean indicating whether the msgspec package is available.
Set automatically at import time by checking if msgspec can be imported.
Used to conditionally enable msgspec-based JSON formatting features.
"""from pythonjsonlogger.utils import package_is_available
# Simple availability check
if package_is_available("orjson"):
from pythonjsonlogger.orjson import OrjsonFormatter
formatter = OrjsonFormatter()
else:
from pythonjsonlogger.json import JsonFormatter
formatter = JsonFormatter()
# Check with error raising
try:
package_is_available("orjson", throw_error=True)
from pythonjsonlogger.orjson import OrjsonFormatter
formatter = OrjsonFormatter()
except MissingPackageError as e:
print(f"Cannot use orjson: {e}")
from pythonjsonlogger.json import JsonFormatter
formatter = JsonFormatter()import pythonjsonlogger
def get_optimal_formatter():
"""Select the best available JSON formatter."""
if pythonjsonlogger.ORJSON_AVAILABLE:
from pythonjsonlogger.orjson import OrjsonFormatter
return OrjsonFormatter('%(levelname)s %(name)s %(message)s')
elif pythonjsonlogger.MSGSPEC_AVAILABLE:
from pythonjsonlogger.msgspec import MsgspecFormatter
return MsgspecFormatter('%(levelname)s %(name)s %(message)s')
else:
from pythonjsonlogger.json import JsonFormatter
return JsonFormatter('%(levelname)s %(name)s %(message)s')
# Use the optimal formatter
formatter = get_optimal_formatter()from pythonjsonlogger.utils import package_is_available, MissingPackageError
from pythonjsonlogger.exception import PythonJsonLoggerError
def setup_high_performance_logging():
"""Set up logging with high-performance formatter or fallback."""
try:
# Try to use orjson with error on failure
package_is_available("orjson", throw_error=True, extras_name="orjson")
from pythonjsonlogger.orjson import OrjsonFormatter
return OrjsonFormatter('%(levelname)s %(message)s')
except MissingPackageError as e:
print(f"orjson not available: {e}")
try:
# Try msgspec as fallback
package_is_available("msgspec", throw_error=True, extras_name="msgspec")
from pythonjsonlogger.msgspec import MsgspecFormatter
return MsgspecFormatter('%(levelname)s %(message)s')
except MissingPackageError as e:
print(f"msgspec not available: {e}")
print("Using standard JSON formatter")
from pythonjsonlogger.json import JsonFormatter
return JsonFormatter('%(levelname)s %(message)s')from pythonjsonlogger.utils import package_is_available
def check_json_libraries():
"""Check availability of various JSON libraries."""
libraries = ['orjson', 'msgspec', 'ujson', 'rapidjson']
available = {}
for lib in libraries:
available[lib] = package_is_available(lib)
return available
# Check what's available
json_libs = check_json_libraries()
print("Available JSON libraries:", [k for k, v in json_libs.items() if v])from pythonjsonlogger.utils import MissingPackageError
def generate_install_command(package_name, extras_name=None):
"""Generate installation command for missing packages."""
if extras_name:
return f"pip install python-json-logger[{extras_name}]"
else:
return f"pip install {package_name}"
def safe_import_formatter(formatter_type):
"""Safely import a formatter with helpful error messages."""
try:
if formatter_type == "orjson":
from pythonjsonlogger.orjson import OrjsonFormatter
return OrjsonFormatter
elif formatter_type == "msgspec":
from pythonjsonlogger.msgspec import MsgspecFormatter
return MsgspecFormatter
else:
from pythonjsonlogger.json import JsonFormatter
return JsonFormatter
except MissingPackageError as e:
if "orjson" in str(e):
cmd = generate_install_command("orjson", "orjson")
print(f"To use orjson formatter: {cmd}")
elif "msgspec" in str(e):
cmd = generate_install_command("msgspec", "msgspec")
print(f"To use msgspec formatter: {cmd}")
# Fallback to standard formatter
from pythonjsonlogger.json import JsonFormatter
return JsonFormatterThe MissingPackageError provides helpful error messages:
# Without extras_name
MissingPackageError("orjson")
# Message: "The 'orjson' package is required but could not be found."
# With extras_name
MissingPackageError("orjson", "orjson")
# Message: "The 'orjson' package is required but could not be found. It can be installed using 'python-json-logger[orjson]'."For optional high-performance dependencies:
# Install with orjson support
pip install python-json-logger[orjson]
# Install with msgspec support
pip install python-json-logger[msgspec]
# Install with all optional dependencies
pip install python-json-logger[dev]Note: orjson and msgspec are not available on PyPy implementations.
Install with Tessl CLI
npx tessl i tessl/pypi-python-json-logger