U
    Z+di"                     @   sJ  d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ d
ZdZdaejddZddhZed ZZdd Zdd Zedd Zd-ddZ dd Z!dd ZedZ"edZ#dd Z$dd  Z%G d!d" d"ej&Z'G d#d$ d$Z(d%d& Z)d'd( Z*d)d* Z+d.d+d,Z,dS )/zLogging utilities.    N)contextmanager)AnyStrSequence)
LOG_LEVELS)
get_logger)safe_str   )colored)ColorFormatterLoggingProxybase_loggerset_in_sighandlerin_sighandlerr   get_task_loggermlevelget_multiprocessing_loggerreset_multiprocessing_loggerr   FMP_LOGZceleryzcelery.taskc                 C   s   | a dS )z8Set flag signifiying that we're inside a signal handler.N)_in_sighandler)value r   4/tmp/pip-unpacked-wheel-ucduq0nd/celery/utils/log.pyr   '   s    r   c               
   c   s   t  } ttjjj td g }|D ]^}zD|jD ]8}z|| krT|j	V  | 
| W q4 tk
rj   Y q4X q4W q( tk
r   Y q(X q(d S N)setlistloggingLoggermanager
loggerDictvalues	getLoggerhandlersstreamaddAttributeError)seenloggerslhandlerr   r   r   iter_open_logger_fds-   s    

r)   c                   c   s"   t d z
dV  W 5 t d X dS )z5Context that records that we are in a signal handler.TFN)r   r   r   r   r   r   >   s    
r     c                 C   sl   | t   }}t|D ]D}||kr& dS ||kr@td| jd|| |j}|s qhqtd| dS )NTzLogger z parents recursivezLogger hierarchy exceeds F)r   rangeRuntimeErrornamer#   parent)r'   pmaxthisr%   _r   r   r   
logger_isaH   s    
r3   c                 C   s   t || s| |_|S r   )r3   r.   )Zparent_loggerZlogger_r   r   r   _using_logger_parent[   s    
r4   c                 C   s.   t | }tj||jfkr*|tk	r*tt|}|S )zGet logger by name.)_get_loggerr   rootr.   r   r4   )r-   r'   r   r   r   r   a   s    
r   zcelery.workerc                 C   s&   | t krtd| dttt| S )z#Get logger for task module by name.zLogger name z is reserved!)RESERVED_LOGGER_NAMESr,   r4   task_loggerr   )r-   r   r   r   r   m   s    r   c                 C   s    | rt | tjst|   S | S )z$Convert level name/int to log level.)
isinstancenumbersIntegralr   upper)levelr   r   r   r   t   s    r   c                       s`   e Zd ZdZe jZed ed ed ed dZd fd	d
	Z fddZ	 fddZ
  ZS )r
   z5Logging formatter that adds colors based on severity.ZblueZyellowZredZmagenta)DEBUGWARNINGERRORCRITICALNTc                    s   t  | || _d S r   )super__init__	use_color)selffmtrD   	__class__r   r   rC      s    zColorFormatter.__init__c                    s&   |rt |tst }t |}|S r   )r9   tuplesysexc_inforB   formatException)rE   eirrG   r   r   rL      s    zColorFormatter.formatExceptionc                    s  t  |}| j|j}|jdkr,t n|j}|r| jrzRz.t|t	rbt	|t
|W W S t
||W W S  tk
r   t
| Y W S X W np tk
r } zP|jddt||  }|_|_zt  |W 
 W Y S || |_|_X W 5 d }~X Y nX nt
|S d S )Nr   z<Unrepresentable {!r}: {!r}>)rB   formatcolorsget	levelnamerK   rJ   rD   r9   strr   UnicodeDecodeError	Exceptionmsgtype)rE   recordrV   colorZeinfoexcZprev_msgrG   r   r   rO      s.    
   $zColorFormatter.format)NT)__name__
__module____qualname____doc__r	   namesCOLORSrP   rC   rL   rO   __classcell__r   r   rG   r   r
   {   s   r
   c                   @   sd   e Zd ZdZdZdZdZejZ	e
 ZdddZdd Zd	d
 Zdd Zdd Zdd Zdd ZdS )r   zForward file object to :class:`logging.Logger` instance.

    Arguments:
        logger (~logging.Logger): Logger instance to forward to.
        loglevel (int, str): Log level to use when logging messages.
    wNFc                 C   s*   || _ t|p| j jp| j| _|   d S r   )loggerr   r=   loglevel_safewrap_handlers)rE   rc   rd   r   r   r   rC      s    zLoggingProxy.__init__c                    s   dd   fdd| j jD S )Nc                 S   s    G dd dt j}| j| _d S )Nc                   @   s   e Zd Zdd ZdS )zRLoggingProxy._safewrap_handlers.<locals>.wrap_handler.<locals>.WithSafeHandleErrorc                 S   s,   zt d tj W n tk
r&   Y nX d S r   )	traceback	print_excrJ   
__stderr__OSError)rE   rX   r   r   r   handleError   s    z^LoggingProxy._safewrap_handlers.<locals>.wrap_handler.<locals>.WithSafeHandleError.handleErrorN)r[   r\   r]   rj   r   r   r   r   WithSafeHandleError   s   rk   )r   Handlerrj   )r(   rk   r   r   r   wrap_handler   s    z5LoggingProxy._safewrap_handlers.<locals>.wrap_handlerc                    s   g | ]} |qS r   r   ).0hrm   r   r   
<listcomp>   s     z3LoggingProxy._safewrap_handlers.<locals>.<listcomp>)rc   r!   rE   r   rp   r   re      s    zLoggingProxy._safewrap_handlersc                 C   s   t r"t|}t|tjd t|S t| jddr4dS |r| jsd| j_	z2t|
d}|rv| j| j| t|W S W 5 d| j_	X dS )z Write message to logging object.)filerecurse_protectionFr   T
)r   r   printrJ   rh   lengetattr_threadclosedrt   rstriprc   logrd   )rE   dataZ	safe_datar   r   r   write   s    

zLoggingProxy.writec                 C   s   |D ]}|  | qdS )zWrite list of strings to file.

        The sequence can be any iterable object producing strings.
        This is equivalent to calling :meth:`write` for each string.
        N)r~   )rE   sequencepartr   r   r   
writelines   s    zLoggingProxy.writelinesc                 C   s   d S r   r   rr   r   r   r   flush   s    zLoggingProxy.flushc                 C   s
   d| _ d S )NT)rz   rr   r   r   r   close   s    zLoggingProxy.closec                 C   s   dS )zHere for file support.Fr   rr   r   r   r   isatty  s    zLoggingProxy.isatty)N)r[   r\   r]   r^   moder-   rz   r   r@   rd   	threadinglocalry   rC   re   r~   r   r   r   r   r   r   r   r   r      s   

r   c                  C   s2   zddl m}  W n tk
r$   Y n
X |  S dS )z"Return the multiprocessing logger.r   utilN)billiardr   ImportErrorr   r   r   r   r   r     s
    r   c                  C   s:   zddl m}  W n tk
r$   Y nX t| dr6d| _dS )z$Reset multiprocessing logging setup.r   r   _loggerN)r   r   r   hasattrr   r   r   r   r   r     s    
r   c                  C   s2   zddl m}  W n tk
r$   Y n
X |  S d S )Nr   process)r   r   r   current_processr   r   r   r   r     s
    r   c                 C   s"   t t dd }|d k	r||  S |S )Nindex)rx   r   )baser   r   r   r   current_process_index%  s    r   )r*   )r   )-r^   r   r:   osrJ   r   rf   
contextlibr   typingr   r   Z	kombu.logr   r   r5   Zkombu.utils.encodingr   Ztermr	   __all__Z_process_awarer   environrQ   r   r7   r   rc   r   r)   r   r3   r4   r8   Zworker_loggerr   r   	Formatterr
   r   r   r   r   r   r   r   r   r   <module>   sF   
	
7U
	