U
    d#                     @   sv   d Z ddlZddlmZ G dd dejZG dd dejZG dd	 d	ejZ	G d
d dej
ZG dd dejZdS )zExample event logger classes.

.. versionadded:: 3.11

These loggers can be registered using :func:`register` or
:class:`~pymongo.mongo_client.MongoClient`.

``monitoring.register(CommandLogger())``

or

``MongoClient(event_listeners=[CommandLogger()])``
    N)
monitoringc                   @   sF   e Zd ZdZejddddZejddddZej	dddd	Z
dS )
CommandLoggeraI  A simple listener that logs command events.

    Listens for :class:`~pymongo.monitoring.CommandStartedEvent`,
    :class:`~pymongo.monitoring.CommandSucceededEvent` and
    :class:`~pymongo.monitoring.CommandFailedEvent` events and
    logs them at the `INFO` severity level using :mod:`logging`.
    .. versionadded:: 3.11
    Neventreturnc                 C   s&   t d|j d|j d|j  d S )NCommand  with request id z started on server )logginginfocommand_name
request_idconnection_idselfr    r   9/tmp/pip-unpacked-wheel-oblwsawz/pymongo/event_loggers.pystarted,   s    zCommandLogger.startedc                 C   s0   t d|j d|j d|j d|j d	 d S )Nr   r    on server z succeeded in  microsecondsr	   r
   r   r   r   Zduration_microsr   r   r   r   	succeeded3   s    $zCommandLogger.succeededc                 C   s0   t d|j d|j d|j d|j d	 d S )Nr   r   r   z failed in r   r   r   r   r   r   failed;   s    $zCommandLogger.failed)__name__
__module____qualname____doc__r   ZCommandStartedEventr   ZCommandSucceededEventr   ZCommandFailedEventr   r   r   r   r   r   "   s   	r   c                   @   sF   e Zd ZdZejddddZejddddZej	dddd	Z
dS )
ServerLoggeraZ  A simple listener that logs server discovery events.

    Listens for :class:`~pymongo.monitoring.ServerOpeningEvent`,
    :class:`~pymongo.monitoring.ServerDescriptionChangedEvent`,
    and :class:`~pymongo.monitoring.ServerClosedEvent`
    events and logs them at the `INFO` severity level using :mod:`logging`.

    .. versionadded:: 3.11
    Nr   c                 C   s   t d|j d|j  d S )NServer z added to topology )r	   r
   server_addresstopology_idr   r   r   r   openedO   s    zServerLogger.openedc                 C   sB   |j j}|jj}||kr>td|j d|j j d|jj  d S )Nr    changed type from  to )previous_descriptionZserver_typenew_descriptionr	   r
   r   Zserver_type_name)r   r   Zprevious_server_typeZnew_server_typer   r   r   description_changedR   s    z ServerLogger.description_changedc                 C   s   t d|j d|j  d S )Nr   z removed from topology )r	   warningr   r   r   r   r   r   closed]   s    zServerLogger.closed)r   r   r   r   r   ZServerOpeningEventr    ZServerDescriptionChangedEventr%   ZServerClosedEventr'   r   r   r   r   r   D   s   
r   c                   @   sF   e Zd ZdZejddddZejddddZej	dddd	Z
dS )
HeartbeatLoggeral  A simple listener that logs server heartbeat events.

    Listens for :class:`~pymongo.monitoring.ServerHeartbeatStartedEvent`,
    :class:`~pymongo.monitoring.ServerHeartbeatSucceededEvent`,
    and :class:`~pymongo.monitoring.ServerHeartbeatFailedEvent`
    events and logs them at the `INFO` severity level using :mod:`logging`.

    .. versionadded:: 3.11
    Nr   c                 C   s   t d|j  d S )NzHeartbeat sent to server )r	   r
   r   r   r   r   r   r   l   s    zHeartbeatLogger.startedc                 C   s    t d|j d|jj  d S )NHeartbeat to server z succeeded with reply )r	   r
   r   replydocumentr   r   r   r   r   o   s    zHeartbeatLogger.succeededc                 C   s   t d|j d|j  d S )Nr)   z failed with error )r	   r&   r   r*   r   r   r   r   r   w   s    zHeartbeatLogger.failed)r   r   r   r   r   ZServerHeartbeatStartedEventr   ZServerHeartbeatSucceededEventr   ZServerHeartbeatFailedEventr   r   r   r   r   r(   a   s   
r(   c                   @   sF   e Zd ZdZejddddZejddddZej	dddd	Z
dS )
TopologyLoggera^  A simple listener that logs server topology events.

    Listens for :class:`~pymongo.monitoring.TopologyOpenedEvent`,
    :class:`~pymongo.monitoring.TopologyDescriptionChangedEvent`,
    and :class:`~pymongo.monitoring.TopologyClosedEvent`
    events and logs them at the `INFO` severity level using :mod:`logging`.

    .. versionadded:: 3.11
    Nr   c                 C   s   t d|j d d S )NTopology with id z openedr	   r
   r   r   r   r   r   r       s    zTopologyLogger.openedc                 C   s|   t d|j  |jj}|jj}||krPt d|j d|jj d|jj  |j sdt d |j	 sxt d d S )Nz-Topology description updated for topology id z	Topology r!   r"   zNo writable servers available.zNo readable servers available.)
r	   r
   r   r#   Ztopology_typer$   Ztopology_type_nameZhas_writable_serverr&   Zhas_readable_server)r   r   Zprevious_topology_typeZnew_topology_typer   r   r   r%      s    


z"TopologyLogger.description_changedc                 C   s   t d|j d d S )Nr-   z closedr.   r   r   r   r   r'      s    zTopologyLogger.closed)r   r   r   r   r   ZTopologyOpenedEventr    ZTopologyDescriptionChangedEventr%   ZTopologyClosedEventr'   r   r   r   r   r,   }   s   
r,   c                   @   s   e Zd ZdZejddddZejddddZej	dddd	Z
ejddd
dZejddddZejddddZejddddZejddddZejddddZejddddZejddddZdS )ConnectionPoolLoggera  A simple listener that logs server connection pool events.

    Listens for :class:`~pymongo.monitoring.PoolCreatedEvent`,
    :class:`~pymongo.monitoring.PoolClearedEvent`,
    :class:`~pymongo.monitoring.PoolClosedEvent`,
    :~pymongo.monitoring.class:`ConnectionCreatedEvent`,
    :class:`~pymongo.monitoring.ConnectionReadyEvent`,
    :class:`~pymongo.monitoring.ConnectionClosedEvent`,
    :class:`~pymongo.monitoring.ConnectionCheckOutStartedEvent`,
    :class:`~pymongo.monitoring.ConnectionCheckOutFailedEvent`,
    :class:`~pymongo.monitoring.ConnectionCheckedOutEvent`,
    and :class:`~pymongo.monitoring.ConnectionCheckedInEvent`
    events and logs them at the `INFO` severity level using :mod:`logging`.

    .. versionadded:: 3.11
    Nr   c                 C   s   t d|j d d S )N[pool z] pool createdr	   r
   addressr   r   r   r   pool_created   s    z!ConnectionPoolLogger.pool_createdc                 C   s   t d|j d d S )Nr0   z] pool readyr1   r   r   r   r   
pool_ready   s    zConnectionPoolLogger.pool_readyc                 C   s   t d|j d d S )Nr0   z] pool clearedr1   r   r   r   r   pool_cleared   s    z!ConnectionPoolLogger.pool_clearedc                 C   s   t d|j d d S )Nr0   z] pool closedr1   r   r   r   r   pool_closed   s    z ConnectionPoolLogger.pool_closedc                 C   s    t d|j d|j d d S )Nr0   ][conn #z] connection createdr	   r
   r2   r   r   r   r   r   connection_created   s    z'ConnectionPoolLogger.connection_createdc                 C   s    t d|j d|j d d S )Nr0   r7   z] connection setup succeededr8   r   r   r   r   connection_ready   s    z%ConnectionPoolLogger.connection_readyc              	   C   s(   t d|j d|j d|j d d S )Nr0   r7   z] connection closed, reason: "")r	   r
   r2   r   reasonr   r   r   r   connection_closed   s    z&ConnectionPoolLogger.connection_closedc                 C   s   t d|j d d S )Nr0   z] connection check out startedr1   r   r   r   r   connection_check_out_started   s    z1ConnectionPoolLogger.connection_check_out_startedc                 C   s   t d|j d|j  d S )Nr0   z'] connection check out failed, reason: )r	   r
   r2   r<   r   r   r   r   connection_check_out_failed   s    z0ConnectionPoolLogger.connection_check_out_failedc                 C   s    t d|j d|j d d S )Nr0   r7   z ] connection checked out of poolr8   r   r   r   r   connection_checked_out   s    z+ConnectionPoolLogger.connection_checked_outc                 C   s    t d|j d|j d d S )Nr0   r7   z] connection checked into poolr8   r   r   r   r   connection_checked_in   s    z*ConnectionPoolLogger.connection_checked_in)r   r   r   r   r   ZPoolCreatedEventr3   ZPoolReadyEventr4   ZPoolClearedEventr5   ZPoolClosedEventr6   ZConnectionCreatedEventr9   ZConnectionReadyEventr:   ZConnectionClosedEventr=   ZConnectionCheckOutStartedEventr>   ZConnectionCheckOutFailedEventr?   ZConnectionCheckedOutEventr@   ZConnectionCheckedInEventrA   r   r   r   r   r/      s   r/   )r   r	   Zpymongor   ZCommandListenerr   ZServerListenerr   ZServerHeartbeatListenerr(   ZTopologyListenerr,   ZConnectionPoolListenerr/   r   r   r   r   <module>   s   "$