B
    þ¦†\%  ã               @   sŠ   d Z ddlZddlZe d¡Zejejkr6e ej¡ dd„ Z	e
ƒ 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`
and :class:`.Pool` objects, corresponds to a logger specific to that
instance only.

é    NZ
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                sF   t  | jd | j ¡‰ ‡ fdd„| _‡ fdd„| _ˆ | _t | ¡ | S )NÚ.c                s   ˆ   tj¡S )N)ÚisEnabledForr   ÚDEBUG)Úself)r   r   r   Ú<lambda>.   s    zclass_logger.<locals>.<lambda>c                s   ˆ   tj¡S )N)r
   r   ÚINFO)r   )r   r   r   r   /   s    )	r   Ú	getLoggerÚ
__module__Ú__name__Ú_should_log_debugÚ_should_log_infor   Ú_logged_classesÚadd)Úclsr   )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   8   s    zIdentified._should_log_debugc             C   s   | j  tj¡S )N)r   r
   r   r   )r   r   r   r   r   ;   s    zIdentified._should_log_info)r   r   Ú__qualname__Úlogging_namer   r   r   r   r   r   r   5   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__Z   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   f   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   Úinfok   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   Úwarningp   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   Úerrorw   s    zInstanceLogger.errorc             O   s"   d|d< | j tj|f|ž|Ž dS )z4Delegate an exception call to the underlying logger.é   Ú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   sR   | j jj|krdS | j| j }|tjkr2| j  ¡ }||krN| j j|||f|Ž dS )zÎDelegate 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)	r   ÚmanagerÚdisabler   r   r   ÚNOTSETÚgetEffectiveLevelZ_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   r-   r.   r0   )r   r1   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   r/   r   r0   )r   r1   r   r   r   r0   ¥   s    

z InstanceLogger.getEffectiveLevelN)r   r   r   Ú__doc__r   r/   r   r   r   r    r   r%   r&   Úwarnr(   r+   r,   r!   r
   r0   r   r   r   r   r   ?   s    
r   c             C   sb   | j r d| jj| jj| j f }nd| jj| jjf }|| _|dkrNt |¡}n
t||ƒ}|| _dS )zEcreate a logger for an instance that implements :class:`.Identified`.z%s.%s.%sz%s.%s)FNN)	r   Ú	__class__r   r   Ú_echor   r   r   r   )ÚinstanceÚechoflagr   r   r   r   r   Úinstance_logger®   s    
r8   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)r5   )r   r6   Úownerr   r   r   Ú__get__×   s    zecho_property.__get__c             C   s   t ||d d S )N)r7   )r8   )r   r6   Úvaluer   r   r   Ú__set__Ý   s    zecho_property.__set__N)r   r   r   r2   r;   r=   r   r   r   r   r9   Ì   s   	r9   )N)r2   r   r   r   Z
rootloggerr1   r/   ZsetLevelZWARNr   Úsetr   r   Úobjectr   r   r8   r9   r   r   r   r   Ú<module>   s   
	
o
