
    kc3                     t   d 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dlm
Z
  G d d      Z G d	 d
      Zd Z e       Zd Z G d d      Z G d de      Z G d d      Z G d de      Z G d de      Z G d d      Z G d d      Z G d de      Zd#dZdZefdZd  Zd! Zd$d"Zy)%z
Logger implementation loosely modeled on PEP 282.  We don't use the
PEP 282 logger implementation in the stdlib ('logging') because it's
idiosyncratic and a bit slow for our purposes (we don't use threads).
    Nsyslog)long)is_text_stream)	as_stringc                   (    e Zd ZdZdZdZdZdZdZdZ	y)	LevelsByName2   (         
         N)
__name__
__module____qualname__CRITERROWARNINFODEBGTRACBLAT     4/usr/lib/python3/dist-packages/supervisor/loggers.pyr	   r	      s%    DDDDDDDr   r	   c                       e Zd Zej                  Zej                  Zej                  Z	ej                  Zej                  Zej                  Zej                   Zy)LevelsByDescriptionN)r   r   r   r	   r   criticalr   errorr   warnr   infor   debugr   tracer   blatherr   r   r   r   r      sO      HEDDEEGr   r   c                      i } t         j                  j                         D ]  \  }}|j                  d      r|| |<    | S )N_)r	   __dict__items
startswith)bynumbernamenumbers      r   _levelNumbersr/   '   sF    H$--335 $fs##HV$ Or   c                 (    t        t        | d       }|S N)getattrr   )descriptionnums     r   getLevelNumByDescriptionr5   0   s    
%{D
9CJr   c                   T    e Zd ZdZej
                  Zd
dZd Zd Z	d Z
d Zd Zd	 Zy)Handler%(message)sNc                      || _         d| _        y NF)streamclosed)selfr;   s     r   __init__zHandler.__init__8   s    r   c                     || _         y r1   )fmt)r=   r@   s     r   	setFormatzHandler.setFormat<   	    r   c                     || _         y r1   level)r=   rE   s     r   setLevelzHandler.setLevel?   s	    
r   c                     	 | j                   j                          y # t        $ r+}|j                  d   t        j
                  k7  r Y d }~y d }~ww xY wNr   )r;   flushIOErrorargserrnoEPIPEr=   whys     r   rI   zHandler.flushB   sC    	KK 	xx{ekk) *	s    	A!AAc                     | j                   sYt        | j                  d      r!	 | j                  j                         }|dk  ry | j                  j                          d| _         y y # t        $ r Y .w xY w)Nfilenor   T)r<   hasattrr;   rQ   rJ   close)r=   fds     r   rS   zHandler.closeJ   sl    {{t{{H-++-B AvKKDK    s   A' '	A32A3c                 $   	 | j                   dk(  xr< t        |j                  t              xr  |j                   xs |j                  dd ik(  }t        | j                         }|r|j                  }n0| j                   |j                         z  }|r|j                  d      }	 | j                  j                  |       | j                          y # t        $ r | j                  j                  |       Y 7w xY w#  | j                          Y y xY w)Nr8   exc_infozutf-8)r@   
isinstancemsgbyteskwr   r;   asdictencodewriteUnicodeErrorrI   handleError)r=   recordbinarybinary_streamrX   s        r   emitzHandler.emitY   s    	hh-/ I U3I!99}G		j$5G(G  !/t{{ ;;Mjjhh0 **W-C'!!#& JJL   '
 !!#&'	s0   B"C; %C  C; $C85C; 7C88C; ;Dc                     t        j                         }t        j                  |d   |d   |d   d t         j                         ~y )Nr         )sysrV   	tracebackprint_exceptionstderr)r=   eis     r   r_   zHandler.handleErrorq   s6    \\^!!"Q%A1tSZZHr   r1   )r   r   r   r@   r	   r   rE   r>   rA   rF   rI   rS   rc   r_   r   r   r   r7   r7   4   s5    
CE0r   r7   c                        e Zd ZddZd Zd Zy)StreamHandlerNc                 0    t         j                  | |       y r1   )r7   r>   )r=   strms     r   r>   zStreamHandler.__init__w   s    t$r   c                 f    t        | j                  d      r| j                  j                          y y )Nclear)rR   r;   rq   r=   s    r   removezStreamHandler.removez   s%    4;;(KK )r   c                      y r1   r   rr   s    r   reopenzStreamHandler.reopen~       r   r1   )r   r   r   r>   rs   ru   r   r   r   rm   rm   v   s    % r   rm   c                   2    e Zd ZddZd Zd Zd Zd Zd Zy)	BoundIOc                      || _         || _        y r1   )maxbytesbuf)r=   rz   r{   s      r   r>   zBoundIO.__init__   s     r   c                      y r1   r   rr   s    r   rI   zBoundIO.flush   rv   r   c                 $    | j                          y r1   )rq   rr   s    r   rS   zBoundIO.close   s    

r   c                     t        |      }t        | j                        |z   | j                  kD  r| j                  |d  | _        | xj                  |z  c_        y r1   )lenr{   rz   )r=   bblens      r   r]   zBoundIO.write   sB    1vtxx=4$--/xxDHAr   c                     | j                   S r1   r{   rr   s    r   getvaluezBoundIO.getvalue   s    xxr   c                     d| _         y )Nr   r   rr   s    r   rq   zBoundIO.clear   rB   r   N)r   )	r   r   r   r>   rI   rS   r]   r   rq   r   r   r   rx   rx      s     r   rx   c                   $    e Zd ZdZddZd Zd Zy)FileHandlerz3File handler which supports reopening of logs.
    c                    t         j                  |        	 t        ||      | _        || _        || _        y # t        $ rA}|dk(  r1|j
                  t
        j                  k(  rd}t        ||      | _        n Y d }~Td }~ww xY w)Nabwb)	r7   r>   openr;   OSErrorrL   ESPIPEbaseFilenamemode)r=   filenamer   es       r   r>   zFileHandler.__init__   sy    	x.DK %	  		t|5<< 7
 "8T2 		s   7 	B 7A<<Bc                 |    | j                          t        | j                  | j                        | _        d| _        y r:   )rS   r   r   r   r;   r<   rr   s    r   ru   zFileHandler.reopen   s*    

4,,dii8r   c                     | j                          	 t        j                  | j                         y # t        $ r+}|j
                  d   t        j                  k7  r Y d }~y d }~ww xY wrH   )rS   osrs   r   r   rK   rL   ENOENTrN   s     r   rs   zFileHandler.remove   sN    

	IId''( 	xx{ell* +	s   2 	A&!A!!A&N)r   )r   r   r   __doc__r>   ru   rs   r   r   r   r   r      s    &
r   r   c                   <    e Zd Z	 	 d	dZd Zd Zd Zd Zd Zd Z	y)
RotatingFileHandlerc                 x    |dkD  rd}t         j                  | ||       || _        || _        d| _        d| _        y)a  
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        r   r   r   N)r   r>   maxBytesbackupCountcounterevery)r=   r   r   r   r   s        r   r>   zRotatingFileHandler.__init__   s?    , a<DT8T2 &
r   c                 P    t         j                  | |       | j                          y)z
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        N)r   rc   
doRollover)r=   r`   s     r   rc   zRotatingFileHandler.emit   s     	v&r   c                 ,    t        j                  |      S r1   )r   rs   r=   fns     r   _removezRotatingFileHandler._remove   s    yy}r   c                 .    t        j                  ||      S r1   )r   rename)r=   srctgts      r   _renamezRotatingFileHandler._rename   s    yyc""r   c                 @    t         j                  j                  |      S r1   )r   pathexistsr   s     r   _existszRotatingFileHandler._exists   s    ww~~b!!r   c                 L   | j                  |      r	 | j                  |       	 | j                  ||       y # t        $ r+}|j                  d   t        j
                  k7  r Y d }~Cd }~ww xY w# t        $ r+}|j                  d   t        j
                  k7  r Y d }~y d }~ww xY wrH   )r   r   r   rK   rL   r   r   )r=   sfndfnrO   s       r   removeAndRenamez#RotatingFileHandler.removeAndRename   s    <<S!
	LLc"  88A;%,,. /  	 xx{ell* +	s,   8 A/ 	A,!A''A,/	B#8!BB#c                 >   | j                   dk  ry| j                  j                         | j                   k\  sy| j                  j                          | j                  dkD  rt        | j                  dz
  dd      D ]Y  }d| j                  |fz  }d| j                  |dz   fz  }t        j                  j                  |      sH| j                  ||       [ | j                  dz   }| j                  | j                  |       t        | j                  d      | _        y)z<
        Do a rollover, as described in __init__().
        r   Nre   z%s.%dz.1r   )r   r;   tellrS   r   ranger   r   r   r   r   r   )r=   ir   r   s       r   r   zRotatingFileHandler.doRollover  s     ==A  "dmm3a4++a/B7 3!2!2A 66!2!2AE ::77>>#&((c2	3
 ##d*C  !2!2C84,,d3r   N)r   i    r   )
r   r   r   r>   rc   r   r   r   r   r   r   r   r   r   r      s+    5B<#" 4r   r   c                       e Zd Zd Zd Zy)	LogRecordc                 <    || _         || _        || _        d | _        y r1   )rE   rX   rZ   dictrepr)r=   rE   rX   rZ   s       r   r>   zLogRecord.__init__  s    
r   c                 x   | j                   t        j                         }|t        |      z
  dz  }t        j                  dt        j                  |            }d||fz  }t
        | j                     }t        | j                        }| j                  r|| j                  z  }|||d| _         | j                   S )Ni  z%Y-%m-%d %H:%M:%Sz%s,%03d)message	levelnameasctime)
r   timer   strftime	localtimeLOG_LEVELS_BY_NUMrE   r   rX   rZ   )r=   nowmsecspart1r   r   rX   s          r   r[   zLogRecord.asdict  s    == ))+C49_,EMM"5t~~c7JKE5%.0G)$**5IDHH%CwwDGGm'*	'.0DM}}r   N)r   r   r   r>   r[   r   r   r   r   r     s    r   r   c                   V    e 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y)LoggerNc                 L    |t         j                  }|| _        |g }|| _        y r1   )r	   r   rE   handlers)r=   rE   r   s      r   r>   zLogger.__init__,  s+    = %%E
H r   c                 F    | j                   D ]  }|j                           y r1   )r   rS   )r=   handlers     r   rS   zLogger.close5  s    }} 	GMMO	r   c                     t         j                  | j                  k\  r# | j                  t         j                  |fi | y y r1   )r	   r   rE   logr=   rX   rZ   s      r   r&   zLogger.blather9  4    

*DHH\&&2r2 +r   c                     t         j                  | j                  k\  r# | j                  t         j                  |fi | y y r1   )r	   r   rE   r   r   s      r   r%   zLogger.trace=  r   r   c                     t         j                  | j                  k\  r# | j                  t         j                  |fi | y y r1   )r	   r   rE   r   r   s      r   r$   zLogger.debugA  r   r   c                     t         j                  | j                  k\  r# | j                  t         j                  |fi | y y r1   )r	   r   rE   r   r   s      r   r#   zLogger.infoE  r   r   c                     t         j                  | j                  k\  r# | j                  t         j                  |fi | y y r1   )r	   r   rE   r   r   s      r   r"   zLogger.warnI  r   r   c                     t         j                  | j                  k\  r# | j                  t         j                  |fi | y y r1   )r	   r   rE   r   r   s      r   r!   zLogger.errorM  r   r   c                     t         j                  | j                  k\  r# | j                  t         j                  |fi | y y r1   )r	   r   rE   r   r   s      r   r    zLogger.criticalQ  r   r   c                     t        ||fi |}| j                  D ]#  }||j                  k\  s|j                  |       % y r1   )r   r   rE   rc   )r=   rE   rX   rZ   r`   r   s         r   r   z
Logger.logU  s>    5#,,}} 	%G%V$	%r   c                 :    | j                   j                  |       y r1   )r   append)r=   hdlrs     r   
addHandlerzLogger.addHandler[  s    T"r   c                     t         r1   )NotImplementedErrorrr   s    r   r   zLogger.getvalue^  s    !!r   )NN)r   r   r   r>   rS   r&   r%   r$   r#   r"   r!   r    r   r   r   r   r   r   r   r   +  s>    !3333333%#"r   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)SyslogHandlerc                 H    t         j                  |        t        J d       y )NzSyslog module not present)r7   r>   r   rr   s    r   r>   zSyslogHandler.__init__b  s"    !>#>>!r   c                      y r1   r   rr   s    r   rS   zSyslogHandler.closef  rv   r   c                      y r1   r   rr   s    r   ru   zSyslogHandler.reopeni  rv   r   c                 .    t        j                   |       y r1   r   )r=   rX   s     r   _syslogzSyslogHandler._syslogl  s    cr   c                 R   	 |j                         }|d   }|j                  d      j                  d      D ](  }||d<   | j                  |z  }	 | j	                  |       * y # t
        $ r# | j	                  |j                  d             Y Ww xY w#  | j                          Y y xY w)Nr   
zUTF-8)r[   rstripsplitr@   r   r^   r\   r_   )r=   r`   paramsr   linerX   s         r   rc   zSyslogHandler.emitp  s    	]]_FY'Gt,2248 6$(y!hh'6LL%	6
 $ 6LLG!456	s0   AB A# B #)BB BB B&N)r   r   r   r>   rS   ru   r   rc   r   r   r   r   r   a  s    ?r   r   c                     t        |       S r1   )r   rD   s    r   	getLoggerr   ~  s    %=r   i    c                     t        |      }t        |      }|j                  | j                         |j	                  |       | j                  |       |j                  | _        y)z2Attach a new BoundIO handler to an existing LoggerN)rx   rm   rF   rE   rA   r   r   )loggerr@   rz   ior   s        r   handle_boundIOr     sO    		BBGV\\"c
gkkFOr   c                     t        t        j                        }|j                  |       |j	                  | j
                         | j                  |       y)zDAttach a new StreamHandler with stdout handler to an existing LoggerN)rm   rg   stdoutrA   rF   rE   r   r   r@   r   s      r   handle_stdoutr     s>    CJJ'GcV\\"
gr   c                     t               }|j                  |       |j                  | j                         | j	                  |       y)z1Attach a new Syslog handler to an existing LoggerN)r   rA   rF   rE   r   r   s      r   handle_syslogr     s7    oGcV\\"
gr   c                     |dk(  rt               }n|du rt        |      }nt        |d||      }|j                  |       |j	                  | j
                         | j                  |       y)zAttach a new file handler to an existing Logger. If the filename
    is the magic name of 'syslog' then make it a syslog handler instead.r   FaN)r   r   r   rA   rF   rE   r   )r   r   r@   rotatingrz   backupsr   s          r   handle_filer     sc     8/u!(+G)(C7KGcV\\"
gr   r1   )Fr   r   )r   r   rL   rg   r   rh   supervisor.compatr   r   r   r   r	   r   r/   r   r5   r7   rm   rx   r   r   r   r   r   r   _2MBr   r   r   r   r   r   r   <module>r      s    
  
   $ " , '     "O @ @D	G 	 ."' "HX4+ X4t *4" 4"lG : )- "r   