
    x[h                     \   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
  Z G d d	ej&                        Zej"                  dfd
Zd ZddZddZ G d dej2                        Zd Zd Z G d dej:                        Zd Zy)    N)defaultdict)suppress)DefaultDictz6%(asctime)s - %(filename)s[%(levelname)s]: %(message)s#      c                       e Zd ZdZd Zd Zy)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                      y N selfargskwargss      7/usr/lib/python3/dist-packages/cloudinit/log/loggers.pytracezCustomLoggerType.trace&           c                      y r   r   r   s      r   
deprecatedzCustomLoggerType.deprecated)   r   r   N)__name__
__module____qualname____doc__r   r   r   r   r   r	   r	      s    r   r	   c                 4   |xs t        j                  t              }t        j                         }t        j                  t
        j                        }|j                  |       |j                  |        |j                  |       |j                  |        y r   )
logging	FormatterDEFAULT_LOG_FORMAT	getLoggerStreamHandlersysstderrsetFormattersetLevel
addHandler)level	formatterrootconsoles       r   setup_basic_loggingr*   -   sn    BW../ABID##CJJ/G#UOOGMM%r   c                     | sy | j                   D ]E  }t        |t        j                        st	        t
              5  |j                          d d d        G t        | j                         y # 1 sw Y   gxY wr   )	handlers
isinstancer   r    r   IOErrorflushflush_loggersparent)r(   hs     r   r0   r0   7   sd    ]] a'//1'" 	  $++ s   A..A7	c                     d } t        j                  t        d       t        j                  t        d       t	        t         j
                  d | t                     t	        t         j
                  d | t                     y)z:Add DEPRECATED and TRACE log levels to the logging module.c                       fd}|S )Nc                 T    | j                        r | j                  ||fi | y y r   )isEnabledFor_log)r   messager   r   r&   s       r   log_at_levelz>define_extra_loggers.<locals>.new_logger.<locals>.log_at_levelE   s-      '		%$9&9 (r   r   )r&   r9   s   ` r   
new_loggerz(define_extra_loggers.<locals>.new_loggerD   s    	: r   
DEPRECATEDTRACEr   r   N)r   addLevelNamer;   r<   setattrLogger)r:   s    r   define_extra_loggersr@   A   sS     \2(GNNL*Z*@AGNNGZ%67r   c                    | si } t        j                         }t               }|j                  t         j                         g }| j                  d      }|r+t        |t              r|j                  t        |             nd| v r| d   D ]  }t        |t              r|j                  |       %t        |t        j                  j                        r9|D cg c]  }t        |       }}|j                  dj                  |             |j                  t        |              d}|D ]  }t        t              5  |dz  }|j                  d      rt         j"                  j%                  |      st'        j(                  |      }t         j*                  j-                  |       |j/                  |       	 d d d         y  |j/                  |       | j                  dd      }	t0        j2                  j5                  d	|z         |	r*t0        j2                  j5                  d
       t7                y y c c}w # 1 sw Y   xY w)Nlogcfglog_cfgs
r      /	log_basicTz0WARN: no logging configured! (tried %s configs)
zSetting up basic logging...
)r   r   LogExporterr$   WARNgetr-   strappendcollectionsabcIterablejoinr   FileNotFoundError
startswithospathisfileioStringIOconfig
fileConfigr%   r!   r"   writer*   )
cfgroot_loggerexporterrC   log_cfga_cfgccfg_stram_triedbasic_enableds
             r   setup_loggingrd   Q   s   ##%K}Hgll#HgghG:gs+ 	G%	s	_ 	,E%%&EKOO$<$<>+01a3q611		' 23E
+	, H
   '( 	MH &&s+w0G++g. NN%%g. ""8, 	 		* 8$ GGK.MJJ;xH 

89 Q 2	 	s   H8?A<H==I	c                   d    e Zd ZU  ee      Zeeef   ed<   de	j                  fdZd Zd Zd Zy)rH   holderrecordc                 p    | j                   |j                     j                  |j                                y r   )rf   	levelnamerL   
getMessage)r   rg   s     r   emitzLogExporter.emit   s(    F$$%,,V->->-@Ar   c                 @    t        j                  | j                        S r   )copydeepcopyrf   r   s    r   export_logszLogExporter.export_logs   s    }}T[[))r   c                 ,    t        t              | _        y r   )r   listrf   ro   s    r   
clean_logszLogExporter.clean_logs   s    !$'r   c                      y r   r   ro   s    r   r/   zLogExporter.flush   r   r   N)r   r   r   r   rr   rf   r   rK   __annotations__r   	LogRecordrk   rp   rs   r/   r   r   r   rH   rH      s=    %0%6FKT	"6B7,, B*(r   rH   c                     t        j                         } t        | j                        }|D ]3  }|j	                          |j                          | j                  |       5 | j                  t         j                         y)z0Remove all current handlers and unset log level.N)	r   r   rr   r,   r/   closeremoveHandlerr$   NOTSET)logr,   r2   s      r   reset_loggingr|      s_    



CCLL!H 				! LL r   c                      t        j                  t        j                        t	        dd        j                  t        j                  d             fd} t	        t         j                  d|        y)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                      y r   r   )rg   s    r   <lambda>z&setup_backup_logging.<locals>.<lambda>   s    r   z@FALLBACK: %(asctime)s - %(filename)s[%(levelname)s]: %(message)sc                     t        t              5  j                  |       j                          ddd       y# 1 sw Y   yxY w)z;A closure that emits logs on stderr when other methods failN)r   r.   handler/   )r   rg   fallback_handlers     r   r~   z)setup_backup_logging.<locals>.handleError   s:    g 	%##F+""$	% 	% 	%s	   "<AN)r   r    r!   r"   r>   r#   r   Handler)r~   r   s    @r   setup_backup_loggingr      s^    
 ,,SZZ8m-@A!!N	
% GOO]K8r   c                   "     e Zd ZdZ fdZ x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                     t        |   |i | d| j                  k(  rLt        j                  j                  t        j                  j                  | j                              | _        y y )Nz__init__.py)super__init__filenamerS   rT   basenamedirnamepathname)r   r   r   	__class__s      r   r   zCloudInitLogRecord.__init__   sM    $)&)DMM)GG,,RWW__T]]-KLDM *r   )r   r   r   r   r   __classcell__)r   s   @r   r   r      s    
M Mr   r   c                  P   t         j                  t        j                  _        t                t                t                t               } | j                  t        j                         t        j                         j                  |        t        j                  t               y)z(Customize the root logger for cloud-initN)timegmtimer   r   	converterr@   r   r|   rH   r$   rI   r   r%   setLogRecordFactoryr   )handlers    r   configure_root_loggerr      sj     #'++GO mGW\\"""7+  23r   )returnNr   ) collections.abcrM   rm   rV   r   logging.configlogging.handlersrS   r!   r   r   
contextlibr   typingr   r   r;   DEBUGr<   r?   r	   r*   r0   r@   rd   r    rH   r|   r   rv   r   r   r   r   r   <module>r      s      	    	 
  #  M 
w~~   &mmt 8 >B'''  !9,	M** 	M4r   