Nf܎dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z dZ ej ZdaddZdZdZd Zd Zd Zd Zd ZejdejZdZGddeZGddeeZGdde eZ!Gdde"eZ#GddeZ$Gdde$Z%e%Z&dZ'e dfdZ(dZ)dS) a Configuration functions for the logging package for Python. The core package is based on PEP 282 and comments thereto in comp.lang.python, and influenced by Apache's log4j system. Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! N)ThreadingTCPServerStreamRequestHandleriF#Tcddl}t||jr|}nf||}t |dr||n+t j|}|||t|}tj  tt||}t|||tjdS#tjwxYw)aD Read the logging configuration from a ConfigParser-format file. This can be called several times from an application, allowing an end user the ability to select from various pre-canned configurations (if the developer provides a mechanism to present the choices and load the chosen configuration). rNreadline)encoding) configparser isinstanceRawConfigParser ConfigParserhasattr read_fileio text_encodingread_create_formatterslogging _acquireLock_clearExistingHandlers_install_handlers_install_loggers _releaseLock)fnamedefaultsdisable_existing_loggersrrcp formattershandlerss %/usr/lib/python3.11/logging/config.py fileConfigr2s %566.   & &x 0 0 5* % % . LL    '11H GGEHG - - -#B''J    %R44X'?@@@s &/C**C?c|d}|d}t|}|D]J}|dz|z} t||}#t$r"t|t||}YGwxYw|S)z)Resolve a dotted name to a global object..r)splitpop __import__getattrAttributeError)nameusedfoundns r_resolver+Us ::c??D 88A;;D t  E &&czA~ &E1%%EE & & & t   E1%%EEE & LsA)BBc6ttj|SN)mapstrstrip)alists r _strip_spacesr2cs sy%  c|dd}t|siS|d}t|}i}|D]}d|z}||ddd}||d dd}||d dd }tj}||d } | rt | }||||} | ||<|S) zCreate and return formattersrkeys,z formatter_%sformatTN)rawfallbackdatefmtstyle%class)lenr"r2getr Formatterr+) rflistrformsectnamefsdfsstlc class_namefs rrrfs | V $E u:: KK  E % EJ  !D( VVHhD4V @ @ffXydTfBBffXwD3f??  \%%g..  %$$A Ab#sOO 4 r3c"|dd}t|siS|d}t|}i}g}|D]}|d|z}|d}|dd} t |t t }n&#ttf$rt|}YnwxYw|dd } t | t t } |d d } t | t t } || i| } || _ d |vr|d } | | t|r| ||t|t jjr<|d d} t| r|| | f| ||<|D] \} }| ||!|S)zInstall and return handlersrr5r6z handler_%sr= formatterargs()kwargsz{}leveltarget)r>r"r2r?evalvarsrr& NameErrorr+r'setLevel setFormatter issubclassr MemoryHandlerappend setTarget)rrhlistrfixupshandsectionklassfmtrMrOhrPrQts rrr|s zN6 "E u:: KK  E % EH F\D() kk+r** $W ..EE * $ $ $UOOEEE ${{64((D$w--((Xt,,fd7mm,, E4 "6 " " g  G$E JJu    s88 , NN:c? + + + eW-; < < +[[2..F6{{ + q&k***!!1 HQK    Os7"B B=<B=ctj}|D]g}|jj|}||vrHt |tjs-|tjg|_d|_ `||_ hdS)a When (re)configuring logging, handle loggers which were in the previous configuration but are not in the new configuration. There's no point deleting them as other threads may continue to hold references to them; and by disabling them, you stop them doing any logging. However, don't disable children of named loggers, as that's probably not what was intended by the user. Also, allow existing loggers to NOT be disabled if disable_existing is false. TN) rrootmanager loggerDictr PlaceHolderrUNOTSETr propagatedisabled)existing child_loggersdisable_existingrdlogloggers r_handle_existing_loggersrps  addHandlerrerfr5sortgetint getLoggerindexrYrirjrp)rrrmllistr^rdrnrPrar[r]rkrlqnriroiprefixedpflen num_existings rrrs yM& !E KK  E u%% & &E LLG  * * * *DL+002233H  MMOOOM22[3&' Z NN;N;; "2&& >>r""Q&ACxHMMEx==Ll""A;vv&(22!((!555Ql"" OOB    g  G$E OOE " " "# $ $A   # # # #$ # u:: 2KK$$E!%((E 2 2!!(4.1111X}6FGGGGGr3ctjtjtjddtjdd=dS)z!Clear and close existing handlersN)r _handlersclearshutdown _handlerListr3rrrsI  W)!!!,---QQQr3z^[a-z_][a-z0-9_]*$cbt|}|std|zdS)Nz!Not a valid Python identifier: %rT) IDENTIFIERmatch ValueError)sms r valid_identrs7A B[a-z]+)://(?P.*)$z ^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$ ext_convert cfg_convert)extcfgcFt||_||j_dSr-)rconfigr)rrs r__init__zBaseConfigurator.__init__us!$V,, #'    r3c|d}|d} ||}|D]P}|d|zz } t||}#t$r(||t||}YMwxYw|S#t $r}t d|d|}||d}~wwxYw)z` Resolve strings to objects using standard import and attribute syntax. r!rzCannot resolve z: N)r"r#importerr%r& ImportErrorr)rrr'r(r)fragevs rresolvezBaseConfigurator.resolveys wws||xx{{ MM$''E 1 1d "1#E400EE%111MM$'''#E400EEE1L    aaa;<D AHHJJqM*A A$**400 +!((**Q-(AA*0066A +hhjjm#177<<+ !#AA+$'HH$%aD#,+++$%cF+A>DD$*3855$$&@AAA' A,s D##D87D8ct|ts-t|trt|}||_nt|ts,t|t rt |}||_nt|t s22 .z%7N7N ."5))E!%E  E?33 .E5)) .29%2K2K .#E**E!%E   s # # .$**511A .KKMM8 155fdCC .x[F 'i 8 8I%If--E r3c,d}t|s||}dd}fdD}|di|}|r+|D]\}}t ||||S)z1Configure an object with a user-supplied factory.rNr!Nc@i|]}t|||Srr.0krs r z5BaseConfigurator.configure_custom..*AAA1+a..A!VAYAAAr3r)r#callableritemssetattr)rrrGpropsrOrr'rs ` rconfigure_customz!BaseConfigurator.configure_customs JJt  {{  QA 3%%AAAAAAAV  -${{}} - - ee,,,, r3cNt|trt|}|S)z0Utility function which converts lists to tuples.)r rvrrs ras_tuplezBaseConfigurator.as_tuples$ eT " " !%LLE r3N)rrrrrecompilerrrrrr staticmethodr$rrrrrrrrrr3rrras!bj!IJJO2:o..L"*.//KBJ566MBJx((M |J''H(((*###   D8   r3rcNeZdZdZdZdZdZdZdZdZ d d Z d d Z d d Z d S)DictConfiguratorz] Configure logging using a dictionary-like object to describe the configuration. c |j}d|vrtd|ddkrtd|dz|dd}i}tj |rm|d|}|D]}|tjvrtd|z tj|}||}|d d }|r'|tj|}#t$r} td |z| d } ~ wwxYw|d |} | D]E} | || |d !#t$r} td|z| d } ~ wwxYw|dd } | r; | | d n#t$r} td| d } ~ wwxYwn||dd } t|d|} | D]F} | | || |<"#t$r} td|z| d } ~ wwxYw|d|}|D]F} |||||<"#t$r} td|z| d } ~ wwxYw|d|}g}t|D]} |||}||_|||<+#t$rI} dt%| jvr||ntd |z| Yd } ~ yd } ~ wwxYw|D]O} |||}||_|||<+#t$r} td |z| d } ~ wwxYwtj} t-| jj}|g}|d |} | D]}||vr||dz}|dz}t9|}t9|}||kr:||d ||kr||||dz }||k:|| | || |#t$r} td|z| d } ~ wwxYwt=||| |dd } | r9 | | n"#t$r} td| d } ~ wwxYwtjd S#tjwxYw)zDo the configuration.versionz$dictionary doesn't specify a versionruzUnsupported version: %s incrementalFrzNo handler found with name %rrPNzUnable to configure handler %rrrTzUnable to configure logger %rrdzUnable to configure root loggerrrz Unable to configure formatter %rfilterszUnable to configure filter %rtarget not configured yetr!) rrr#rrr?rrU _checkLevel Exceptionconfigure_loggerconfigure_rootrconfigure_formatterconfigure_filtersortedconfigure_handlerr'r/ __cause__rYrdrvrerfr5rzr}r>rwrpr)rrr EMPTY_DICTrr'handlerhandler_configrPrrrrdrmrrdeferredrkrlrrrrs r configurezDictConfigurator.configuresG F " "CDD D )  ! !6 9JJKK Kjj66  Q #N :!::j*==$ A AD7#444(*36:*;<<<A&-&7&=G-5d^N$2$6$6w$E$EE$M ' 0 01DU1K1K L L L(AAA",.248.9#:#:?@AA!**Y ;;#==D=--dGDM4HHHH$===(*.04*566;<==zz&$//::++D$7777$:::(*23389:::$*::.H$#O#O &((($ZZ jAA &GGDG+/+C+C*?@@EFGG!**Y ;;#DDDD(,(=(=gdm(L(L $DDD(*57;*<==BCDD"::j*=="8,, A AD A"&"8"8$"H"H'+ )0$AAA6#ak:J:JJJ$OOD1111",.248.9#:#:?@A21111A%==D="&"8"8$"H"H'+ )0$===(*.04*566;<==| 7 < < > >??  !#  **Y ;;#==Dx''$NN40014#'#: #H '*8}} ,..'{6E62h>> - 4 4Xa[ A A AFA ,..!---=--dGDMBBBB$===(*.04*566;<==")=)9;;;zz&$//::++D1111$:::(*23389::  " " " " "G " " " "sY+=U,)ADU, D% D  D%%U,E! U,! F+E>>FU,F75U,7 GGGAU,H98U,9 IIIU,9JU, J:"J55J::,U,''LU, M"?MU,M""U,*'NU, N4N//N44C>U,3SU, S2S--S22,U,T54U,5 U?UUU,,Vc:d|vrz|d} ||}n#t$rN}dt|vr|d|d<||d<||}Yd}~nd}~wwxYw|dd}|dd}|dd}|d d}|s t j} nt|} d |vr| ||||d }n | |||}|S) z(Configure a formatter from a dictionary.rNz'format'r7r`Nr:r;r<r=validate)rrr/r#r?rr@r+) rrfactoryrter`dfmtr;cnamerGs rrz$DictConfigurator.configure_formattersJ 6>>TlG 7..v66 7 7 7SWW,, !' 8 4 4u &t ..v66 7**Xt,,C::i..DJJw,,EJJw--E $%UOOV##3eVJ-?@@3e,, s$ A<AA77A<cd|vr||}n*|dd}tj|}|S)z%Configure a filter from a dictionary.rNr'rL)rr?rFilter)rrrr's rrz!DictConfigurator.configure_filtersG 6>>**622FF::fb))D^D))F r3c |D]} t|stt|ddr|}n|jd|}||\#t$r}t d|z|d}~wwxYwdS)z/Add filters to a filterer from a list of names.filterNrzUnable to add filter %r)rr%r addFilterrr)rfiltererrrIfilter_rs r add_filterszDictConfigurator.add_filterss G GA GA;;8(71h+E+E"F"F8GG"k)4Q7G""7++++ G G G !:Q!>??QF G G GsAA B)A<<BcRt}dd}|r: |jd|}n%#t$r}t d|z|d}~wwxYwdd}dd}dvr=d}t |s||}|}n[d} || } t| tj j rd vr |jd d } t| tj s$ |td | d <n#t$r}t d d z|d}~wwxYwt| tj jr#d vr|d d <nAt| tj jr"dvr|dd<| }dd} fdD} |di| }nI#t$r<}dt%|vr| d| d<|di| }Yd}~nd}~wwxYw|r|||'|tj||r|||| r+| D]\}}t1||||S)z&Configure a handler from a dictionary.rKNrzUnable to set formatter %rrPrrNr=rQrrzUnable to set target handler %rmailhostaddressr!c@i|]}t|||Srrrs rrz6DictConfigurator.configure_handler..rr3z'stream'streamstrmr)rr#rrrrrrWrrrXr Handlerupdater SMTPHandlerr SysLogHandlerr/rVrUrrrr)rr config_copyrKrrPrrGrr r_thrrOrrr'rs ` rrz"DictConfigurator.configure_handlers6ll JJ{D11  : : K 5i@  : : : "&(1"23389: : 7D))**Y-- 6>> 4  AA;; $LLOOGGJJw''ELL''E%!1!?@@ EF""EZ01ABB%b'/::E k222'(CDDD')F8$$ EEE$&*,28,<&=>>CDEEE7#3#?@@ Ef$$%)]]6*3E%F%Fz""E7#3#ABB EV##$(MM&2C$D$Dy!G 3%%AAAAAAA 'W&&v&&FF ' ' 'R(( $ZZ11F6NW&&v&&FFFFFF '  +    * * *   OOG/66 7 7 7  .   VW - - -  -${{}} - - ee,,,, sF> A AA AE;; F#FF#I J#2JJc|D]N} ||jd|*#t$r}td|z|d}~wwxYwdS)z.Add handlers to a logger from a list of names.rzUnable to add handler %rN)ryrrr)rrorrars r add_handlerszDictConfigurator.add_handlerss H HA H!!$+j"9!"<==== H H H !;a!?@@aG H H Hs&- AA  AFc|dd}|'|tj||s|jddD]}|||dd}|r||||dd}|r|||dSdSdS)zU Perform configuration which is common to root and non-root loggers. rPNrr)r?rUrrrrxr r)rrorrrPrarrs rcommon_logger_configz%DictConfigurator.common_logger_configs 7D))   OOG/66 7 7 7 2_QQQ' ( ($$Q''''zz*d33H 4!!&(333jjD11G 2  11111 2 2 2 2r3ctj|}||||d|_|dd}| ||_dSdS)z.Configure a non-root logger from a dictionary.FriN)rr|r"rjr?ri)rr'rrroris rrz!DictConfigurator.configure_loggers`"4(( !!&&+>>>JJ{D11  (F    ! r3cZtj}||||dS)z*Configure a root logger from a dictionary.N)rr|r")rrrrds rrzDictConfigurator.configure_root#s. "" !!$ <<<<.ConfigStreamHandlerz Handler for a logging configuration request. It expects a completely new logging configuration and uses fileConfig to install it. c |j}|d}t|dkrtjd|d}|j|}t||kr;|||t|z z}t||k;|jj|j|}||d} ddl}| |}t|tsJt|nX#t$rKtj|} t!|n##t$rt#jYnwxYwYnwxYw|jjr"|jjdSdSdS#t*$r}|jt.krYd}~dSd}~wwxYw)z Handle a request. Each request is expected to be a 4-byte length, packed using struct.pack(">L", n), followed by the config file. Uses fileConfig() to do the grunt work. z>LrNzutf-8) connectionrecvr>structunpackserververifydecodejsonloadsr rr'rrStringIOr traceback print_excreadysetOSErrorerrno RESET_ERROR)rconnchunkslenr4rfilers rhandlez*listen..ConfigStreamHandler.handleJs   ! u::??!=u55a8D O0066Ee**t++ % $U2C(D(D De**t++{)5 $ 2 25 9 9( % W 5 5 6'KKK#zz%00A#-a#6#6666&qMMMM(666$&;u#5#5D6 *4 0 0 0 0#,666 ) 3 5 5 5 5 56 6{(0 )--//////#?,00   7k))*))))) s`C0F;3?D32F;3FE"!F"F?FFFF;F-F;; G!GG!N)rrrrrBrr3rConfigStreamHandlerr*Cs-  % % % % % r3rCc.eZdZdZdZdedddfdZdZdS)$listen..ConfigSocketReceiverzD A simple TCP socket-based logging config receiver. ru localhostNctj|||f|tjd|_tjd|_||_||_dS)Nrru) rrrrabortrtimeoutr9r2)rhostportrr9r2s rrz-listen..ConfigSocketReceiver.__init__xsY  'tTlG D D D  " " "DJ  " " "DLDJ DKKKr3c:ddl}d}|s~||jggg|j\}}}|r|t j|j}t j|~| dS)Nr) selectsocketfilenorIhandle_requestrrrHr server_close)rrMrHrdwrexs rserve_until_stoppedz8listen..ConfigSocketReceiver.serve_until_stoppeds MMME '#]]DK,>,>,@,@+A+-r+/<99 B*'')))$&&& $&&& '        r3)rrrrallow_reuse_addressDEFAULT_LOGGING_CONFIG_PORTrrUrr3rConfigSocketReceiverrEqsV    +2M!d ! ! ! ! r3rXc(eZdZfdZdZxZS)listen..Serverct|||_||_||_||_t j|_dSr-) superrrcvrhdlrrKr2 threadingEventr9)rr]r^rKr2Server __class__s rrzlisten..Server.__init__sN &$   ( ( * * *DIDIDI DK"**DJJJr3cD||j|j|j|j}|jdkr|jd|_|jtj|a tj | dS)N)rKrr9r2rru) r]rKr^r9r2server_addressr:rr _listenerrrU)rr1s rrunzlisten..Server.runsYYDIty%)Z&*k33FyA~~"1!4 JNN     " " "I  " " "  & & ( ( ( ( (r3)rrrrrf __classcell__)rbras@rrarZsM + + + + + + ) ) ) ) ) ) )r3ra)rrr_Thread)rKr2rCrXras @rlistenri/s(,,,,,2,,,\     1   >)))))))!))). 6&(;T6 J JJr3ctj trdt_datjdS#tjwxYw)zN Stop the listening server which was created with a call to listen(). ruN)rrrerHrrr3r stopListeningrksV    IOIs ?A)NTN)*rr<rrlogging.handlersrr/r_r7 socketserverrrrW ECONNRESETr=rerr+r2rrrprrrIrrobjectrrrrvrrrrrr&r'rirkrr3rrqs"  AAAAAAAA#       F   !!!,$$$L///,THTHTHn   RZ,bd 3 3 fB @ @ @ @ @T? @ @ @#####T?###@@@@@e_@@@AAAAAvAAAFB=B=B=B=B='B=B=B=H #((( ,DxKxKxKxKt     r3