o
    …wÖiúB  ã                   @   s´   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	 d dl
mZm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
gZG dd
„ d
e jƒZG dd	„ d	edZdS )é    N)Úcontextmanager)ÚMemoryHandler)Ú(NEMO_ENV_VARNAME_REDIRECT_LOGS_TO_STDERRÚNEMO_ENV_VARNAME_TESTING)Úget_envbool)ÚBaseNeMoFormatterÚDebugNeMoFormatter)Úis_global_rank_zero)Ú	SingletonÚLoggerÚLogModec                   @   s   e Zd ZdZdZdS )r   r   é   N)Ú__name__Ú
__module__Ú__qualname__ÚEACHÚONCE© r   r   úT/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/nemo/utils/nemo_logging.pyr   !   s    c                   @   s<  e Zd ZejZejZejZejZejZej	Z	dddddddœZ
d9d	d
„Zd9dd„Zdd„ Zefdd„Zefdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd „ ƒZed!d"„ ƒZed#d$„ ƒZd%d&„ Zd'd(„ Zd:d*d+„Zd,d-„ Zej d.œd/d0„Z!ej d.œd1d2„Z"ej d.œd3d4„Z#ej d.œd5d6„Z$ej d.œd7d8„Z%d)S );r   ÚNOTSETÚDEBUGÚINFOÚWARNINGÚERRORÚCRITICAL)r   é
   é   é   é(   é2   Tc                 C   sJ   d | _ t ¡ | _tƒ | _d | _|  |¡ tƒ | _	t
ƒ r d| _d S d| _d S )Nr   ÚUNK)Ú_loggerÚ	threadingÚLockÚ_logger_lockÚdictÚ	_handlersÚold_warnings_showwarningÚ_define_loggerÚsetÚonce_loggedr	   Úrank)ÚselfÚcapture_warningsr   r   r   Ú__init__C   s   

zLogger.__init__c              
      s‚  ˆj durˆj S ˆj¨ zˆt d¡ˆ_ ˆ ¡  ttdƒr3t ¡ ‰ ‡ ‡fdd„}t |¡ ˆj	t
d ntƒ r:ˆ 	¡  tƒ rbtdƒˆjd< ˆjd  d	d
„ ¡ t}ˆjd  |ƒ ¡ ˆj  ˆjd ¡ tdƒˆjd< t}ˆjd  |ƒ ¡ ˆj  ˆjd ¡ W tj}ttdƒr‰tj}ˆj|d ˆ |¡ ntj}ttdƒr tj}ˆj|d ˆ |¡ w W d  ƒ n1 s¶w   Y  dˆj _dS )z9Creates the logger if not already created. Called in initNÚnemo_loggerFc                     s   ˆ | i |¤Ž}ˆj |_ |S ©N)r+   )ÚargsÚkwargsÚrecord©Úold_factoryr,   r   r   Úrecord_factory^   s   z-Logger._define_logger.<locals>.record_factory©Ú	formatteréÿÿÿÿÚ
memory_errc                 S   ó   | j tjkS r0   ©ÚlevelnoÚ_loggingr   ©r3   r   r   r   Ú<lambda>m   ó    z'Logger._define_logger.<locals>.<lambda>Ú
memory_all)Úverbosity_level)r!   r$   r>   Ú	getLoggerÚremove_stream_handlersr   r   ÚgetLogRecordFactoryÚsetLogRecordFactoryÚadd_stream_handlersr   r	   r   r&   Ú	addFilterr   ÚsetFormatterÚ
addHandlerr   r   r   Úset_verbosityÚcaptureWarningsÚ	propagate)r,   r-   r6   r8   Úlevelr   r4   r   r(   N   sF   



ü
Ù)zLogger._define_loggerc                 C   sz   | j du r	tdƒ‚z| j  | jd ¡ | jd= W n	 ty!   Y nw z| j  | jd ¡ | jd= W dS  ty<   Y dS w )zDRemoves StreamHandler that log to stdout and stderr from the logger.Nú:Impossible to set handlers if the Logger is not predefinedÚstream_stdoutÚstream_stderr)r!   ÚRuntimeErrorÚremoveHandlerr&   ÚKeyError©r,   r   r   r   rE   €   s   
ÿÿzLogger.remove_stream_handlersc                 C   sà   | j du r	tdƒ‚ttdƒrt tj¡| jd< n&t tj	¡| jd< | jd  
dd„ ¡ t tj¡| jd< | jd  
dd„ ¡ | jd  |ƒ ¡ | j  | jd ¡ z| jd  |ƒ ¡ | j  | jd ¡ W dS  tyo   Y dS w )	a%  Add StreamHandler that log to stdout and stderr to the logger. INFO and lower logs are streamed to stdout
        while WARNING and higher are streamed to stderr. If the NEMO_ENV_VARNAME_REDIRECT_LOGS_TO_STDERR environment
        variable is set, all logs are sent to stderr instead.
        NrP   FrQ   c                 S   s   | j tjkS r0   r<   r?   r   r   r   r@   ¡   rA   z,Logger.add_stream_handlers.<locals>.<lambda>rR   c                 S   r;   r0   r<   r?   r   r   r   r@   ¤   rA   )r!   rS   r   r   r>   ÚStreamHandlerÚsysÚstderrr&   ÚstdoutrI   rJ   rK   rU   ©r,   r8   r   r   r   rH   “   s    

ÿzLogger.add_stream_handlersc                 C   s   |   ¡  | j|d dS )z"Removes then adds stream handlers.r7   N)rE   rH   r[   r   r   r   Úreset_stream_handler¯   s   zLogger.reset_stream_handlerc                 C   sŒ   | j du r	tdƒ‚t |¡| jd< t}| jd  |ƒ ¡ | j  | jd ¡ | j dd¡rD| jd  	| jd ¡ | jd  
¡  | jd= dS dS )zæAdd a FileHandler to logger that logs all messages to a file. If the logger had a MemoryHandler at
        self._handlers["memory_all"], those buffered messages are flushed to the new file, and the MemoryHandler is
        closed.NrP   ÚfilerB   )r!   rS   r>   ÚFileHandlerr&   r   rJ   rK   ÚgetÚ	setTargetÚclose©r,   Úlog_filer8   r   r   r   Úadd_file_handler´   s   
ýzLogger.add_file_handlerc                 C   s    | j du r	tdƒ‚t |¡| jd< | jd  dd„ ¡ t}| jd  |ƒ ¡ | j  | jd ¡ | j 	dd¡rN| jd  
| jd ¡ | jd  ¡  | jd= dS dS )zùAdd a FileHandler to logger that logs all WARNING and higher messages to a file. If the logger had a
        MemoryHandler at self._handlers["memory_err"], those buffered messages are flushed to the new file, and the
        MemoryHandler is closed.NrP   Úfile_errc                 S   r;   r0   r<   r?   r   r   r   r@   Í   rA   z-Logger.add_err_file_handler.<locals>.<lambda>r:   )r!   rS   r>   r^   r&   rI   r   rJ   rK   r_   r`   ra   rb   r   r   r   Úadd_err_file_handlerÅ   s   
ýzLogger.add_err_file_handlerc                 C   s   | j dur
| j  ¡ S dS )z0Return how much logging output will be produced.N)r!   ÚgetEffectiveLevelrV   r   r   r   rg   Ø   s   

ÿzLogger.getEffectiveLevelc                 C   s   |   ¡ S )zSee getEffectiveLevel)rg   rV   r   r   r   Úget_verbosityÝ   s   zLogger.get_verbosityc                 C   s6   | j dur| j  |¡ | j jD ]	}| |¡ qdS dS )z4Sets the threshold for what messages will be logged.N)r!   ÚsetLevelÚhandlers)r,   rC   Úhandlerr   r   r   ri   á   s   
üzLogger.setLevelc                 C   s   |   |¡ dS )zSee setLevelN)ri   )r,   rC   r   r   r   rL   é   s   zLogger.set_verbosityc                 c   ó<   | j duršzmz7| jd j}|du rt‚| jd  ¡  z| jd  ¡  || jd _W | jd  ¡  n| jd  ¡  w |V  W n ttfyK   tdƒ‚w W | jd  ¡  z| jd  ¡  || jd _W | jd  ¡  dS | jd  ¡  w | jd  ¡  z| jd  ¡  || jd _W | jd  ¡  w | jd  ¡  w tdƒ‚)zPSends messages that should log to stderr to stream instead. Useful for unittestsNrR   ú>Impossible to patch logging handlers if handler does not exist©	r!   r&   ÚstreamÚ
ValueErrorÚacquireÚflushÚreleaserU   rS   ©r,   ro   Ú
old_streamr   r   r   Úpatch_stderr_handlerí   ó6   €
 
ÿÿ"û zLogger.patch_stderr_handlerc                 c   rl   )zPSends messages that should log to stdout to stream instead. Useful for unittestsNrQ   rm   rn   rt   r   r   r   Úpatch_stdout_handler  rw   zLogger.patch_stdout_handlerc              	   c   sR    | j dur!|  ¡ }z|  |¡ dV  W |  |¡ dS |  |¡ w zdV  W dS w )z@Sets the a temporary threshold for what messages will be logged.N)r!   rh   rL   )r,   rC   Úold_verbosityr   r   r   Útemp_verbosity-  s   €

zLogger.temp_verbosityc                 C   sX   | j dur&|r| jdu rtj| _| jt_dS |s(| jdur*| jt_d| _dS dS dS dS )zÏ
        If capture is true, redirect all warnings to the logging package.
        If capture is False, ensure that warnings are not redirected to logging
        but to their original destinations.
        N)r!   r'   ÚwarningsÚshowwarningÚ_showwarning)r,   Úcapturer   r   r   rM   C  s   

özLogger.captureWarningsc                 C   s:   ddl m} |D ]\}}}}}||kr|dkr dS qdS )Nr   )ÚfiltersÚignoreTF)r{   r   )r,   Úcategoryr   ÚactionÚmsgÚcatÚmodÚlnr   r   r   Ú_warning_is_ignoredV  s   €zLogger._warning_is_ignoredNc                 C   s0   t  |||||¡}|  |¡rdS |  d|¡ dS )z¾
        Implementation of showwarnings which redirects to logging.
        It will call warnings.formatwarning and will log the resulting string
        with level logging.WARNING.
        Nz%s)r{   Úformatwarningr‡   Úwarning)r,   Úmessager   ÚfilenameÚlinenor]   ÚlineÚsr   r   r   r}   `  s   
zLogger._showwarningc                 C   s<   d}|t jkr||d … | jv rdS | j ||d … ¡ dS )Né   TF)r   r   r*   Úadd)r,   rƒ   ÚmodeÚ
PREFIX_LENr   r   r   Ú_logged_oncek  s   
zLogger._logged_once)r‘   c                O   óN   | j dur!| j  tj¡r#|  ||¡s%| j jtj||fi |¤Ž dS dS dS dS )zð
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
        N)r!   ÚisEnabledForr   r   r“   Ú_log©r,   rƒ   r‘   r1   r2   r   r   r   Údebugs  ó   $	ÿzLogger.debugc                O   r”   )zó
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
        N)r!   r•   r   r   r“   r–   r—   r   r   r   Úinfo  r™   zLogger.infoc                O   r”   )zö
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
        N)r!   r•   r   r   r“   r–   r—   r   r   r   r‰   ‹  r™   zLogger.warningc                O   r”   )zï
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=1)
        N)r!   r•   r   r   r“   r–   r—   r   r   r   Úerror—  r™   zLogger.errorc                O   r”   )zö
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
        N)r!   r•   r   r   r“   r–   r—   r   r   r   Úcritical£  s   

ÿ
þüzLogger.critical)T)NN)&r   r   r   r>   r   r   r   r   r   r   Ú_level_namesr.   r(   rE   r   rH   r\   rd   rf   rg   rh   ri   rL   r   rv   rx   rz   rM   r‡   r}   r“   r   r   r˜   rš   r‰   r›   rœ   r   r   r   r   r   &   sP    ú
	
2




)Ú	metaclass)ÚenumÚloggingr>   rX   r"   r{   Ú
contextlibr   Úlogging.handlersr   Únemo.constantsr   r   Únemo.utils.env_var_parsingr   Únemo.utils.formatters.baser   r   Únemo.utils.get_rankr	   Únemo.utils.metaclassesr
   Ú__all__ÚIntEnumr   r   r   r   r   r   Ú<module>   s   