U
    Ӈg                     @   s   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Zd dlZd dl	Z	d dlm
Z
 d dlmZ d dlmZ dZdZejd ZG dd	 d	ejZejdfd
dZdd ZddddZdddZG dd dejZdd Zdd ZG dd dejZdd ZdS )    N)defaultdict)suppress)DefaultDictz6%(asctime)s - %(filename)s[%(levelname)s]: %(message)s#      c                   @   s    e Zd ZdZdd Zdd ZdS )CustomLoggerTypezA hack to get mypy to stop complaining about custom logging methods.

    When using deprecated or trace logging, rather than:
        LOG = logging.getLogger(__name__)
    Instead do:
        LOG = cast(CustomLoggerType, logging.getLogger(__name__))
    c                 O   s   d S N selfargskwargsr	   r	   7/usr/lib/python3/dist-packages/cloudinit/log/loggers.pytrace&   s    zCustomLoggerType.tracec                 O   s   d S r   r	   r
   r	   r	   r   
deprecated)   s    zCustomLoggerType.deprecatedN)__name__
__module____qualname____doc__r   r   r	   r	   r	   r   r      s   r   c                 C   sN   |pt t}t  }t tj}|| ||  |	| ||  d S r   )
logging	FormatterDEFAULT_LOG_FORMAT	getLoggerStreamHandlersysstderrsetFormattersetLevel
addHandler)levelZ	formatterrootZconsoler	   r	   r   setup_basic_logging-   s    


r!   c              
   C   sJ   | sd S | j D ],}t|tjrtt |  W 5 Q R X qt| j d S r   )	handlers
isinstancer   r   r   IOErrorflushflush_loggersparent)r    hr	   r	   r   r&   7   s    

r&   )returnc                  C   sH   dd } t td t td tt jd| t tt jd| t dS )z:Add DEPRECATED and TRACE log levels to the logging module.c                    s    fdd}|S )Nc                    s    |   r| j ||f| d S r   )ZisEnabledForZ_log)r   messager   r   r   r	   r   log_at_levelE   s    
z>define_extra_loggers.<locals>.new_logger.<locals>.log_at_levelr	   )r   r,   r	   r+   r   
new_loggerD   s    z(define_extra_loggers.<locals>.new_logger
DEPRECATEDTRACEr   r   N)r   ZaddLevelNamer.   r/   setattrLogger)r-   r	   r	   r   define_extra_loggersA   s
    r2   c           	   
   C   sd  | si } t  }t }|t j g }| d}|rNt|trN|t| nhd| kr| d D ]V}t|trx|| q^t|t	j
jrdd |D }|d| q^|t| q^d}|D ]b}ttP |d7 }|drtj|st|}t j| || W 5 Q R   d S Q R X q|| | d	d
}tjd|  |r`tjd t  d S )NZlogcfglog_cfgsc                 S   s   g | ]}t |qS r	   )str).0cr	   r	   r   
<listcomp>e   s     z!setup_logging.<locals>.<listcomp>
r      /Z	log_basicTz0WARN: no logging configured! (tried %s configs)
zSetting up basic logging...
)r   r   LogExporterr   WARNgetr#   r4   appendcollectionsabcIterablejoinr   FileNotFoundError
startswithospathisfileioStringIOZconfigZ
fileConfigr   r   r   writer!   )	ZcfgZroot_loggerZexporterr3   Zlog_cfgZa_cfgZcfg_strZam_triedZbasic_enabledr	   r	   r   setup_loggingQ   sD    





rK   c                   @   sN   e Zd ZU eeZeeef ed< e	j
dddZdd Zdd Zd	d
 ZdS )r;   holderrecordc                 C   s   | j |j |  d S r   )rL   Z	levelnamer>   Z
getMessager   rN   r	   r	   r   emit   s    zLogExporter.emitc                 C   s   t | jS r   )copydeepcopyrL   r   r	   r	   r   export_logs   s    zLogExporter.export_logsc                 C   s   t t| _d S r   )r   listrL   rS   r	   r	   r   
clean_logs   s    zLogExporter.clean_logsc                 C   s   d S r   r	   rS   r	   r	   r   r%      s    zLogExporter.flushN)r   r   r   r   rU   rL   r   r4   __annotations__r   	LogRecordrP   rT   rV   r%   r	   r	   r	   r   r;      s
   
r;   c                  C   sF   t  } t| j}|D ]}|  |  | | q| t j dS )z0Remove all current handlers and unset log level.N)	r   r   rU   r"   r%   closeZremoveHandlerr   ZNOTSET)logr"   r(   r	   r	   r   reset_logging   s    
r[   c                     sJ   t tj t ddd   t d  fdd} tt jd|  dS )zIn the event that internal logging exception occurs and logging is not
    possible for some reason, make a desperate final attempt to log to stderr
    which may ease debugging.
    handleErrorc                 S   s   d S r   r	   rM   r	   r	   r   <lambda>       z&setup_backup_logging.<locals>.<lambda>z@FALLBACK: %(asctime)s - %(filename)s[%(levelname)s]: %(message)sc              	      s*   t t  |    W 5 Q R X dS )z;A closure that emits logs on stderr when other methods failN)r   r$   Zhandler%   rO   Zfallback_handlerr	   r   r\      s    

z)setup_backup_logging.<locals>.handleErrorN)r   r   r   r   r0   r   r   ZHandler)r\   r	   r_   r   setup_backup_logging   s    r`   c                       s    e Zd ZdZ fddZ  ZS )CloudInitLogRecordzreporting the filename as __init__.py isn't very useful in logs

    if the filename is __init__.py, use the parent directory as the filename
    c                    s4   t  j|| d| jkr0tjtj| j| _d S )Nz__init__.py)super__init__filenamerE   rF   basenamedirnamepathnamer
   	__class__r	   r   rc      s    
zCloudInitLogRecord.__init__)r   r   r   r   rc   __classcell__r	   r	   rh   r   ra      s   ra   c                  C   sJ   t jtj_t  t  t  t } | 	tj
 t |  tt dS )z(Customize the root logger for cloud-initN)timegmtimer   r   Z	converterr2   r`   r[   r;   r   r<   r   r   ZsetLogRecordFactoryra   )Zhandlerr	   r	   r   configure_root_logger   s    
rm   )N) Zcollections.abcr?   rQ   rH   r   Zlogging.configZlogging.handlersrE   r   rk   r   
contextlibr   typingr   r   r.   DEBUGr/   r1   r   r!   r&   r2   rK   r   r;   r[   r`   rX   ra   rm   r	   r	   r	   r   <module>   s0   



A