B
    KLc                 @   s   d Z ddlZddlZddlmZ ddlmZ erBdZer<dndZndZdZed	Z	e	j
ejkrle	ej d
d Ze Zdd Zdd ZG dd deZG dd deZdddZG dd deZdS )a  Logging control and utilities.

Control of logging for SA can be performed from the regular python logging
module.  The regular dotted module namespace is used, starting at
'sqlalchemy'.  For class-level logging, the class name is appended.

The "echo" keyword parameter, available on SQLA :class:`_engine.Engine`
and :class:`_pool.Pool` objects, corresponds to a logger specific to that
instance only.

    N   )py311)py38T   FZ
sqlalchemyc             C   s*   t tj}|t d | | d S )Nz.%(asctime)s %(levelname)s %(name)s %(message)s)loggingZStreamHandlersysstdoutZsetFormatterZ	FormatterZ
addHandler)loggerZhandler r
   -lib/python3.7/site-packages/sqlalchemy/log.py_add_default_handler,   s    r   c             C   s   t | dd p| jd | j S )NZ_sqla_logger_namespace.)getattr
__module____name__)clsr
   r
   r   _qual_logger_name_for_cls7   s    r   c                s>   t t|   fdd| _ fdd| _ | _t|  | S )Nc                s     tjS )N)isEnabledForr   DEBUG)self)r	   r
   r   <lambda>@       zclass_logger.<locals>.<lambda>c                s     tjS )N)r   r   INFO)r   )r	   r
   r   r   A   r   )r   	getLoggerr   _should_log_debug_should_log_infor	   _logged_classesadd)r   r
   )r	   r   class_logger>   s    
r   c               @   s    e Zd ZdZdd Zdd ZdS )
IdentifiedNc             C   s   | j tjS )N)r	   r   r   r   )r   r
   r
   r   r   J   s    zIdentified._should_log_debugc             C   s   | j tjS )N)r	   r   r   r   )r   r
   r
   r   r   M   s    zIdentified._should_log_info)r   r   __qualname__logging_namer   r   r
   r
   r
   r   r   G   s   r   c               @   sz   e Zd ZdZejejejejdZdd Z	dd Z
dd Zd	d
 ZeZdd Zdd Zdd Zdd Zdd Zdd ZdS )InstanceLoggera  A logger adapter (wrapper) for :class:`.Identified` subclasses.

    This allows multiple instances (e.g. Engine or Pool instances)
    to share a logger, but have its verbosity controlled on a
    per-instance basis.

    The basic functionality is to return a logging level
    which is based on an instance's echo setting.

    Default implementation is:

    'debug' -> logging.DEBUG
    True    -> logging.INFO
    False   -> Effective level of underlying logger (
    logging.WARNING by default)
    None    -> same as False
    )NFTdebugc             C   s8   || _ t|| _| j| tjkr4| jjs4t| j d S )N)echor   r   r	   	_echo_mapr   Zhandlersr   )r   r$   namer
   r
   r   __init__l   s    zInstanceLogger.__init__c             O   s   | j tj|f|| dS )z/Delegate a debug call to the underlying logger.N)logr   r   )r   msgargskwargsr
   r
   r   r#   x   s    zInstanceLogger.debugc             O   s   | j tj|f|| dS )z/Delegate an info call to the underlying logger.N)r(   r   r   )r   r)   r*   r+   r
   r
   r   info}   s    zInstanceLogger.infoc             O   s   | j tj|f|| dS )z1Delegate a warning call to the underlying logger.N)r(   r   ZWARNING)r   r)   r*   r+   r
   r
   r   warning   s    zInstanceLogger.warningc             O   s   | j tj|f|| dS )zB
        Delegate an error call to the underlying logger.
        N)r(   r   ERROR)r   r)   r*   r+   r
   r
   r   error   s    zInstanceLogger.errorc             O   s"   d|d< | j tj|f|| dS )z4Delegate an exception call to the underlying logger.r   exc_infoN)r(   r   r.   )r   r)   r*   r+   r
   r
   r   	exception   s    zInstanceLogger.exceptionc             O   s   | j tj|f|| dS )z2Delegate a critical call to the underlying logger.N)r(   r   ZCRITICAL)r   r)   r*   r+   r
   r
   r   critical   s    zInstanceLogger.criticalc             O   sj   | j jj|krdS | j| j }|tjkr2| j  }||krftrR|	ddt
 |d< | j j|||f| dS )zDelegate a log call to the underlying logger.

        The level here is determined by the echo
        flag as well as that of the underlying logger, and
        logger._log() is called directly.

        N
stacklevelr   )r	   managerdisabler%   r$   r   NOTSETgetEffectiveLevel
STACKLEVELgetSTACKLEVEL_OFFSETZ_log)r   levelr)   r*   r+   Zselected_levelr
   r
   r   r(      s    

zInstanceLogger.logc             C   s   | j jj|krdS ||  kS )z)Is this logger enabled for level 'level'?F)r	   r4   r5   r7   )r   r;   r
   r
   r   r      s    zInstanceLogger.isEnabledForc             C   s$   | j | j }|tjkr | j }|S )z+What's the effective level for this logger?)r%   r$   r   r6   r	   r7   )r   r;   r
   r
   r   r7      s    

z InstanceLogger.getEffectiveLevelN)r   r   r    __doc__r   r6   r   r   r%   r'   r#   r,   r-   warnr/   r1   r2   r(   r   r7   r
   r
   r
   r   r"   Q   s    
r"   c             C   sT   | j rdt| j| j f }n
t| j}|| _|dkr@t|}n
t||}|| _dS )zEcreate a logger for an instance that implements :class:`.Identified`.z%s.%s)FNN)r!   r   	__class___echor   r   r"   r	   )instanceechoflagr&   r	   r
   r
   r   instance_logger   s    

rB   c               @   s    e Zd ZdZdd Zdd ZdS )echo_propertya}      When ``True``, enable log output for this element.

    This has the effect of setting the Python logging level for the namespace
    of this element's class and object reference.  A value of boolean ``True``
    indicates that the loglevel ``logging.INFO`` will be set for the logger,
    whereas the string value ``debug`` will set the loglevel to
    ``logging.DEBUG``.
    c             C   s   |d kr| S |j S d S )N)r?   )r   r@   ownerr
   r
   r   __get__   s    zecho_property.__get__c             C   s   t ||d d S )N)rA   )rB   )r   r@   valuer
   r
   r   __set__   s    zecho_property.__set__N)r   r   r    r<   rE   rG   r
   r
   r
   r   rC      s   	rC   )N)r<   r   r   utilr   r   r8   r:   r   Z
rootloggerr;   r6   ZsetLevelZWARNr   setr   r   r   objectr   r"   rB   rC   r
   r
   r
   r   <module>   s(   
	
t
