x[h\ddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddlm Z ddl m Z ddl mZdZdZej"dz ZGdd ej&Zej"dfd Zd Zdd Zdd ZGddej2ZdZdZGddej:ZdZy)N) defaultdict)suppress) DefaultDictz6%(asctime)s - %(filename)s[%(levelname)s]: %(message)s#ceZdZdZdZdZy)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__)) cyNselfargskwargss 7/usr/lib/python3/dist-packages/cloudinit/log/loggers.pytracezCustomLoggerType.trace& cyr r r s r deprecatedzCustomLoggerType.deprecated)rrN)__name__ __module__ __qualname____doc__rrr rrr r s  rr c4|xstjt}tj}tjt j }|j||j||j||j|yr ) logging FormatterDEFAULT_LOG_FORMAT getLogger StreamHandlersysstderr setFormattersetLevel addHandler)level formatterrootconsoles rsetup_basic_loggingr*-snBW../ABI    D##CJJ/G # UOOGMM%rc|sy|jD]E}t|tjst t 5|j dddGt|jy#1swYgxYwr ) handlers isinstancerr rIOErrorflush flush_loggersparent)r(hs rr0r07sd  ]] a'// 1'"    $++  s A..A7 cd}tjtdtjtdt tj d|tt tj d|ty)z:Add DEPRECATED and TRACE log levels to the logging module.cfd}|S)NcT|jr|j||fi|yyr ) isEnabledFor_log)rmessagerrr&s r log_at_levelz>define_extra_loggers..new_logger..log_at_levelEs-  ' %$9&9(rr )r&r9s` r new_loggerz(define_extra_loggers..new_loggerDs :r DEPRECATEDTRACErrN)r addLevelNamer;r<setattrLogger)r:s rdefine_extra_loggersr@AsS \2 ( GNNL*Z*@A GNNGZ%67rc|si}tj}t}|jtjg}|j d}|r+t |tr|jt|nd|vr|dD]}t |tr|j|%t |tjjr9|Dcgc] }t|}}|jdj||jt|d}|D]}tt5|dz }|jdrt j"j%|st'j(|}tj*j-||j/| dddy|j/||j dd} t0j2j5d |z| r*t0j2j5d t7yycc}w#1swYxYw) Nlogcfglog_cfgs r/ log_basicTz0WARN: no logging configured! (tried %s configs) zSetting up basic logging... )rr LogExporterr$WARNgetr-strappend collectionsabcIterablejoinrFileNotFoundError startswithospathisfileioStringIOconfig fileConfigr%r!r"writer*) cfg root_loggerexporterrClog_cfga_cfgccfg_stram_tried basic_enableds r setup_loggingrdQs ##%K}H gll#HgghG:gs+ G % s _ ,E%%&EKOO$<$<>+01a3q611 ' 23E + ,H ' (  MH&&s+w0G++g. NN % %g .  " "8 ,    *8$GGK.MJJ;xH 89Q2  sH8?A->-@Arc@tj|jSr )copydeepcopyrfrs r export_logszLogExporter.export_logss}}T[[))rc,tt|_yr )rlistrfros r clean_logszLogExporter.clean_logss!$' rcyr r ros rr/zLogExporter.flushrrN)rrrrrrrfrrK__annotations__r LogRecordrkrprsr/r rrrHrHs=%0%6FKT "6B7,,B*( rrHctj}t|j}|D]3}|j |j |j |5|jtjy)z0Remove all current handlers and unset log level.N) rrrrr,r/close removeHandlerr$NOTSET)logr,r2s r reset_loggingr|s_    CCLL!H      !LL rctjtjt ddj tj dfd}t tjd|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. handleErrorcyr r )rgs rz&setup_backup_logging..srz@FALLBACK: %(asctime)s - %(filename)s[%(levelname)s]: %(message)sctt5j|jdddy#1swYyxYw)z;A closure that emits logs on stderr when other methods failN)rr.handler/)rrgfallback_handlers rr~z)setup_backup_logging..handleErrors: g  %  # #F +  " " $ % % %s "<AN)rr r!r"r>r#rHandler)r~rs @rsetup_backup_loggingrs^ ,,SZZ8 m-@A!! N  %  GOO]K8rc"eZdZdZfdZxZS)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 ct||i|d|jk(rLtjj tjj |j|_yy)Nz __init__.py)super__init__filenamerSrTbasenamedirnamepathname)rrr __class__s rrzCloudInitLogRecord.__init__sM $)&) DMM )GG,,RWW__T]]-KLDM *r)rrrrr __classcell__)rs@rrrs MMrrcPtjtj_t t tt}|jtjtjj|tjty)z(Customize the root logger for cloud-initN)timegmtimerr converterr@rr|rHr$rIrr%setLogRecordFactoryr)handlers rconfigure_root_loggerrsj#'++GOmG W\\" ""7+  23r)returnNr ) collections.abcrMrmrVrlogging.configlogging.handlersrSr!rr contextlibrtypingrrr;DEBUGr<r?r r*r0r@rdr rHr|rrvrrr rrrs  #M     w~~  &mmt 8 >B  '''  !9, M** M4r