o
    i$                     @   s   d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddl	Z	ddl
mZmZmZ ded	efd
dZG dd deZG dd deZG dd deZded	efddZdS )z5Comprehensive logging middleware for FastMCP servers.    N)Callable)Logger)Any   )CallNext
MiddlewareMiddlewareContextdatareturnc                 C   s   t j| td S )z>The default serializer for Payloads in the logging middleware.)fallback)pydantic_coreto_jsonstrdecode)r	    r   g/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/fastmcp/server/middleware/logging.pydefault_serializer   s   r   c                   @   sv  e Zd ZU dZeed< eed< eed< eed< eed< edB ed< ee	 dB ed	< eed
< e
ege	f dB ed< dee de	fddZdee	e	eB eB f de	fddZdee dee	e	eB eB f fddZdee dededee	e	eB eB f fddZdee dedee	e	eB eB f fddZ	d dee	e	eB eB f dedB fddZdee deeef defddZdS )!BaseLoggingMiddlewarez"Base class for logging middleware.logger	log_levelinclude_payloadsinclude_payload_lengthestimate_payload_tokensNmax_payload_lengthmethodsstructured_loggingpayload_serializercontextr
   c                 C   s   | j s
t|j}|S z	|  |j}W |S  tyA } z"| jd| d|j d|j d|j d	 t|j}W Y d }~|S d }~ww )Nz#Failed to serialize payload due to z:  .)	r   r   message	Exceptionr   warningtypemethodsource)selfr   payloader   r   r   _serialize_payload!   s   

"z(BaseLoggingMiddleware._serialize_payloadr    c                 C   s(   | j rt|S ddd | D S )zFormat a message for logging.r   c                 S   s   g | ]\}}| d | qS )=r   ).0kvr   r   r   
<listcomp>6   s    z9BaseLoggingMiddleware._format_message.<locals>.<listcomp>)r   jsondumpsjoinitems)r&   r    r   r   r   _format_message1   s   
z%BaseLoggingMiddleware._format_messagec                 C   s   |j d |jpd|jd}| js| js| jrY| |}| js!| jr7t|}|d }| jr0||d< | jr7||d< | jrJt|| jkrJ|d | j d }| jrY||d< t |j	j
|d	< |S )
N_startunknown)eventr$   r%      payload_tokenspayload_lengthz...r'   payload_type)r#   r$   r%   r   r   r   r)   lenr   r    __name__)r&   r   r    r'   r9   r8   r   r   r   _create_before_message8   s0   
z,BaseLoggingMiddleware._create_before_message
start_timeerrorc                 C   s0   t |}|jd |jpd|j|t|dd}|S )N_errorr5   )object)r6   r$   r%   duration_msr?   )_get_duration_msr#   r$   r%   r   )r&   r   r>   r?   rB   r    r   r   r   _create_error_messageY   s   z+BaseLoggingMiddleware._create_error_messagec                 C   s(   t |}|jd |jpd|j|d}|S )N_successr5   )r6   r$   r%   rB   )rC   r#   r$   r%   )r&   r   r>   rB   r    r   r   r   _create_after_messagei   s   z+BaseLoggingMiddleware._create_after_messagec                 C   s   | j |p| j| | d S N)r   logr   r3   )r&   r    r   r   r   r   _log_messagew   s   z"BaseLoggingMiddleware._log_message	call_nextc              
      s   | j r|j| j vr||I dH S | | | t }z||I dH }| | || |W S  tyI } z| | |||t	j
  d}~ww )z$Log messages for configured methods.N)r   r$   rI   r=   timeperf_counterrF   r!   rD   loggingERROR)r&   r   rJ   r>   resultr(   r   r   r   
on_message|   s    z BaseLoggingMiddleware.on_messagerG   )r<   
__module____qualname____doc__r   __annotations__intboollistr   r   r   r   r)   dictfloatr3   r=   r!   rD   rF   rI   r   rP   r   r   r   r   r      s^   
 "
!



r   c                   @   sl   e Zd ZdZdejddddddddejdB deded	ed
edede	e
 dB deege
f dB fddZdS )LoggingMiddlewarea  Middleware that provides comprehensive request and response logging.

    Logs all MCP messages with configurable detail levels. Useful for debugging,
    monitoring, and understanding server usage patterns.

    Example:
        ```python
        from fastmcp.server.middleware.logging import LoggingMiddleware
        import logging

        # Configure logging
        logging.basicConfig(level=logging.INFO)

        mcp = FastMCP("MyServer")
        mcp.add_middleware(LoggingMiddleware())
        ```
    NF  )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c          	      C   sD   |pt d| _|| _|| _|| _|| _|| _|| _|| _	d| _
dS )a  Initialize logging middleware.

        Args:
            logger: Logger instance to use. If None, creates a logger named 'fastmcp.requests'
            log_level: Log level for messages (default: INFO)
            include_payloads: Whether to include message payloads in logs
            include_payload_length: Whether to include response size in logs
            estimate_payload_tokens: Whether to estimate response tokens
            max_payload_length: Maximum length of payload to log (prevents huge logs)
            methods: List of methods to log. If None, logs all methods.
            payload_serializer: Callable that converts objects to a JSON string for the
                payload. If not provided, uses FastMCP's default tool serializer.
        zfastmcp.middleware.loggingFN)rM   	getLoggerr   r   r   r   r   r   r   r   r   )	r&   r   r   r   r   r   r   r   r   r   r   r   __init__   s   
zLoggingMiddleware.__init__r<   rQ   rR   rS   rM   INFOr   rU   rV   rW   r   r   r   r]   r   r   r   r   rZ      s6    
	
rZ   c                   @   sf   e Zd ZdZdejdddddddejdB dededed	ed
e	e
 dB deege
f dB fddZdS )StructuredLoggingMiddlewarea  Middleware that provides structured JSON logging for better log analysis.

    Outputs structured logs that are easier to parse and analyze with log
    aggregation tools like ELK stack, Splunk, or cloud logging services.

    Example:
        ```python
        from fastmcp.server.middleware.logging import StructuredLoggingMiddleware
        import logging

        mcp = FastMCP("MyServer")
        mcp.add_middleware(StructuredLoggingMiddleware())
        ```
    NF)r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                C   sD   |pt d| _|| _|| _|| _|| _|| _|| _d| _	d| _
dS )a  Initialize structured logging middleware.

        Args:
            logger: Logger instance to use. If None, creates a logger named 'fastmcp.structured'
            log_level: Log level for messages (default: INFO)
            include_payloads: Whether to include message payloads in logs
            include_payload_length: Whether to include payload size in logs
            estimate_payload_tokens: Whether to estimate token count using length // 4
            methods: List of methods to log. If None, logs all methods.
            payload_serializer: Callable that converts objects to a JSON string for the
                payload. If not provided, uses FastMCP's default tool serializer.
        z%fastmcp.middleware.structured_loggingNT)rM   r\   r   r   r   r   r   r   r   r   r   )r&   r   r   r   r   r   r   r   r   r   r   r]      s   
z$StructuredLoggingMiddleware.__init__r^   r   r   r   r   r`      s0    
	r`   r>   c                C   s   t t |  d ddS )Nr[      )numberndigits)roundrK   rL   )r>   r   r   r   rC      s   rC   )rS   r/   rM   rK   collections.abcr   r   typingr   r   
middlewarer   r   r   r   r   r   rZ   r`   rY   rC   r   r   r   r   <module>   s     74