package Ġcz . v ut br . fit . k not . entic ing . log Ċ Ċ import Ġcz . v ut br . fit . k not . entic ing . dto . config . dsl . Log Type Ċ import Ġcz . v ut br . fit . k not . entic ing . dto . config . dsl . Logging Configuration Ċ import Ġcz . v ut br . fit . k not . entic ing . log . util . resolve Name Ċ import Ġjava . io . File Ċ import Ġjava . io . FileWriter Ċ import Ġjava . time . Duration Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ Ċ interface ĠLogger Pipe Line Node Ġ{ ĊĠĠĠ Ġfun Ġlog ( log Message : ĠLog Message ) ĊĠĠĠ Ġfun Ġperf ( perf Message : ĠPer f Message ) Ċ } Ċ Ċ /** Ċ Ġ* ĠBase Ġinterface Ġfor Ġa Ġlogger Ċ Ġ*/ Ċ interface ĠLogger Ġ: ĠLogger Pipe Line Node Ġ{ ĊĠĠĠ Ġfun Ġdebug ( message : ĠString ) ĊĠĠĠ Ġfun Ġinfo ( message : ĠString ) ĊĠĠĠ Ġfun Ġwarn ( message : ĠString ) ĊĠĠĠ Ġfun Ġerror ( message : ĠString ) ĊĠĠĠ Ġfun Ġperf ( operation Id : ĠString , Ġarguments : ĠString ?, Ġduration : ĠLong , Ġoutcome : ĠString ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġfactory Ġthat Ġcan Ġcreate Ġlog gers Ċ Ġ*/ Ċ interface ĠLoggerFactory Ġ: ĠAuto Closeable Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġnew Ġlogger Ġwith Ġspecified Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnamed Logger ( name : ĠString ): ĠLogger ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa Ġremote ĠAPI Ġto Ġwhich Ġimportant Ġlogs Ġshould Ġbe Ġtransmitted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Remote Api ( remote Logging Api : ĠRemote Logging Api ) Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġnew Ġlogger Ġwith Ġname Ġinferred Ġfrom Ġthe Ġencaps ulating Ġclass Ċ Ġ*/ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun ĠLoggerFactory . logger ( no inline Ġfunc : Ġ() Ġ-> ĠUnit ): ĠLogger Ġ= Ġnamed Logger ( resolve Name ( func )) Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġsimple Ġstdout Ġlogger Ġusing ĠSimple Stdout LoggerFactory Ċ Ġ*/ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun Ġstdout Logger ( no inline Ġfunc : Ġ() Ġ-> ĠUnit ) Ġ= ĠSimple Stdout LoggerFactory . logger ( func ) Ċ Ċ /** Ċ Ġ* ĠFactory Ġfunction Ġto Ġcreate Ġa Ġlogger Ġfrom Ġa ĠLogging Configuration Ġobject Ċ Ġ*/ Ċ fun ĠLogging Configuration . logger Factory For ( service Id : ĠString , Ġremote Logging Api : ĠRemote Logging Api ? Ġ= Ġnull ): ĠLoggerFactory Ġ{ ĊĠĠĠ Ġval Ġstdout Logger Ġ= ĠFiltering Logger Node ( stdout Logs , ĠStd out Logger Node ( this )) ĊĠĠĠ Ġval Ġfile Logger Ġ= ĠFile Based Logger Node ( File ("${ this . root Directory }/ $ service Id . log "), Ġthis ) ĊĠĠĠ Ġval Ġfiltered File Logger Ġ= ĠFiltering Logger Node ( file Logs , Ġfile Logger ) ĊĠĠĠ Ġval Ġpipelines Ġ= Ġmutable ListOf < Logger Pipe Line Node >( stdout Logger , Ġfiltered File Logger ) ĊĠĠĠ Ġif Ġ( remote Logging Api Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpipelines . add ( Filtering Logger Node ( management Logging Configuration . log Types , Ġremote Logging Api )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġobject Ġ: ĠLoggerFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnamed Logger ( name : ĠString ): ĠLogger Ġ= ĠNamed Logger ( name , Ġpipelines ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Remote Api ( remote Logging Api : ĠRemote Logging Api ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipelines . add ( remote Logging Api ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Logger . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠLoggerFactory . with Extra File Logger ( path : ĠString ) Ġ= Ġwith Extra File Logger ( File ( path )) Ċ Ċ fun ĠLoggerFactory . with Extra File Logger ( file : ĠFile ): ĠLoggerFactory Ġ{ ĊĠĠĠ Ġval Ġfile Logger Ġ= ĠFile Based Logger Node ( file , ĠLogging Configuration ()) ĊĠĠĠ Ġval Ġparent Ġ= Ġthis ĊĊĠĠĠ Ġreturn Ġobject Ġ: ĠLoggerFactory Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnamed Logger ( name : ĠString ): ĠLogger Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Logger Ġ= Ġparent . named Logger ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNamed Logger ( name , ĠlistOf ( file Logger , Ġparent Logger )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Remote Api ( remote Logging Api : ĠRemote Logging Api ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" adding Ġlog gers Ġnot Ġsupported Ġhere ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Logger . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSimple Ġlogger Ġfactory Ġprinting Ġlogs Ġto Ġstdout Ċ Ġ*/ Ċ object ĠSimple Stdout LoggerFactory Ġ: ĠLoggerFactory Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġconfig Ġ= ĠLogging Configuration (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġpattern Ġ= Ġ" dd - MM - yyyy ĠHH : mm : ss " ĊĠĠĠĠĠĠĠ Ġstdout Logs . remove ( Log Type . DEBUG ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnamed Logger ( name : ĠString ): ĠLogger Ġ= ĠNamed Logger ( name , ĠlistOf ( Filtering Logger Node ( config . stdout Logs , ĠStd out Logger Node ( config )))) ĊĊĠĠĠ Ġoverride Ġfun Ġadd Remote Api ( remote Logging Api : ĠRemote Logging Api ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" adding Ġlog gers Ġnot Ġsupported Ġhere ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠUtility Ġext ention Ġto Ġlog Ġan Ġexception Ċ Ġ*/ Ċ fun ĠLogger . error ( ex : ĠException ) Ġ{ ĊĠĠĠ Ġthis . error ("${ ex :: class } Ġ${ ex . message }") Ċ } Ċ Ċ /** Ċ Ġ* ĠSimple Ġdto Ġto Ġcreate Ġa Ġcontext Ġfor Ġthe Ġex ection Ġof Ġa Ġmeasured Ġblock Ġof Ġcode , Ċ Ġ* Ġso Ġthat Ġthe Ġblock Ġcan Ġspecify Ġmore Ġdetails Ġabout Ġthe Ġexecution Ġif Ġnecessary Ċ Ġ*/ Ċ data Ġclass ĠPerformance Measurement Info ( var Ġmessage : ĠString Ġ= Ġ" SUCCESS ") Ċ Ċ /** Ċ Ġ* ĠMeasure Ġa Ġgiven Ġoperation Ġand Ġsave Ġit 's Ġduration Ġand Ġresult . Ċ Ġ*/ Ċ inline Ġfun Ġ< T > ĠLogger . measure ( operation Id : ĠString , Ġarguments : ĠString ? Ġ= Ġnull , Ġblock : ĠPerformance Measurement Info . () Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġval Ġinfo Ġ= ĠPerformance Measurement Info () ĊĠĠĠ Ġval Ġstart Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġinfo . block () ĊĠĠĠĠĠĠĠ Ġperf ( operation Id , Ġarguments , ĠSystem . currentTimeMillis () Ġ- Ġstart , Ġinfo . message ) ĊĠĠĠĠĠĠĠ Ġres ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġperf ( operation Id , Ġarguments , ĠSystem . currentTimeMillis () Ġ- Ġstart , Ġ" FAILURE : Ġ${ ex :: class } Ġ${ ex . message }") ĊĠĠĠĠĠĠĠ Ġthrow Ġex ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠLog Message . to Print able String ( formatter : ĠDateTime Formatter ) Ġ= Ġ"${ readable Timestamp ( timestamp , Ġformatter )} Ġ: Ġ$ className Ġ: Ġ$ log Type Ġ\ n Ġmessage : Ġ Ġ$ message " Ċ Ċ private Ġfun ĠPer f Message . to Print able String ( formatter : ĠDateTime Formatter ) Ġ= Ġ"${ readable Timestamp ( timestamp , Ġformatter )} Ġ: Ġ$ className Ġ: ĠPER F Ġ: ĠOperation Ġ'$ operation Id ' Ġ: Ġ$ result Ġ: Ġ${ readable Duration ( duration )} Ġ Ġ\ n Ġarguments Ġ$ arguments " Ċ Ċ private Ġfun Ġreadable Duration ( millis : ĠLong ) Ġ= ĠDuration . of Millis ( millis ). toString (). substring ( 2 ) Ċ Ċ private Ġfun Ġreadable Timestamp ( timestamp : ĠLocalDateTime , Ġformatter : ĠDateTime Formatter ): ĠString Ġ= Ġtimestamp . format ( formatter ) ĊĊ Ċ private Ġclass ĠNamed Logger ( val Ġcomponent Name : ĠString , Ġval Ġpipelines : ĠList < Logger Pipe Line Node >) Ġ: ĠLogger Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġdebug ( message : ĠString ) Ġ= Ġlog ( Log Message ( Log Type . DEBUG , Ġcomponent Name , Ġmessage )) ĊĊĠĠĠ Ġoverride Ġfun Ġinfo ( message : ĠString ) Ġ= Ġlog ( Log Message ( Log Type . INFO , Ġcomponent Name , Ġmessage )) ĊĊĠĠĠ Ġoverride Ġfun Ġwarn ( message : ĠString ) Ġ= Ġlog ( Log Message ( Log Type . WARN , Ġcomponent Name , Ġmessage )) ĊĊĠĠĠ Ġoverride Ġfun Ġerror ( message : ĠString ) Ġ= Ġlog ( Log Message ( Log Type . ERROR , Ġcomponent Name , Ġmessage )) ĊĊĠĠĠ Ġoverride Ġfun Ġlog ( log Message : ĠLog Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpipelines . forEach Ġ{ Ġit . log ( log Message ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperf ( perf Message : ĠPer f Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpipelines . forEach Ġ{ Ġit . perf ( perf Message ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperf ( operation Id : ĠString , Ġarguments : ĠString ?, Ġduration : ĠLong , Ġoutcome : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġperf ( Perf Message ( component Name , Ġoperation Id , Ġarguments , Ġduration , Ġoutcome )) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġclass ĠFiltering Logger Node ( val Ġfilter : ĠEnum Set < Log Type >, Ġval Ġnext : ĠLogger Pipe Line Node ) Ġ: ĠLogger Pipe Line Node Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlog ( log Message : ĠLog Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( log Message . log Type Ġin Ġfilter ) Ġnext . log ( log Message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperf ( perf Message : ĠPer f Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Log Type . PERF Ġin Ġfilter ) Ġnext . perf ( perf Message ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠConfig ured Logger Node ( config : ĠLogging Configuration ) Ġ: ĠLogger Pipe Line Node Ġ{ ĊĠĠĠ Ġprotected Ġval Ġformatter Ġ= ĠDateTime Formatter . of Pattern ( config . pattern ) Ċ } Ċ Ċ private Ġclass ĠStd out Logger Node ( config : ĠLogging Configuration ) Ġ: ĠConfig ured Logger Node ( config ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġlog ( log Message : ĠLog Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( log Message . to Print able String ( formatter )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperf ( perf Message : ĠPer f Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( perf Message . to Print able String ( formatter )) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġclass ĠFile Based Logger Node ( val Ġfile : ĠFile , Ġconfig : ĠLogging Configuration ) Ġ: ĠConfig ured Logger Node ( config ), ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġwriter Ġ= ĠFile Writer ( file , Ġtrue ) ĊĊĠĠĠ Ġoverride Ġfun Ġlog ( log Message : ĠLog Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . append Line ( log Message . to Print able String ( formatter )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperf ( perf Message : ĠPer f Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . append Line ( perf Message . to Print able String ( formatter )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ interface ĠRemote Logging Api Ġ: ĠLogger Pipe Line Node Ċ