
    x[h                     b   S SK rS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SKJ
r
  S SKJr  S SKJr  SrSr\R"                  S-
  r " S S	\R&                  5      r\R"                  S4S
 jrS rSS jrSS jr " S S\R2                  5      rS rS r " S S\R:                  5      rS rg)    N)defaultdict)suppress)DefaultDictz6%(asctime)s - %(filename)s[%(levelname)s]: %(message)s#      c                   $    \ rS rSrSrS rS rSrg)CustomLoggerType   zA 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                     g N selfargskwargss      7/usr/lib/python3/dist-packages/cloudinit/log/loggers.pytraceCustomLoggerType.trace&           c                     g r   r   r   s      r   
deprecatedCustomLoggerType.deprecated)   r   r   r   N)__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes__r   r   r   r	   r	      s    r   r	   c                 D   U=(       d    [         R                  " [        5      n[         R                  " 5       n[         R                  " [
        R                  5      nUR                  U5        UR                  U 5        UR                  U5        UR                  U 5        g 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                    U (       d  g U R                    HL  n[        U[        R                  5      (       d  M$  [	        [
        5         UR                  5         S S S 5        MN     [        U R                  5        g ! , (       d  f       Mu  = fr   )	handlers
isinstancer!   r%   r   IOErrorflushflush_loggersparent)r-   hs     r   r5   r5   7   sY    ]]a'//11'"	 #"  $++ #"s   A;;
B
	c                  
   S n [         R                  " [        S5        [         R                  " [        S5        [	        [         R
                  SU " [        5      5        [	        [         R
                  SU " [        5      5        g)z:Add DEPRECATED and TRACE log levels to the logging module.c                    ^  U 4S jnU$ )Nc                 \   > U R                  T5      (       a  U R                  " TX40 UD6  g g r   )isEnabledFor_log)r   messager   r   r+   s       r   log_at_level>define_extra_loggers.<locals>.new_logger.<locals>.log_at_levelE   s,      ''		%9&9 (r   r   )r+   r>   s   ` r   
new_logger(define_extra_loggers.<locals>.new_loggerD   s    	: r   
DEPRECATEDTRACEr   r   N)r!   addLevelNamerB   rC   setattrLogger)r@   s    r   define_extra_loggersrG   A   sS     \2(GNNL*Z*@AGNNGZ%67r   c                    U (       d  0 n [         R                  " 5       n[        5       nUR                  [         R                  5        / nU R                  S5      nU(       a0  [        U[        5      (       a  UR                  [        U5      5        OSU ;   a  U S    H  n[        U[        5      (       a  UR                  U5        M+  [        U[        R                  R                  5      (       a=  U Vs/ s H  n[        U5      PM     nnUR                  SR                  U5      5        M  UR                  [        U5      5        M     SnU H  n[        [        5         US-  nUR                  S5      (       a$  [         R"                  R%                  U5      (       d  [&        R(                  " U5      n[         R*                  R-                  U5        UR/                  U5         S S S 5          g    UR/                  U5        U R                  SS5      n	[0        R2                  R5                  S	U-  5        U	(       a*  [0        R2                  R5                  S
5        [7        5         g g s  snf ! , (       d  f       GM1  = f)Nlogcfglog_cfgs
r      /	log_basicTz0WARN: no logging configured! (tried %s configs)
zSetting up basic logging...
)r!   r$   LogExporterr)   WARNgetr2   strappendcollectionsabcIterablejoinr   FileNotFoundError
startswithospathisfileioStringIOconfig
fileConfigr*   r&   r'   writer/   )
cfgroot_loggerexporterrJ   log_cfga_cfgccfg_stram_triedbasic_enableds
             r   setup_loggingrk   Q   s   ##%K}Hgll#HgghG:gs++ 	G%	s	_E%%%&EKOO$<$<>>+015a3q651		' 23E
+ % H
  '(MH &&s++w0G0G++g. NN%%g. ""8,  )(	 * 8$ GGK.MJJ;xH 

89 Q 2 )(s   5I,"BI11
J	c                   n    \ rS rSr% \" \5      r\\\4   \	S'   S\
R                  4S jrS rS rS rSrg	)
rO      holderrecordc                 p    U R                   UR                     R                  UR                  5       5        g r   )rn   	levelnamerS   
getMessage)r   ro   s     r   emitLogExporter.emit   s(    F$$%,,V->->-@Ar   c                 B    [         R                  " U R                  5      $ r   )copydeepcopyrn   r   s    r   export_logsLogExporter.export_logs   s    }}T[[))r   c                 ,    [        [        5      U l        g r   )r   listrn   rx   s    r   
clean_logsLogExporter.clean_logs   s    !$'r   c                     g r   r   rx   s    r   r4   LogExporter.flush   r   r   )rn   N)r   r   r   r   r   r|   rn   r   rR   __annotations__r!   	LogRecordrs   ry   r}   r4   r   r   r   r   rO   rO      s=    %0%6FKT	"6B7,, B*(r   rO   c                  
   [         R                  " 5       n [        U R                  5      nU H4  nUR	                  5         UR                  5         U R                  U5        M6     U R                  [         R                  5        g)z0Remove all current handlers and unset log level.N)	r!   r$   r|   r1   r4   closeremoveHandlerr)   NOTSET)logr1   r7   s      r   reset_loggingr      sZ    



CCLL!H				!  LL r   c                     ^ [         R                  " [        R                  5      m[	        TSS 5        TR                  [         R                  " S5      5        U4S jn [	        [         R                  SU 5        g)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                     g r   r   )ro   s    r   <lambda>&setup_backup_logging.<locals>.<lambda>   s    Dr   z@FALLBACK: %(asctime)s - %(filename)s[%(levelname)s]: %(message)sc                    > [        [        5         TR                  U5        TR                  5         SSS5        g! , (       d  f       g= f)z;A closure that emits logs on stderr when other methods failN)r   r3   handler4   )r   ro   fallback_handlers     r   r   )setup_backup_logging.<locals>.handleError   s1    g##F+""$ s	   "<
A
N)r!   r%   r&   r'   rE   r(   r"   Handler)r   r   s    @r   setup_backup_loggingr      s^    
 ,,SZZ8m-@A!!N	
% GOO]K8r   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )CloudInitLogRecord   zreporting 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U ]  " U0 UD6  SU R                  :X  aL  [        R                  R                  [        R                  R                  U R                  5      5      U l        g g )Nz__init__.py)super__init__filenamerZ   r[   basenamedirnamepathname)r   r   r   	__class__s      r   r   CloudInitLogRecord.__init__   sM    $)&)DMM)GG,,RWW__T]]-KLDM *r   )r   )r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      s    
M Mr   r   c                  T   [         R                  [        R                  l        [        5         [        5         [        5         [        5       n U R                  [        R                  5        [        R                  " 5       R                  U 5        [        R                  " [        5        g)z(Customize the root logger for cloud-initN)timegmtimer!   r"   	converterrG   r   r   rO   r)   rP   r$   r*   setLogRecordFactoryr   )handlers    r   configure_root_loggerr      sj     #'++GO mGW\\"""7+  23r   )returnNr   ) collections.abcrT   rv   r]   r!   logging.configlogging.handlersrZ   r&   r   r   
contextlibr   typingr   r#   rB   DEBUGrC   rF   r	   r/   r5   rG   rk   r%   rO   r   r   r   r   r   r   r   r   <module>r      s      	    	 
  #  M 
w~~   &mmt 8 >B'''  !9,	M** 	M4r   