o
    ›¨Êh5"  ã                   @   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_LOGÚceleryzcelery.taskc                 C   s   | a dS )z8Set flag signifiying that we're inside a signal handler.N)Ú_in_sighandler)Úvalue© r   úB/var/www/html/env/lib/python3.10/site-packages/celery/utils/log.pyr   '   s   r   c               
   c   s†   � t ƒ } ttjjj ¡ ƒt d ¡g }|D ]+}z |jD ]}z|| vr+|j	V  |  
|¡ W q ty5   Y qw W q ty@   Y qw 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 t dƒ dS t dƒ w )z5Context that records that we are in a signal handler.TNF)r   r   r   r   r   r   >   s
   €r   éè  c                 C   sj   | t ƒ }}t|ƒD ]#}||kr dS ||v r td| j›d�ƒ‚| |¡ |j}|s- dS q
td|› �ƒ‚)NTzLogger z parents recursivezLogger hierarchy exceeds F)r   ÚrangeÚRuntimeErrorÚnamer$   Úparent)r(   ÚpÚmaxÚthisr&   Ú_r   r   r   Ú
logger_isaH   s   ÿ
ür4   c                 C   s   t || ƒs| |_|S r   )r4   r/   )Úparent_loggerÚlogger_r   r   r   Ú_using_logger_parent[   s   
r7   c                 C   s.   t | ƒ}tj||jfvr|turtt|ƒ}|S )zGet logger by name.)Ú_get_loggerr   Úrootr/   r   r7   )r.   r(   r   r   r   r   a   s   
r   zcelery.workerc                 C   s&   | t v 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-   r7   Ú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.ÚblueÚyellowÚredÚmagenta)ÚDEBUGÚWARNINGÚERRORÚCRITICALNTc                    s   t ƒ  |¡ || _d S r   )ÚsuperÚ__init__Ú	use_color)ÚselfÚfmtrK   ©Ú	__class__r   r   rJ   ‡   s   
zColorFormatter.__init__c                    s&   |rt |tƒst ¡ }tƒ  |¡}|S r   )r<   ÚtupleÚsysÚexc_inforI   ÚformatException)rL   ÚeiÚrrN   r   r   rS   ‹   s   zColorFormatter.formatExceptionc                    s  t ƒ  |¡}| j |j¡}|jdkrt ¡ n|j}|r| jrz&zt|t	ƒr/t	|t
|ƒƒƒW W S t
||ƒƒW W S  tyD   t
|ƒ Y W S w  ty~ } z.|jdd t|ƒ|¡}|_|_zt ƒ  |¡W |||_|_W  Y d }~S |||_|_w d }~ww t
|ƒS )Nr   z<Unrepresentable {!r}: {!r}>)rI   ÚformatÚcolorsÚgetÚ	levelnamerR   rQ   rK   r<   Ústrr   ÚUnicodeDecodeErrorÚ	ExceptionÚmsgÚtype)rL   Úrecordr]   ÚcolorÚeinfoÚexcÚprev_msgrN   r   r   rV   ‘   s.   

ÿ
ÿÿ,€÷zColorFormatter.format©NT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   ÚnamesÚCOLORSrW   rJ   rS   rV   Ú__classcell__r   r   rN   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   zÓForward 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)rL   rm   rn   r   r   r   rJ   À   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 d S  ty   Y d S w r   )Ú	tracebackÚ	print_excrQ   Ú
__stderr__ÚOSError)rL   r_   r   r   r   ÚhandleErrorÐ   s
   ÿz^LoggingProxy._safewrap_handlers.<locals>.wrap_handler.<locals>.WithSafeHandleError.handleErrorN)re   rf   rg   rt   r   r   r   r   ÚWithSafeHandleErrorÎ   s    ru   )r   ÚHandlerrt   )r)   ru   r   r   r   Úwrap_handlerÌ   s   z5LoggingProxy._safewrap_handlers.<locals>.wrap_handlerc                    s   g | ]}ˆ |ƒ‘qS r   r   )Ú.0Úh©rw   r   r   Ú
<listcomp>×   s    z3LoggingProxy._safewrap_handlers.<locals>.<listcomp>)rm   r"   ©rL   r   rz   r   ro   Ç   s   zLoggingProxy._safewrap_handlersc                 C   s˜   t rt|ƒ}t|tjd� t|ƒS t| jddƒrdS |rJ| jsJd| j_	z!t|ƒ 
d¡}|r>| j | j|¡ t|ƒW d| j_	S W d| j_	dS d| j_	w dS )z Write message to logging object.)ÚfileÚrecurse_protectionFr   TÚ
)r   r   ÚprintrQ   rr   ÚlenÚgetattrÚ_threadÚclosedr~   Úrstriprm   Úlogrn   )rL   ÚdataÚ	safe_datar   r   r   ÚwriteÙ   s&   

ü
ÿzLoggingProxy.writec                 C   s   |D ]}|   |¡ qdS )z°Write 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‰   )rL   ÚsequenceÚpartr   r   r   Ú
writelinesî   s   ÿzLoggingProxy.writelinesc                 C   s   d S r   r   r|   r   r   r   Úflushø   s   zLoggingProxy.flushc                 C   s
   d| _ d S rd   )r„   r|   r   r   r   Úcloseý   s   
zLoggingProxy.closec                 C   s   dS )zHere for file support.Fr   r|   r   r   r   Úisatty  s   zLoggingProxy.isattyr   )re   rf   rg   rh   Úmoder.   r„   r   rG   rn   Ú	threadingÚlocalrƒ   rJ   ro   r‰   rŒ   r�   rŽ   r�   r   r   r   r   r   ²   s    

r   c                  C   s,   zddl m}  W |  ¡ S  ty   Y dS w )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y   Y dS w t| dƒrd| _dS dS )z$Reset multiprocessing logging setup.r   r“   Ú_loggerN)r•   r”   r–   Úhasattrr—   r“   r   r   r   r     s   ÿ

ÿr   c                  C   s,   zddl m}  W |  ¡ S  ty   Y d S w )Nr   ©Úprocess)r•   rš   r–   Úcurrent_processr™   r   r   r   r›     s   ýÿr›   c                 C   s"   t tƒ dd ƒ}|d ur||  S |S )NÚindex)r‚   r›   )Úbaserœ   r   r   r   Úcurrent_process_index%  s   rž   )r+   )r   )-rh   r   r=   ÚosrQ   r‘   rp   Ú
contextlibr   Útypingr   r   Ú	kombu.logr   r   r8   Úkombu.utils.encodingr   Útermr	   Ú__all__Ú_process_awarer   ÚenvironrX   r   r:   r   rm   r   r*   r   r4   r7   r;   Úworker_loggerr   r   Ú	Formatterr
   r   r   r   r›   rž   r   r   r   r   Ú<module>   sH    

	7U
	