
    d-                        d Z ddlZddlmZmZ ddlmZ ddlmZ  ed      Z ed	      Z	 ed
	      Z
 ed	      Z ed      Z ed      Z ed      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z e       Z G d de      Z G d de      Zej2                  dfdZd Zd  Zd! Zd" Zd# Zd$ Z d% Z!d& Z"d' Z#d( Z$d) Z%d* Z&d+ Z'ej2                  dfd,Z(y)-z
Log utils
    N)datetime	timedelta)currentThread)ustr   )days   )hours      )minutes   c                   |    e Zd ZdZdZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)Loggerz
    Logger class
    z%Y-%m-%dT%H:%M:%S.%fZNc                 R    g | _         || n|| _        i | _        || _        d| _        y NF)	appendersloggerperiodic_messagesprefixsilent)selfr   r   s      ?/usr/lib/python3/dist-packages/azurelinuxagent/common/logger.py__init__zLogger.__init__+   s,    $nd&!#    c                 &    i | j                   _        y N)r   r   r   s    r   reset_periodiczLogger.reset_periodic2   s    (*%r   c                     || _         y r   r   )r   r   s     r   
set_prefixzLogger.set_prefix5   s	    r   c                     || j                   j                  vxs1 | j                   j                  |   |z   t        j                         k  S r   )r   r   r   now)r   deltahs      r   _is_period_elapsedzLogger._is_period_elapsed8   sB    555 I[[**1-5(,,.H	Ir   c                     t        |      }| j                  ||      r5 ||g|  t        j                         | j                  j
                  |<   y y r   )hashr'   r   r$   r   r   )r   r%   log_level_op
msg_formatargsr&   s         r   	_periodiczLogger._periodic<   sH    ""5!,+d+/7||~DKK))!, -r   c                 B     | j                   || j                  |g|  y r   )r-   infor   r%   r+   r,   s       r   periodic_infozLogger.periodic_infoB       udii;d;r   c                 B     | j                   || j                  |g|  y r   )r-   verboser0   s       r   periodic_verbosezLogger.periodic_verboseE   s    udllJ>>r   c                 B     | j                   || j                  |g|  y r   )r-   warnr0   s       r   periodic_warnzLogger.periodic_warnH   r2   r   c                 B     | j                   || j                  |g|  y r   )r-   errorr0   s       r   periodic_errorzLogger.periodic_errorK   s    udjj*<t<r   c                 H     | j                   t        j                  |g|  y r   )logLogLevelVERBOSEr   r+   r,   s      r   r4   zLogger.verboseN       !!:55r   c                 H     | j                   t        j                  |g|  y r   )r=   r>   INFOr@   s      r   r/   zLogger.infoQ   s    
2T2r   c                 H     | j                   t        j                  |g|  y r   )r=   r>   WARNINGr@   s      r   r7   zLogger.warnT   rA   r   c                 H     | j                   t        j                  |g|  y r   )r=   r>   ERRORr@   s      r   r:   zLogger.errorW   s    3d3r   c                   
 
fd}| j                   ry t        |      t        urt        |d      }t        |      dkD  r |j                  | }n|}t        j                         j                  t        j                        }t        j                     }t               j                         }| j                   dj	                  |||| j                  |      
ndj	                  ||||      
t        
j                  dd      d      
| j                   D ]  }	|	j#                  
        | j$                  | k7  r.| j$                  j                   D ]  }	|	j#                  
        y y )	Nc                 z    | j                   s"	 d| _         | j                         d| _         yy# d| _         w xY w)aA  
            The appender_lock flag is used to signal if the logger is currently in use. This prevents a subsequent log
            coming in due to writing of a log statement to be not written.

            Eg:
            Assuming a logger with two appenders - FileAppender and TelemetryAppender. Here is an example of
            how using appender_lock flag can help.

            logger.warn("foo")
                |- log.warn() (azurelinuxagent.common.logger.Logger.warn)
                    |- log() (azurelinuxagent.common.logger.Logger.log)
                        |- FileAppender.appender_lock is currently False not log_appender.appender_lock is True
                            |- We sets it to True.
                        |- FileAppender.write completes.
                        |- FileAppender.appender_lock sets to False.
                        |- TelemetryAppender.appender_lock is currently False not log_appender.appender_lock is True
                            |- We sets it to True.
                    [A] |- TelemetryAppender.write gets called but has an error and writes a log.warn("bar")
                            |- log() (azurelinuxagent.common.logger.Logger.log)
                            |- FileAppender.appender_lock is set to True (log_appender.appender_lock was false when entering).
                            |- FileAppender.write completes.
                            |- FileAppender.appender_lock sets to False.
                            |- TelemetryAppender.appender_lock is already True, not log_appender.appender_lock is False
                            Thus [A] cannot happen again if TelemetryAppender.write is not getting called. It prevents
                            faulty appenders to not get called again and again.

            :param log_appender: Appender
            :return: None
            TFN)appender_lockwrite)log_appenderlevellog_items    r   	write_logzLogger.log.<locals>.write_log[   sD    <  --715L. &&uh716L. .
 27L.s   1 	:backslashreplace)errorsr   z{0} {1} {2} {3} {4}
z{0} {1} {2} {3}
ascii)encoding)r   typer   lenformatr   utcnowstrftimer   LogTimeFormatInUTCr>   STRINGSr   getNamer   encoder   rK   r   )r   rM   r+   r,   rO   msgtime	level_strthread_nameappenderrN   s    `        @r   r=   z
Logger.logZ   sI   #	7J ;; 
4'j1CDJt9q=#*##T*CC ))&*C*CD$$U+	#o--/;;"/66tYUYU`U`befH+224KQTUH1CD!(*  	,HNN5(+	, ;;$ KK11 0uh/0 r   c                 T    t        |||      }| j                  j                  |       y r   )_create_logger_appenderr   append)r   appender_typerM   pathra   s        r   add_appenderzLogger.add_appender   s"    *=%Fh'r   c                 :    t        d | j                  D              S )ze
        Returns True if the current list of appenders includes at least one ConsoleAppender
        c              3   <   K   | ]  }t        |t                y wr   )
isinstanceConsoleAppender).0ra   s     r   	<genexpr>z0Logger.console_output_enabled.<locals>.<genexpr>   s     XX:h8Xs   )anyr   r   s    r   console_output_enabledzLogger.console_output_enabled   s     XXXXr   c                 n    | j                   D cg c]  }t        |t              r| c}| _         yc c}w )zQ
        Removes all ConsoleAppenders from the current list of appenders
        N)r   rj   rk   )r   ra   s     r   disable_console_outputzLogger.disable_console_output   s(     48>>oxT\^mIn(oos   22)NN)__name__
__module____qualname____doc__rY   r   r   r"   r'   r-   r1   r5   r8   r;   r4   r/   r7   r:   r=   rg   ro   rq    r   r   r   r   #   si    
 2+I><?<=6364I0\(Ypr   r   c                       e Zd Zd Zd Zy)Appenderc                      d| _         || _        y r   )rJ   rM   )r   rM   s     r   r   zAppender.__init__   s    "
r   c                      y r   rv   r   rM   r]   s      r   rK   zAppender.write   s    r   N)rr   rs   rt   r   rK   rv   r   r   rx   rx      s    r   rx   c                   $     e Zd Z fdZd Z xZS )rk   c                 :    t         t        |   |       || _        y r   )superrk   r   rf   r   rM   rf   	__class__s      r   r   zConsoleAppender.__init__   s    ot-e4	r   c                     | j                   |k  r2	 t        | j                  d      5 }|j                  |       d d d        y y # 1 sw Y   y xY w# t        $ r Y y w xY w)NwrM   openrf   rK   IOError)r   rM   r]   consoles       r   rK   zConsoleAppender.write   s_    ::$))S) 'WMM#&' ' ' ' -   A AA AA A 	AArr   rs   rt   r   rK   __classcell__r   s   @r   rk   rk          r   rk   c                   $     e Zd Z fdZd Z xZS )FileAppenderc                 :    t         t        |   |       || _        y r   )r~   r   r   rf   r   s      r   r   zFileAppender.__init__   s    lD*51	r   c                     | j                   |k  r2	 t        | j                  d      5 }|j                  |       d d d        y y # 1 sw Y   y xY w# t        $ r Y y w xY w)Nza+r   )r   rM   r]   log_files       r   rK   zFileAppender.write   s_    ::$))T* (hNN3'( ( ( ( r   r   r   s   @r   r   r      r   r   r   c                   $     e Zd Z fdZd Z xZS )StdoutAppenderc                 ,    t         t        |   |       y r   )r~   r   r   )r   rM   r   s     r   r   zStdoutAppender.__init__   s    nd,U3r   c                     | j                   |k  r!	 t        j                  j                  |       y y # t        $ r Y y w xY wr   )rM   sysstdoutrK   r   r{   s      r   rK   zStdoutAppender.write   s>    ::

  %   s   2 	>>r   r   s   @r   r   r      s    4r   r   c                   $     e Zd Z fdZd Z xZS )TelemetryAppenderc                 :    t         t        |   |       || _        y r   )r~   r   r   
event_func)r   rM   r   r   s      r   r   zTelemetryAppender.__init__   s    /6$r   c                 h    | j                   |k  r	 | j                  ||       y y # t        $ r Y y w xY wr   )rM   r   r   r{   s      r   rK   zTelemetryAppender.write   s:    ::s+   s   % 	11r   r   s   @r   r   r      s    %r   r   c                   $    e Zd ZdZdZdZdZg dZy)r>   r   r         )r?   rC   rE   rG   N)rr   rs   rt   r?   rC   rE   rG   rZ   rv   r   r   r>   r>      s    GDGEGr   r>   c                       e Zd ZdZdZdZdZy)AppenderTyper   r   r   r   N)rr   rs   rt   FILECONSOLESTDOUT	TELEMETRYrv   r   r   r   r     s    DGFIr   r   c                 2    t         j                  | ||       y r   )DEFAULT_LOGGERrg   re   rM   rf   s      r   add_logger_appenderr     s    ud;r   c                  *    t         j                         S r   )r   ro   rv   r   r   ro   ro     s    0022r   c                  ,    t         j                          y r   )r   rq   rv   r   r   rq   rq     s    ))+r   c                  ,    t         j                          y r   )r   r   rv   r   r   r   r     s    !!#r   c                 .    t         j                  |        y r   )r   r"   r!   s    r   r"   r"     s    f%r   c                 2    t        j                  | |g|  yz
    The hash-map maintaining the state of the logs gets reset here -
    azurelinuxagent.ga.monitor.MonitorHandler.reset_loggers. The current time period is defined by RESET_LOGGERS_PERIOD.
    N)r   r1   r%   r+   r,   s      r   r1   r1   #      
   
:T:r   c                 2    t        j                  | |g|  yr   )r   r5   r   s      r   r5   r5   +  s    
 ##E:==r   c                 2    t        j                  | |g|  yr   )r   r;   r   s      r   r;   r;   3  s    
 !!%;d;r   c                 2    t        j                  | |g|  yr   )r   r8   r   s      r   r8   r8   ;  r   r   c                 0    t        j                  | g|  y r   )r   r4   r+   r,   s     r   r4   r4   C  s    :--r   c                 0    t        j                  | g|  y r   )r   r/   r   s     r   r/   r/   G      
*T*r   c                 0    t        j                  | g|  y r   )r   r7   r   s     r   r7   r7   K  r   r   c                 0    t        j                  | g|  y r   )r   r:   r   s     r   r:   r:   O  s    +d+r   c                 2    t         j                  | ||       y r   )r   r=   )rM   r+   r,   s      r   r=   r=   S  s    uj$/r   c                    | t         j                  k(  rt        ||      S | t         j                  k(  rt	        ||      S | t         j
                  k(  rt        |      S | t         j                  k(  rt        ||      S t        d      )NzUnknown appender type)
r   r   rk   r   r   r   r   r   r   
ValueErrorr   s      r   rc   rc   W  sx    ,,,ud++	,++	+E4((	,--	-e$$	,00	0 --011r   ))ru   r   r   r   	threadingr   azurelinuxagent.common.futurer   	EVERY_DAYEVERY_HALF_DAYEVERY_SIX_HOURS
EVERY_HOUREVERY_HALF_HOUREVERY_FIFTEEN_MINUTESEVERY_MINUTEobjectr   rx   rk   r   r   r   r   r>   r   rC   r   ro   rq   r   r"   r1   r5   r;   r8   r4   r/   r7   r:   r=   rc   rv   r   r   <module>r      s.  "  ( # .1	$!$Q
B'!"- #SpV Splv h 8 	X 	
 
 
v 
6  .6]] <3,$&;><;.++,0 2:T 
2r   