
    }f                        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fdZd Zefd	Zdd
Z G d dej,                        Zd Zd Z G d dej4                        Zd Zy)    N)defaultdict)suppress)DefaultDictz6%(asctime)s - %(filename)s[%(levelname)s]: %(message)s#   c                 4   |xs t        j                  t              }t        j                         }t        j                  t
        j                        }|j                  |       |j                  |        |j                  |       |j                  |        y N)
logging	FormatterDEFAULT_LOG_FORMAT	getLoggerStreamHandlersysstderrsetFormattersetLevel
addHandler)level	formatterrootconsoles       //usr/lib/python3/dist-packages/cloudinit/log.pysetup_basic_loggingr      sn    BW../ABID##CJJ/G#UOOGMM%    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   r   r   &   sd    ]] a'//1'" 	  $++ s   A..A7	c                 f     t        j                   d        fd}|t         j                  _        y )N
DEPRECATEDc                 T    | j                        r | j                  ||fi | y y r   )isEnabledFor_log)selfmessageargskwargslvls       r   
deprecatedz-define_deprecation_logger.<locals>.deprecated3   s-    S!DIIc7D3F3 "r   )r	   addLevelNameLoggerr,   )r+   r,   s   ` r   define_deprecation_loggerr/   0   s&    l+4 !+GNNr   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exporterr2   log_cfga_cfgccfg_stram_triedbasic_enableds
             r   setup_loggingrS   :   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                   ^    e Zd ZU  ee      Zeeef   ed<   de	j                  fdZd Zd Zy)r7   holderrecordc                 p    | j                   |j                     j                  |j                                y r   )rU   	levelnamer;   
getMessage)r'   rV   s     r   emitzLogExporter.emit~   s(    F$$%,,V->->-@Ar   c                 @    t        j                  | j                        S r   )copydeepcopyrU   r'   s    r   export_logszLogExporter.export_logs   s    }}T[[))r   c                      y r    r^   s    r   r   zLogExporter.flush   s    r   N)__name__
__module____qualname__r   listrU   r   r:   __annotations__r	   	LogRecordrZ   r_   r   ra   r   r   r7   r7   {   s8    %0%6FKT	"6B7,, B*r   r7   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   re   r   r   closeremoveHandlerr   NOTSET)logr   r!   s      r   reset_loggingrm      s_    



CCLL!H 				! LL r   c                      t        j                  t        j                        d _        j                  t        j                  d             fd} | t         j                  _        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.
    c                      y r   ra   )rV   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'   rV   fallback_handlers     r   handleErrorz)setup_backup_logging.<locals>.handleError   s:    g 	%##F+""$	% 	% 	%s	   "<AN)r	   r   r   r   rt   r   r
   Handler)rt   rs   s    @r   setup_backup_loggingrv      sU    
 ,,SZZ8#6 !!N	
% #.GOOr   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__filenamerB   rC   basenamedirnamepathname)r'   r)   r*   	__class__s      r   r{   zCloudInitLogRecord.__init__   sM    $)&)DMM)GG,,RWW__T]]-KLDM *r   )rb   rc   rd   __doc__r{   __classcell__)r   s   @r   rx   rx      s    
M Mr   rx   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/   rv   rm   r7   r   r8   r   r   setLogRecordFactoryrx   )handlers    r   configure_root_loggerr      sj     #'++GO mGW\\"""7+  23r   r   )collections.abcr<   r\   rE   r	   logging.configlogging.handlersrB   r   r   r   
contextlibr   typingr   r   r#   DEBUGr   r   r/   rS   r   r7   rm   rv   rg   rx   r   ra   r   r   <module>r      s      	    	 
  #  M 
 &mmt  #- +>B
''' 
!.,	M** 	M4r   