package Ġcom . f int ek . utils _ android x . log Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ import Ġandroidx . collection . Simple Array Map Ċ import Ġcom . f int ek . utils _ android x . Utils Bridge Ċ import Ġcom . f int ek . utils _ android x . model . Tag Head Ċ import Ġcom . f int ek . utils _ android x . throwable . catch Or Boolean Ċ import Ġcom . f int ek . utils _ android x . throwable . saf ely Void Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġjava . text . ParseException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . regex . Pattern Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠCh ao Sh en Ġon Ġ 2 0 2 0 / 1 1 / 4 Ċ Ġ*/ Ċ object ĠTim ber Util Ġ{ ĊĠĠĠĠĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠgetConfig () Ġ= ĠCONFIG ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġv ( var arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . V , ĠCONFIG . getGlobal Tag (), Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġv Tag ( tag : ĠString , Ġvar arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . V , Ġtag , Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġd ( var arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . D , ĠCONFIG . getGlobal Tag (), Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġd Tag ( tag : ĠString , Ġvar arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . D , Ġtag , Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġi ( var arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . I , ĠCONFIG . getGlobal Tag (), Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġi Tag ( tag : ĠString , Ġvar arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . I , Ġtag , Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġw ( var arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . W , ĠCONFIG . getGlobal Tag (), Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġw Tag ( tag : ĠString , Ġvar arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . W , Ġtag , Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġe ( var arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . E , ĠCONFIG . getGlobal Tag (), Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġe Tag ( tag : ĠString , Ġvar arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . E , Ġtag , Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġa ( var arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . A , ĠCONFIG . getGlobal Tag (), Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġa Tag ( tag : ĠString , Ġvar arg Ġcontents : ĠAny ?) Ġ= Ġlog ( Tim ber . A , Ġtag , Ġcontents Ġ= Ġcontents ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġfile ( ĊĠĠĠĠĠĠĠ Ġtype : ĠTim ber Ġ= ĠTim ber . D , ĊĠĠĠĠĠĠĠ Ġtag : ĠString Ġ= ĠCONFIG . getGlobal Tag (), ĊĠĠĠĠĠĠĠ Ġcontent : ĠAny ? ĊĠĠĠ Ġ) Ġ= Ġlog ( type Ġand ĠFILE , Ġtag , Ġcontent ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġjson ( ĊĠĠĠĠĠĠĠ Ġtype : ĠTim ber Ġ= ĠTim ber . D , ĊĠĠĠĠĠĠĠ Ġtag : ĠString Ġ= ĠCONFIG . getGlobal Tag (), ĊĠĠĠĠĠĠĠ Ġcontent : ĠAny ? ĊĠĠĠ Ġ) Ġ= Ġlog ( type Ġand ĠJSON , Ġtag , Ġcontent ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġxml ( ĊĠĠĠĠĠĠĠ Ġtype : ĠTim ber Ġ= ĠTim ber . D , ĊĠĠĠĠĠĠĠ Ġtag : ĠString Ġ= ĠCONFIG . getGlobal Tag (), ĊĠĠĠĠĠĠĠ Ġcontent : ĠAny ? ĊĠĠĠ Ġ) Ġ= Ġlog ( type Ġand ĠXML , Ġtag , Ġcontent ) ĊĊĠĠĠ Ġfun Ġlog ( type : ĠTim ber , Ġtag : ĠString , Ġvar arg Ġcontents : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! CONFIG . is Log Switch ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġtype Low Ġ= Ġtype . logLevel Ġand Ġ 0 x 0 f ĊĠĠĠĠĠĠĠ Ġval Ġtype High Ġ= Ġtype . logLevel Ġand Ġ 0 xf 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . is Log 2 Console Switch () Ġ|| ĠCONFIG . is Log 2 File Switch () Ġ|| Ġtype High Ġ== ĠFILE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Low Ġ< ĠCONFIG . console Filter . logLevel Ġ&& Ġtype Low Ġ< ĠCONFIG . file Filter . logLevel ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtag Head Ġ= Ġtag . process Tag And Head () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġprocess Body ( type High , Ġcontents Ġ= Ġcontents ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . is Log 2 Console Switch () Ġ&& Ġtype High Ġ!= ĠFILE Ġ&& Ġtype Low Ġ>= ĠCONFIG . console Filter . logLevel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint 2 Console ( type Low , Ġtag Head . tag , Ġtag Head . console Head ?. to Typed Array (), Ġbody Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( CONFIG . is Log 2 File Switch () Ġ|| Ġtype High Ġ== ĠFILE ) Ġ&& Ġtype Low Ġ>= ĠCONFIG . file Filter . logLevel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEXEC UT OR . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint 2 File ( type Low , Ġtag Head . tag , Ġtag Head . file Head Ġ+ Ġbody ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . process Tag And Head (): ĠTag Head Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshadow Tag Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġif Ġ(! CONFIG . tag Is Space Ġ&& Ġ! CONFIG . is Log Head Switch ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Tag Ġ= ĠCONFIG . getGlobal Tag () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Trace Ġ= ĠThrowable (). stack Trace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Index Ġ= Ġ 3 Ġ+ ĠCONFIG . get Stack Offset () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack Index Ġ>= Ġstack Trace . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Element Ġ= Ġstack Trace [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġtarget Element . get Internal FileName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . tag Is Space Ġ&& Ġshadow Tag . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠfileName . indexOf ('.') Ġ// ĠUse Ġpro guard Ġmay Ġnot Ġfind Ġ'. '. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Tag Ġ= Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 Ġ-> ĠfileName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠfileName . substring ( 0 , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTag Head ( shadow Tag , Ġnull , Ġ": Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtarget Element Ġ= Ġstack Trace [ stack Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġtarget Element . get Internal FileName () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . tag Is Space Ġ&& Ġshadow Tag . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠfileName . indexOf ('.') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Tag Ġ= Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 Ġ-> ĠfileName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠfileName . substring ( 0 , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . is Log Head Switch ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Name Ġ= ĠThread . currentThread (). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhead Ġ= ĠFormatter (). format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% s , Ġ% s .% s (% s :% d )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Element . className , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Element . methodName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Element . line Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Head Ġ= Ġ" Ġ[$ head ]: Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . get Stack Deep () Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTag Head ( shadow Tag , ĠlistOf ( head ), Ġfile Head ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconsole Head : ĠArray < String > Ġ= ĠArray ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . get Stack Deep (). coerce At Most ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack Trace . size Ġ- Ġstack Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ"" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole Head [ 0 ] Ġ= Ġhead ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspace Len Ġ= Ġt Name . length Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspace Ġ= ĠFormatter (). format ("% " Ġ+ Ġspace Len Ġ+ Ġ" s ", Ġ""). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole Head . forEach Indexed Ġ{ Ġindex , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Element Ġ= Ġstack Trace [ index Ġ+ Ġstack Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole Head [ index ] Ġ= ĠFormatter (). format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% s % s .% s (% s :% d )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspace , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Element . className , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Element . methodName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Element . get Internal FileName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Element . line Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTag Head ( shadow Tag , Ġconsole Head . toList (), Ġfile Head ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTag Head ( shadow Tag , Ġnull , Ġ": Ġ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Body ( type : ĠInt , Ġvar arg Ġcontents : ĠAny ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbody : ĠString Ġ= ĠNULL ĊĠĠĠĠĠĠĠ Ġif Ġ( contents . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġwhen Ġ( contents . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġformat Object ( type , Ġcontents [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontents . forEach Indexed Ġ{ Ġindex , Ġobj Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( ARGS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" [" ). append ( index ). append (" ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (" Ġ= Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( format Object ( obj )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġcontents . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( LINE _ SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( body . isEmpty ()) ĠNOT H ING Ġelse Ġbody ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStack Trace Element . get Internal FileName (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName Ġ!= Ġnull ) Ġreturn ĠfileName ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġname Ġof Ġfile Ġis Ġnull , Ġshould Ġadd ĊĠĠĠĠĠĠĠ Ġ// Ġ"- keep attributes ĠSource File , LineNumber Table " Ġin Ġpro guard Ġfile . ĊĠĠĠĠĠĠĠ Ġvar Ġshadow ClassName Ġ= ĠclassName ĊĠĠĠĠĠĠĠ Ġval ĠclassName Info Ġ= Ġshadow ClassName . split ("\\ .". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠ Ġif Ġ( className Info . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow ClassName Ġ= ĠclassName Info [ className Info . last Index ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġshadow ClassName . indexOf ('$ ') ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow ClassName Ġ= Ġshadow ClassName . substring ( 0 , Ġindex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ shadow ClassName . java " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġformat Object ( type : ĠInt , Ġany : ĠAny ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( any Ġ== Ġnull ) Ġreturn ĠNULL ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠJSON ) Ġreturn ĠTim ber Formatter . object 2 String ( any , ĠJSON ) ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠXML ) Ġreturn ĠTim ber Formatter . object 2 String ( any , ĠXML ) ĊĠĠĠĠĠĠĠ Ġreturn Ġformat Object ( any ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġformat Object ( any : ĠAny ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( any Ġ== Ġnull ) Ġreturn ĠNULL ĊĠĠĠĠĠĠĠ Ġif Ġ(! I _ FORMAT TER _ MAP . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Formatter : ĠI Formatter < Any ?> ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI _ FORMAT TER _ MAP . get ( getClass From Object ( any )) Ġas ? ĠI Formatter < Any ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Formatter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// no inspection Ġunchecked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi Formatter . format ( any ) Ġ?: ĠNULL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTim ber Formatter . object 2 String ( any ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetClass From Object ( obj : ĠAny ): ĠClass < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj Class : ĠClass < *> Ġ= Ġobj . java Class ĊĠĠĠĠĠĠĠ Ġif Ġ( obj Class . is Anonymous Class Ġ|| Ġobj Class . is Synt hetic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeneric Interfaces Ġ= Ġobj Class . generic Interfaces ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠclassName : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generic Interfaces . size Ġ== Ġ 1 ) Ġ{ Ġ// Ġinterface ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= Ġgeneric Interfaces [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( type Ġis ĠParameter ized Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . raw Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= Ġtype . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Ġabstract Ġclass Ġor Ġlambda ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= Ġobj Class . generic Super class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( type Ġis ĠParameter ized Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype . raw Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= Ġ"$ type " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( className . startsWith (" class Ġ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= ĠclassName . substring ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( className . startsWith (" interface Ġ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= ĠclassName . substring ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafely Void Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass . forName ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġobj Class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint 2 Console ( ĊĠĠĠĠĠĠĠ Ġtype : ĠInt , ĊĠĠĠĠĠĠĠ Ġtag : ĠString , ĊĠĠĠĠĠĠĠ Ġhead : ĠArray < String > ?, ĊĠĠĠĠĠĠĠ Ġmsg : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . is Single Tag Switch ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Single Tag Msg ( type , Ġtag , Ġprocess Single Tag Msg ( head , Ġmsg )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Border ( type , Ġtag , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Head ( type , Ġtag , Ġhead ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Msg ( type , Ġtag , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Border ( type , Ġtag , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Border ( type : ĠInt , Ġtag : ĠString , Ġis Top : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . is Log Border Switch ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( type , Ġtag , Ġif Ġ( is Top ) ĠTOP _ BORDER Ġelse ĠBOTTOM _ BORDER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Head ( type : ĠInt , Ġtag : ĠString , Ġhead : ĠArray < String > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! head . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( type , Ġtag , Ġif Ġ( CONFIG . is Log Border Switch ()) ĠLEFT _ BORDER Ġ+ Ġit Ġelse Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . is Log Border Switch ()) ĠLog . println ( type , Ġtag , ĠM ID DLE _ BORDER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Msg ( type : ĠInt , Ġtag : ĠString , Ġmsg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġmsg . length ĊĠĠĠĠĠĠĠ Ġval Ġcount Of Sub Ġ= Ġlen Ġ/ ĠMAX _ LEN ĊĠĠĠĠĠĠĠ Ġif Ġ( count Of Sub Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcount Of Sub ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Sub Msg ( type , Ġtag , Ġmsg . substring ( index , Ġindex Ġ+ ĠMAX _ LEN )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= ĠMAX _ LEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġlen ) Ġprint Sub Msg ( type , Ġtag , Ġmsg . substring ( index , Ġlen )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Sub Msg ( type , Ġtag , Ġmsg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Sub Msg ( type : ĠInt , Ġtag : ĠString , Ġmsg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! CONFIG . is Log Border Switch ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( type , Ġtag , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġmsg . split ( LINE _ SEP ) ĊĠĠĠĠĠĠĠ Ġlines . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( type , Ġtag , ĠLEFT _ BORDER Ġ+ Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Single Tag Msg ( ĊĠĠĠĠĠĠĠ Ġhead : ĠArray < String > ?, ĊĠĠĠĠĠĠĠ Ġmsg : ĠString ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . is Log Border Switch ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( PLACE HOLDER ). append ( LINE _ SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( TOP _ BORDER ). append ( LINE _ SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( head Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( a Head Ġin Ġhead ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( LEFT _ BORDER ). append ( a Head ). append ( LINE _ SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( MIDDLE _ BORDER ). append ( LINE _ SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġmsg . split ( LINE _ SEP )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( LEFT _ BORDER ). append ( line ). append ( LINE _ SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( BOTTOM _ BORDER ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( head Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( PLACE HOLDER ). append ( LINE _ SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( a Head Ġin Ġhead ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( a Head ). append ( LINE _ SEP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint Single Tag Msg ( type : ĠInt , Ġtag : ĠString , Ġmsg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġmsg . length ĊĠĠĠĠĠĠĠ Ġval Ġcount Of Sub : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . is Log Border Switch ()) Ġ( len Ġ- ĠBOTTOM _ BORDER . length ) Ġ/ ĠMAX _ LEN Ġelse Ġlen Ġ/ ĠMAX _ LEN ĊĠĠĠĠĠĠĠ Ġif Ġ( count Of Sub Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . is Log Border Switch ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( type , Ġtag , Ġmsg . substring ( 0 , ĠMAX _ LEN ) Ġ+ ĠLINE _ SEP Ġ+ ĠBOTTOM _ BORDER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex : ĠInt Ġ= ĠMAX _ LEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġcount Of Sub ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , Ġtag , ĠPL ACE HOLDER Ġ+ ĠLINE _ SEP Ġ+ ĠTOP _ BORDER Ġ+ ĠLINE _ SEP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠLEFT _ BORDER Ġ+ Ġmsg . substring ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+ ĠMAX _ LEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ ĠLINE _ SEP Ġ+ ĠBOTTOM _ BORDER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= ĠMAX _ LEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġlen Ġ- ĠBOTTOM _ BORDER . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , Ġtag , ĠPL ACE HOLDER Ġ+ ĠLINE _ SEP Ġ+ ĠTOP _ BORDER Ġ+ ĠLINE _ SEP Ġ+ ĠLEFT _ BORDER Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . substring ( index , Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( type , Ġtag , Ġmsg . substring ( 0 , ĠMAX _ LEN )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex : ĠInt Ġ= ĠMAX _ LEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġcount Of Sub ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , Ġtag , ĠPL ACE HOLDER Ġ+ ĠLINE _ SEP Ġ+ Ġmsg . substring ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex , Ġindex Ġ+ ĠMAX _ LEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= ĠMAX _ LEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( type , Ġtag , ĠPL ACE HOLDER Ġ+ ĠLINE _ SEP Ġ+ Ġmsg . substring ( index , Ġlen )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . println ( type , Ġtag , Ġmsg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint 2 File ( type : ĠInt , Ġtag : ĠString , Ġmsg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġformat : ĠString Ġ= ĠgetS df (). format ( Date ()) ĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġformat . substring ( 0 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġformat . substring ( 1 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġfull Path : ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( CONFIG . get Dir () Ġ+ ĠCONFIG . getFile Prefix () Ġ+ Ġ"_" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġdate Ġ+ Ġ"_" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONFIG . get Process Name () Ġ+ ĠCONFIG . getFile Extension ()) ĊĠĠĠĠĠĠĠ Ġif Ġ(! create Or Exists File ( fullPath , Ġdate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Log Utils ", Ġ" create Ġ$ fullPath Ġfailed !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġtime Ġ+ ĠT [ type Ġ- ĠTim ber . V . logLevel ] Ġ+ Ġ"/" Ġ+ Ġtag Ġ+ Ġmsg Ġ+ ĠLINE _ SEP ĊĠĠĠĠĠĠĠ Ġinput 2 File ( fullPath , Ġcontent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetS df (): ĠSimpleDateFormat Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( simple DateFormat Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsimple DateFormat Ġ= ĠSimpleDateFormat (" yyyy _ MM _ dd ĠHH : mm : ss . SS S Ġ", ĠLocale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsimple DateFormat !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Or Exists File ( filePath : ĠString , Ġdate : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġreturn Ġfile . isFile ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! Utils Bridge . create Or Exists Dir ( file . parent File )) Ġfalse Ġelse Ġcatch Or Boolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Due Logs ( filePath , Ġdate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Create Ġ= Ġfile . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Create ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint DeviceInfo ( filePath , Ġdate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Create ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Due Logs ( filePath : ĠString , Ġdate : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( CONFIG . get Save Days () Ġ<= Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠ Ġval Ġparent File : ĠFile ? Ġ= Ġfile . parent File ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġparent File ?. list Files Ġ{ Ġ_, Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Match Log FileName ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( files Ġ== Ġnull Ġ|| Ġfiles . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġsdf Ġ= ĠSimpleDateFormat (" yyyy _ MM _ dd ", ĠLocale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġsafely Void Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdue Millis : ĠLong Ġ= ĠcheckNotNull ( sdf . parse ( date )?. time ) Ġ- ĠCONFIG . get Save Days () Ġ* Ġ 8 6 4 0 0 0 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( a File Ġin Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġa File . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog Day : ĠString Ġ= Ġfind Date ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( checkNotNull ( sdf . parse ( log Day )?. time ) Ġ<= Ġdue Millis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEXEC UT OR . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelete Ġ= Ġa File . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! delete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Log Utils ", Ġ" delete Ġ$ a File Ġfailed !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Match Log FileName ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġname . matches ("^ ${ CONFIG . getFile Prefix ()} _[ 0 - 9 ]{ 4 } _[ 0 - 9 ]{ 2 } _[ 0 - 9 ]{ 2 } _. *$ ". to Regex ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Date ( str : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= ĠPattern . compile ("[ 0 - 9 ]{ 4 } _[ 0 - 9 ]{ 2 } _[ 0 - 9 ]{ 2 }") ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġpattern . matcher ( str ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . group () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprint DeviceInfo ( filePath : ĠString , Ġdate : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ********* **** ĠLog ĠHead Ġ********* ******* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDate Ġof ĠLog ĠĠĠĠĠĠĠ Ġ: Ġ$ date ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDevice ĠMan ufacturer : Ġ${ Build . MAN U FACT UR ER } ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDevice ĠModel ĠĠĠĠĠĠ Ġ: Ġ${ Build . MODEL } ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid ĠVersion ĠĠĠ Ġ: Ġ${ Build . VERSION . RELEASE } ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid ĠSDK ĠĠĠĠĠĠĠ Ġ: Ġ${ Build . VERSION . SDK _ INT } ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp ĠVersion Name ĠĠĠ Ġ: Ġ${ Utils Bridge . getApp Version Name ()} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp ĠVersion Code ĠĠĠ Ġ: Ġ${ Utils Bridge . getApp Version Code ()} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ********* **** ĠLog ĠHead Ġ********* ******* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġinput 2 File ( filePath , Ġhead ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinput 2 File ( filePath : ĠString , Ġinput : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCONFIG . file Writer ?. write ( filePath , Ġinput ) Ġ?: ĠUtils Bridge . writeFile FromString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġval ĠCONFIG Ġ= ĠTim ber Config () Ċ internal Ġval ĠT Ġ= Ġchar ArrayOf (' V ', Ġ' D ', Ġ' I ', Ġ' W ', Ġ' E ', Ġ' A ') Ċ Ċ internal Ġval ĠFILE _ SEP Ġ= ĠSystem . getProperty (" file . separator ") Ġ?: Ġ"" Ċ internal Ġval ĠLINE _ SEP Ġ= ĠSystem . getProperty (" line . separator ") Ġ?: Ġ"" Ċ Ċ internal Ġval ĠI _ FORMAT TER _ MAP : ĠSimple Array Map < Class <* >, ĠI Formatter <* >> Ġ= ĠSimple Array Map () Ċ Ċ internal Ġconst Ġval ĠMAX _ LEN Ġ= Ġ 1 1 0 0 Ġ// fit Ġfor ĠChinese Ġcharacter Ċ internal Ġconst Ġval ĠNOT H ING Ġ= Ġ" log Ġnothing " Ċ internal Ġconst Ġval ĠNULL Ġ= Ġ" null " Ċ internal Ġconst Ġval ĠARGS Ġ= Ġ" args " Ċ internal Ġconst Ġval ĠPL ACE HOLDER Ġ= Ġ" Ġ" Ċ Ċ internal Ġconst Ġval ĠFILE Ġ= Ġ 0 x 1 0 Ċ internal Ġconst Ġval ĠJSON Ġ= Ġ 0 x 2 0 Ċ internal Ġconst Ġval ĠXML Ġ= Ġ 0 x 3 0 Ċ Ċ private Ġvar Ġsimple DateFormat : ĠSimpleDateFormat ? Ġ= Ġnull Ċ private Ġval ĠEXEC UT OR Ġ= ĠExec utors . new Single Thread Executor () Ċ Ċ private Ġconst Ġval ĠTOP _ COR NER Ġ= Ġ" âĶ Į " Ċ private Ġconst Ġval ĠM ID DLE _ COR NER Ġ= Ġ" âĶ ľ " Ċ private Ġconst Ġval ĠLEFT _ BORDER Ġ= Ġ" âĶĤ Ġ" Ċ private Ġconst Ġval ĠBOTTOM _ COR NER Ġ= Ġ" âĶĶ " Ċ private Ġconst Ġval ĠS IDE _ DI VIDER Ġ= Ġ" âĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢ âĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢ âĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢâĶĢ " Ċ private Ġconst Ġval ĠM ID DLE _ DI VIDER Ġ= Ġ" âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ âĶ Ħ " Ċ Ċ private Ġconst Ġval ĠTOP _ BORDER : ĠString Ġ= ĠTOP _ COR NER Ġ+ ĠS IDE _ DI VIDER Ġ+ ĠS IDE _ DI VIDER Ċ private Ġconst Ġval ĠM ID DLE _ BORDER : ĠString Ġ= ĠM ID DLE _ COR NER Ġ+ ĠM ID DLE _ DI VIDER Ġ+ ĠM ID DLE _ DI VIDER Ċ private Ġconst Ġval ĠBOTTOM _ BORDER : ĠString Ġ= ĠBOTTOM _ COR NER Ġ+ ĠS IDE _ DI VIDER Ġ+ ĠS IDE _ DI VIDER Ċ Ċ sealed Ġclass ĠTim ber ( internal Ġval Ġlog Level : ĠInt , Ġinternal Ġval Ġlog Char : ĠChar ) Ġ{ ĊĠĠĠ Ġobject ĠV Ġ: ĠTim ber ( Log . VERBOSE , Ġ' V ') ĊĠĠĠ Ġobject ĠD Ġ: ĠTim ber ( Log . DEBUG , Ġ' D ') ĊĠĠĠ Ġobject ĠI Ġ: ĠTim ber ( Log . INFO , Ġ' I ') ĊĠĠĠ Ġobject ĠW Ġ: ĠTim ber ( Log . WARN , Ġ' W ') ĊĠĠĠ Ġobject ĠE Ġ: ĠTim ber ( Log . ERROR , Ġ' E ') ĊĠĠĠ Ġobject ĠA Ġ: ĠTim ber ( Log . ASSERT , Ġ' A ') ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠInt . to Tim ber (): ĠTim ber Ġ= Ġwhen ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . VERBOSE Ġ-> ĠV ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . DEBUG Ġ-> ĠD ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . INFO Ġ-> ĠI ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . WARN Ġ-> ĠW ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . ERROR Ġ-> ĠE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . ASSERT Ġ-> ĠA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠV ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun Ġand ( other : ĠInt ): ĠTim ber Ġ= Ġ( logLevel Ġand Ġother ). to Tim ber () Ċ }