Configuration Guide
Complete guide to configuring arlogi logging for your applications, including global setup, per-module configuration, and advanced handler configuration.
Quick Configuration
Basic Setup
Configure arlogi using the LoggingConfig pattern. This approach clearly separates configuration data from initialization logic and provides a type-safe interface.
from arlogi import LoggingConfig, LoggerFactory, get_logger
# 1. Configuration as a dataclass
config = LoggingConfig(
level="INFO",
module_levels={"app.db": "DEBUG"},
json_file_name="logs/app.jsonl"
)
# 2. Apply via factory
LoggerFactory._apply_configuration(config)
# 3. Use loggers
logger = get_logger("my_app")
logger.info("Application started using LoggingConfig")
Complete Production Setup
from arlogi import LoggingConfig, LoggerFactory, get_logger
config = LoggingConfig(
level="INFO",
module_levels={
"app.network": "TRACE",
"app.database": "DEBUG",
"app.security": "WARNING"
},
json_file_name="logs/app.jsonl",
json_file_only=False,
use_syslog=True,
show_time=False,
show_level=True,
show_path=True
)
LoggerFactory._apply_configuration(config)
logger = get_logger("app.main")
logger.info("Production logging configured")
Configuration Reference
LoggingConfig Attributes
| Parameter | Type | Default | Description |
| ---------------- | ---------------- | ------- | ------------------------------------- | -------------------------------- |
| level | int | str | "INFO" | Global log level for all modules |
| module_levels | Dict[str, str] | {} | Per-module log level overrides |
| json_file_name | str | None | None | JSON log file path |
| json_file_only | bool | False | Output only to JSON file (no console) |
| use_syslog | bool | False | Enable syslog output |
| syslog_address | str | tuple | "/dev/log" | Syslog server address |
| show_time | bool | False | Show timestamps in console output |
| show_level | bool | True | Show log levels in console output |
| show_path | bool | True | Show file paths in console output |
Log Levels
import logging
from arlogi import TRACE
# Available levels (from lowest to highest)
TRACE # 5 - Custom ultra-detailed debugging
logging.DEBUG # 10 - Standard debugging
logging.INFO # 20 - General information
logging.WARNING # 30 - Warnings
logging.ERROR # 40 - Errors
logging.CRITICAL # 50 - Critical failures
# Can use string names in LoggingConfig
config = LoggingConfig(level="INFO") # Same as logging.INFO
config = LoggingConfig(level="DEBUG") # Same as logging.DEBUG
config = LoggingConfig(level=TRACE) # Custom level
Per-Module Configuration
Module-Level Overrides
Module-Level Overrides
from arlogi import LoggingConfig, LoggerFactory
config = LoggingConfig(
level="INFO", # Global level
module_levels={
# Ultra-detailed logging for network operations
"app.network": "TRACE",
# Detailed logging for database operations
"app.database": "DEBUG",
# Quiet security logging (warnings only)
"app.security": "WARNING"
}
)
LoggerFactory._apply_configuration(config)
Module Hierarchy Matching
from arlogi import LoggingConfig, LoggerFactory
config = LoggingConfig(
level="INFO",
module_levels={
# Affects: app.network.http, app.network.tcp, app.network.udp
"app.network": "TRACE",
# Affects: app.database.mysql, app.database.postgresql
"app.database": "DEBUG",
# Affects: app.cache.redis, app.cache.memory
"app.cache": "INFO",
# Specific module override
"app.network.http.client": "DEBUG"
}
)
LoggerFactory._apply_configuration(config)
# Examples:
# get_logger("app.network.http") -> TRACE level
# get_logger("app.network.tcp") -> TRACE level
# get_logger("app.database.mysql") -> DEBUG level
# get_logger("app.network.http.client") -> DEBUG level (specific override)
# get_logger("app.other") -> INFO level (global)
Handler Configuration
Console Handler Configuration
Console Handler Configuration
from arlogi import LoggingConfig, LoggerFactory
# Basic console configuration
config = LoggingConfig(
level="INFO",
show_time=True,
show_level=True,
show_path=True
)
LoggerFactory._apply_configuration(config)
# Disable console output (JSON file only)
config = LoggingConfig(
level="INFO",
json_file_name="logs/app.jsonl",
json_file_only=True
)
LoggerFactory._apply_configuration(config)
JSON File Configuration
from arlogi import LoggingConfig, LoggerFactory
# Basic JSON file logging
config = LoggingConfig(json_file_name="logs/app.jsonl")
LoggerFactory._apply_configuration(config)
# JSON-only logging
config = LoggingConfig(
level="INFO",
json_file_name="logs/app.jsonl",
json_file_only=True
)
LoggerFactory._apply_configuration(config)
JSON File Structure
{
"timestamp": "2025-12-20T22:45:30.123456Z",
"level": "INFO",
"name": "app.main",
"message": "User logged in successfully",
"module": "main",
"function": "handle_login",
"line": 42,
"caller": "auth.authenticate",
"user_id": 12345,
"session_id": "sess_abc123"
}
Custom JSON Handlers
from arlogi import get_logger, get_json_logger
from arlogi.handlers import JSONFileHandler
# Default JSON logger
json_logger = get_json_logger("audit", "logs/audit.jsonl")
# Custom JSON handler with specific configuration
handler = JSONFileHandler(
filename="logs/custom.jsonl",
mode="a", # Append mode
encoding="utf-8", # File encoding
delay=False # Delay file creation
)
import logging
custom_logger = get_logger("custom")
custom_logger.addHandler(handler)
custom_logger.setLevel(logging.INFO)
custom_logger.info("Custom JSON logging", custom_field="value")
Syslog Configuration (Modern)
from arlogi import LoggingConfig, LoggerFactory
# Local syslog
config = LoggingConfig(
level="INFO",
use_syslog=True,
syslog_address="/dev/log" # Default
)
LoggerFactory._apply_configuration(config)
# Remote syslog server
config = LoggingConfig(
level="INFO",
use_syslog=True,
syslog_address=("syslog.example.com", 514)
)
LoggerFactory._apply_configuration(config)
# Syslog-only logger
from arlogi import get_syslog_logger
syslog_logger = get_syslog_logger("security")
syslog_logger.error("Security event detected")
Syslog Handler Details
from arlogi.handlers import ArlogiSyslogHandler
# Local Unix domain socket
handler = ArlogiSyslogHandler(address="/dev/log")
# Remote UDP syslog
handler = ArlogiSyslogHandler(
address=("logs.example.com", 514),
facility="user",
socktype="UDP"
)
# Remote TCP syslog
handler = ArlogiSyslogHandler(
address=("logs.example.com", 514),
facility="daemon",
socktype="TCP"
)
# Custom facility
import syslog
handler = ArlogiSyslogHandler(
address="/dev/log",
facility=syslog.LOG_LOCAL0
)
Application Structure Examples
Microservice Configuration
# config/logging.py
from arlogi import LoggingConfig, LoggerFactory
def setup_service_logging(service_name, environment="production"):
"""Configure logging for microservice"""
if environment == "development":
# Development: verbose console logging
config = LoggingConfig(
level="DEBUG",
show_time=True,
show_level=True,
show_path=True
)
elif environment == "testing":
# Testing: JSON-only for automated analysis
config = LoggingConfig(
level="INFO",
json_file_name=f"logs/{service_name}.jsonl",
json_file_only=True
)
else:
# Production: console + JSON + syslog
config = LoggingConfig(
level="INFO",
module_levels={
f"{service_name}.network": "DEBUG",
f"{service_name}.database": "DEBUG"
},
json_file_name=f"logs/{service_name}.jsonl",
use_syslog=True,
show_time=False,
show_level=True,
show_path=True
)
LoggerFactory._apply_configuration(config)
# main.py
from config.logging import setup_service_logging
from arlogi import get_logger
setup_service_logging("user-service", environment="production")
logger = get_logger("user-service.main")
logger.info("User service started")
Web Application Configuration
# app/config.py
from arlogi import LoggingConfig, LoggerFactory
class LoggingSetup:
@staticmethod
def configure(app_name, environment="development"):
"""Configure logging for web application"""
module_levels = {
f"{app_name}.network": "DEBUG",
f"{app_name}.database": "DEBUG",
f"{app_name}.auth": "INFO",
f"{app_name}.api": "INFO"
}
if environment == "development":
config = LoggingConfig(
level="DEBUG",
show_time=True,
show_path=True,
module_levels=module_levels
)
elif environment == "staging":
config = LoggingConfig(
level="INFO",
json_file_name=f"logs/{app_name}-staging.jsonl",
use_syslog=True,
syslog_address=("staging-logs.company.com", 514),
module_levels=module_levels
)
elif environment == "production":
config = LoggingConfig(
level="WARNING", # Less verbose in production
module_levels={
f"{app_name}.auth": "ERROR", # Only auth errors
f"{app_name}.api": "WARNING", # API warnings
f"{app_name}.business": "INFO", # Business events
**module_levels
},
json_file_name=f"logs/{app_name}.jsonl",
use_syslog=True,
syslog_address=("logs.company.com", 514)
)
LoggerFactory._apply_configuration(config)
# app.py
from app.config import LoggingSetup
from arlogi import get_logger
LoggingSetup.configure("myapp", environment="production")
app_logger = get_logger("myapp.app")
app_logger.info("Web application started")
CLI Application Configuration
# cli/config.py
import os
from arlogi import LoggingConfig, LoggerFactory
def setup_cli_logging(verbosity=0, log_file=None):
"""Configure logging for CLI application"""
if verbosity >= 2:
# Very verbose: DEBUG level with console details
config = LoggingConfig(
level="DEBUG",
show_time=True,
show_level=True,
show_path=True,
json_file_name=log_file
)
elif verbosity >= 1:
# Verbose: INFO level with basic console
config = LoggingConfig(
level="INFO",
show_time=False,
show_level=True,
show_path=False,
json_file_name=log_file
)
else:
# Quiet: ERROR level only
config = LoggingConfig(
level="ERROR",
json_file_name=log_file,
json_file_only=not log_file
)
LoggerFactory._apply_configuration(config)
# cli/main.py
import argparse
from cli.config import setup_cli_logging
from arlogi import get_logger
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", action="count", default=0)
parser.add_argument("--log-file", help="Log to file")
args = parser.parse_args()
setup_cli_logging(args.verbose, args.log_file)
logger = get_logger("cli.main")
logger.info("CLI application started", verbose=args.verbose)
if __name__ == "__main__":
main()
Environment-Specific Configuration
Development Environment
from arlogi import LoggingConfig, LoggerFactory
def configure_development():
"""Development: maximum verbosity for debugging"""
config = LoggingConfig(
level="DEBUG",
module_levels={"app.*": "TRACE"},
show_time=True
)
LoggerFactory._apply_configuration(config)
Testing Environment
from arlogi import LoggingConfig, LoggerFactory
def configure_testing():
"""Testing: structured logs for automated analysis"""
config = LoggingConfig(
level="INFO",
json_file_name="logs/tests.jsonl",
json_file_only=True
)
LoggerFactory._apply_configuration(config)
Staging Environment
from arlogi import LoggingConfig, LoggerFactory
def configure_staging():
"""Staging: production-like with extra debugging"""
config = LoggingConfig(
level="INFO",
module_levels={
"app.auth": "DEBUG", # Debug authentication
"app.payments": "DEBUG", # Debug payments
"app.api": "INFO"
},
json_file_name="logs/staging.jsonl",
use_syslog=True,
syslog_address=("staging-logs.company.com", 514),
show_time=False,
show_level=True,
show_path=False
)
LoggerFactory._apply_configuration(config)
Production Environment
from arlogi import LoggingConfig, LoggerFactory
def configure_production():
"""Production: essential logging only"""
config = LoggingConfig(
level="WARNING",
module_levels={
"app.auth": "ERROR",
"app.business": "INFO",
},
json_file_name="logs/production.jsonl",
use_syslog=True
)
LoggerFactory._apply_configuration(config)
Dynamic Configuration
Runtime Level Adjustment
from arlogi import get_logger
# Get logger and adjust level at runtime
logger = get_logger("app.module")
# Check current level
print(f"Current level: {logger.level}")
# Adjust level dynamically
logger.setLevel("DEBUG")
logger.info("Level changed to DEBUG")
# Or use numeric levels
import logging
logger.setLevel(logging.INFO)
logger.info("Level changed to INFO")
Configuration from Environment Variables
import os
from arlogi import LoggingConfig, LoggerFactory
def configure_from_env():
"""Configure logging from environment variables"""
# Basic configuration
level = os.getenv("LOG_LEVEL", "INFO")
json_file = os.getenv("LOG_FILE", None)
syslog_enabled = os.getenv("LOG_SYSLOG", "false").lower() == "true"
config_kwargs = {
"level": level,
"json_file_name": json_file,
"use_syslog": syslog_enabled
}
# Console formatting from environment
if os.getenv("LOG_SHOW_TIME", "false").lower() == "true":
config_kwargs["show_time"] = True
if os.getenv("LOG_SHOW_PATH", "true").lower() == "false":
config_kwargs["show_path"] = False
# Module levels from environment (comma-separated)
module_levels_str = os.getenv("LOG_MODULE_LEVELS", "")
if module_levels_str:
module_levels = {}
for item in module_levels_str.split(","):
if ":" in item:
module, level = item.strip().split(":", 1)
module_levels[module.strip()] = level.strip()
config_kwargs["module_levels"] = module_levels
config = LoggingConfig(**config_kwargs)
LoggerFactory._apply_configuration(config)
# Usage
configure_from_env()
Configuration File Support
import json
import yaml
from pathlib import Path
from arlogi import LoggingConfig, LoggerFactory
def load_config_from_file(config_path):
"""Load logging configuration from JSON or YAML file"""
config_file = Path(config_path)
if not config_file.exists():
raise FileNotFoundError(f"Config file not found: {config_path}")
if config_file.suffix.lower() == '.json':
with open(config_file, 'r') as f:
data = json.load(f)
elif config_file.suffix.lower() in ['.yaml', '.yml']:
with open(config_file, 'r') as f:
data = yaml.safe_load(f)
else:
raise ValueError(f"Unsupported config file format: {config_file.suffix}")
config = LoggingConfig(**data)
LoggerFactory._apply_configuration(config)
# config.json example:
# {
# "level": "INFO",
# "module_levels": {
# "app.database": "DEBUG",
# "app.auth": "WARNING"
# },
# "json_file_name": "logs/app.jsonl",
# "show_time": false,
# "show_level": true,
# "show_path": true
# }
# Usage
load_config_from_file("config/logging.json")
Advanced Handler Configuration
Multiple JSON Files
from arlogi import get_logger
from arlogi.handlers import JSONFileHandler
import logging
# Create separate loggers for different purposes
app_logger = get_logger("app")
security_logger = get_logger("security")
audit_logger = get_logger("audit")
# Add separate JSON handlers
security_handler = JSONFileHandler("logs/security.jsonl")
audit_handler = JSONFileHandler("logs/audit.jsonl")
security_logger.addHandler(security_handler)
security_logger.setLevel(logging.WARNING)
audit_logger.addHandler(audit_handler)
audit_logger.setLevel(logging.INFO)
# Usage
app_logger.info("Application message") # Goes to console/default
security_logger.warning("Security event") # Goes to security.jsonl
audit_logger.info("Audit trail entry") # Goes to audit.jsonl
Custom Formatters
import logging
from arlogi.handlers import ColoredConsoleHandler
# Create custom console handler
handler = ColoredConsoleHandler(
show_time=True,
show_level=True,
show_path=True,
level_styles={
"TRACE": "dim blue",
"DEBUG": "dim cyan",
"INFO": "green",
"WARNING": "yellow",
"ERROR": "red",
"CRITICAL": "bold red"
}
)
# Add to specific logger
logger = get_logger("custom")
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.info("Custom formatted message")
Filtering Logs
import logging
class BusinessEventFilter(logging.Filter):
"""Filter to only allow business event logs"""
def filter(self, record):
return hasattr(record, 'event_type')
# Create logger with filter
logger = get_logger("business")
business_filter = BusinessEventFilter()
# Add filter to all handlers
for handler in logger.handlers:
handler.addFilter(business_filter)
# These will be logged
logger.info("User registered", event_type="user_signup")
logger.info("Order placed", event_type="order_created")
# These will be filtered out
logger.info("Debug message")
logger.debug("Technical details")
Configuration Validation
Validate Configuration
from arlogi import LoggingConfig, LoggerFactory, get_logger
import logging
def validate_logging_config():
"""Validate and test logging configuration"""
# Configure logging
config = LoggingConfig(level="DEBUG")
LoggerFactory._apply_configuration(config)
try:
# Test basic logging
logger = get_logger("validation")
logger.info("Configuration validation started")
# Test all log levels
logger.trace("TRACE level test")
logger.debug("DEBUG level test")
logger.info("INFO level test")
logger.warning("WARNING level test")
logger.error("ERROR level test")
# Test caller attribution
logger.info("Caller attribution test", caller_depth=0)
# Test structured logging
logger.info("Structured data test", key="value", number=42)
# Test exception logging
try:
raise ValueError("Test exception")
except ValueError:
logger.exception("Exception test")
print("✅ Logging configuration validated successfully")
return True
except Exception as e:
print(f"❌ Logging configuration validation failed: {e}")
return False
# Usage
if validate_logging_config():
print("Ready to start application")
else:
print("Fix logging configuration before starting")
Performance Optimization
High-Performance Configuration
from arlogi import LoggingConfig, LoggerFactory
def configure_high_performance():
"""Optimize for high-performance applications"""
config = LoggingConfig(
level="WARNING", # Minimal logging
json_file_name="logs/perf.jsonl",
show_time=False, # Fast console output
show_level=False,
show_path=False
)
LoggerFactory._apply_configuration(config)
def configure_balanced():
"""Balance between performance and observability"""
config = LoggingConfig(
level="INFO",
module_levels={
"app.critical": "DEBUG", # Only critical modules verbose
},
json_file_name="logs/balanced.jsonl",
show_time=False, # Faster console
show_level=True,
show_path=False
)
LoggerFactory._apply_configuration(config)
Conditional Logging
import os
from arlogi import LoggingConfig, LoggerFactory
DEBUG_MODE = os.getenv("DEBUG", "false").lower() == "true"
if DEBUG_MODE:
# Development configuration
config = LoggingConfig(
level="DEBUG",
show_time=True,
show_path=True
)
else:
# Production configuration
config = LoggingConfig(
level="INFO",
json_file_name="logs/production.jsonl"
)
LoggerFactory._apply_configuration(config)
# Usage in code
from arlogi import get_logger
logger = get_logger("performance")
def expensive_operation():
if DEBUG_MODE:
logger.debug("Starting expensive operation", caller_depth=1,
debug_data=get_debug_info())
# Expensive operation here
result = perform_calculation()
if DEBUG_MODE:
logger.debug("Expensive operation completed", caller_depth=1,
result=result)
return result
This comprehensive configuration guide covers all aspects of setting up arlogi logging for different application types and environments.