Skip to content

ccproxy.plugins.access_log.hook

ccproxy.plugins.access_log.hook

Hook-based access log implementation.

AccessLogHook

AccessLogHook(config=None)

Bases: Hook

Hook-based access logger implementation.

This hook listens to request/response lifecycle events and logs them according to the configured format (common, combined, or structured).

Parameters:

Name Type Description Default
config AccessLogConfig | None

Access log configuration

None
Source code in ccproxy/plugins/access_log/hook.py
def __init__(self, config: AccessLogConfig | None = None) -> None:
    """Initialize the access log hook.

    Args:
        config: Access log configuration
    """
    self.config = config or AccessLogConfig()
    self.formatter = AccessLogFormatter()

    # Create writers based on configuration
    self.client_writer: AccessLogWriter | None = None
    self.provider_writer: AccessLogWriter | None = None

    if self.config.client_enabled:
        self.client_writer = AccessLogWriter(
            self.config.client_log_file,
            self.config.buffer_size,
            self.config.flush_interval,
        )

    if self.config.provider_enabled:
        self.provider_writer = AccessLogWriter(
            self.config.provider_log_file,
            self.config.buffer_size,
            self.config.flush_interval,
        )

    # Track in-flight requests
    self.client_requests: dict[str, dict[str, Any]] = {}
    self.provider_requests: dict[str, dict[str, Any]] = {}
    # Store streaming metrics until REQUEST_COMPLETED fires
    self._streaming_metrics: dict[str, dict[str, Any]] = {}

    self.ingest_service: Any | None = None

    logger.trace(
        "access_log_hook_initialized",
        enabled=self.config.enabled,
        client_enabled=self.config.client_enabled,
        client_format=self.config.client_format,
        provider_enabled=self.config.provider_enabled,
    )

close async

close()

Close writers and flush any pending data.

Source code in ccproxy/plugins/access_log/hook.py
async def close(self) -> None:
    """Close writers and flush any pending data."""
    if self.client_writer:
        await self.client_writer.close()
    if self.provider_writer:
        await self.provider_writer.close()