CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-python-json-logger

JSON formatter for Python's built-in logging package that enables structured, machine-readable log output

Pending
Overview
Eval results
Files

utilities.mddocs/

Utilities

Helper functions for package management, compatibility checking, and error handling. These utilities support the core functionality of python-json-logger.

Core Imports

from pythonjsonlogger.utils import package_is_available
from pythonjsonlogger.exception import PythonJsonLoggerError, MissingPackageError

For checking availability constants:

import pythonjsonlogger
# pythonjsonlogger.ORJSON_AVAILABLE
# pythonjsonlogger.MSGSPEC_AVAILABLE

Capabilities

Package Availability Checking

Function 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
    """

Exception Classes

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
        """

Package Constants

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.
"""

Usage Examples

Checking Package Availability

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()

Using Package Constants

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()

Exception Handling

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')

Custom Package Checking

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])

Installation Instructions Generation

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 JsonFormatter

Error Messages

MissingPackageError Messages

The 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]'."

Installation Commands

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

docs

core-configuration.md

index.md

json-formatting.md

performance-formatting.md

type-handling.md

utilities.md

tile.json