a 'Dg@sddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddlm Z ddl m Z ddl mZdZdZejdZGdd d ejZejdfd d Zd d ZddddZdddZGdddejZddZddZGdddejZddZdS)N) defaultdict)suppress) DefaultDictz6%(asctime)s - %(filename)s[%(levelname)s]: %(message)s#c@s eZdZdZddZddZdS)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__)) cOsdSNselfargskwargsr r 9/usr/lib/python3.9/site-packages/cloudinit/log/loggers.pytrace&szCustomLoggerType.tracecOsdSrr r r r r deprecated)szCustomLoggerType.deprecatedN)__name__ __module__ __qualname____doc__rrr r r rrsrcCsN|p tt}t}ttj}||||| |||dSr) logging FormatterDEFAULT_LOG_FORMAT getLogger StreamHandlersysstderr setFormattersetLevel addHandler)level formatterrootZconsoler r rsetup_basic_logging-s    r"c Cs^|sdS|jD]@}t|tjrtt|Wdq1sD0Yqt|jdSr) handlers isinstancerrrIOErrorflush flush_loggersparent)r!hr r rr'7s   (r')returncCsHdd}ttdttdttjd|tttjd|tdS)z:Add DEPRECATED and TRACE log levels to the logging module.csfdd}|S)Ncs$|r |j||fi|dSr)Z isEnabledForZ_log)r messager r rr r log_at_levelEs z>define_extra_loggers..new_logger..log_at_levelr )rr-r r,r new_loggerDs z(define_extra_loggers..new_logger DEPRECATEDTRACErrN)rZ addLevelNamer/r0setattrLogger)r.r r rdefine_extra_loggersAs   r3c Csr|si}t}t}|tjg}|d}|rNt|trN|t|nhd|vr|dD]V}t|trx||q^t|t j j rdd|D}|d |q^|t|q^d}|D]p}t tR|d7}|drtj|st|}tj|||WddS1s$0Yq|||d d }tjd ||rntjd tdS) NZlogcfglog_cfgscSsg|] }t|qSr )str).0cr r r ez!setup_logging.. r/Z log_basicTz0WARN: no logging configured! (tried %s configs) zSetting up basic logging... )rr LogExporterrWARNgetr$r5append collectionsabcIterablejoinrFileNotFoundError startswithospathisfileioStringIOZconfigZ fileConfigrrrwriter") ZcfgZ root_loggerZexporterr4Zlog_cfgZa_cfgZcfg_strZam_triedZ basic_enabledr r r setup_loggingQsD         &   rMc@sNeZdZUeeZeeefed<e j dddZ ddZ ddZ d d Zd S) r=holderrecordcCs|j|j|dSr)rNZ levelnamer@Z getMessager rPr r remitszLogExporter.emitcCs t|jSr)copydeepcopyrNr r r r export_logsszLogExporter.export_logscCstt|_dSr)rlistrNrUr r r clean_logsszLogExporter.clean_logscCsdSrr rUr r rr&szLogExporter.flushN)rrrrrWrNrr5__annotations__r LogRecordrRrVrXr&r r r rr=s r=cCsFt}t|j}|D]}||||q|tjdS)z0Remove all current handlers and unset log level.N) rrrWr#r&closeZ removeHandlerrZNOTSET)logr#r)r r r reset_loggings  r]csJttjtdddtdfdd}ttjd|dS)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. handleErrorcSsdSrr rOr r rr9z&setup_backup_logging..z@FALLBACK: %(asctime)s - %(filename)s[%(levelname)s]: %(message)scs>tt"|Wdn1s00YdS)z;A closure that emits logs on stderr when other methods failN)rr%Zhandler&rQZfallback_handlerr rr^s  z)setup_backup_logging..handleErrorN)rrrrr1rrZHandler)r^r r`rsetup_backup_loggings  racs eZdZdZfddZZS)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 cs8tj|i|d|jkr4tjtj|j|_dS)Nz __init__.py)super__init__filenamerGrHbasenamedirnamepathnamer  __class__r rrds zCloudInitLogRecord.__init__)rrrrrd __classcell__r r rirrbsrbcCsJtjtj_tttt}| tj t |t tdS)z(Customize the root logger for cloud-initN)timegmtimerrZ converterr3rar]r=rr>rrZsetLogRecordFactoryrb)Zhandlerr r rconfigure_root_loggers  rn)N) collections.abcrArSrJrZlogging.configZlogging.handlersrGrrlr contextlibrtypingrrr/DEBUGr0r2rr"r'r3rMrr=r]rarZrbrnr r r r s0       A