package Ġio . ktor . features Ċ Ċ import Ġio . ktor . application .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . util . pipeline .* Ċ import Ġio . ktor . request .* Ċ import Ġio . ktor . util .* Ċ import Ġorg . slf 4 j .* Ċ import Ġorg . slf 4 j . event .* Ċ Ċ /** Ċ Ġ* ĠLogs Ġapplication Ġlifecycle Ġand Ġcall Ġevents . Ċ Ġ*/ Ċ class ĠCall Logging ( private Ġval Ġlog : ĠLogger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmonitor : ĠApplication Events , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlevel : ĠLevel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġfilters : ĠList <( Application Call ) Ġ-> ĠBoolean >) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConfiguration Ġfor Ġ[ Call Logging ] Ġfeature ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠConfiguration Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġfilters Ġ= Ġmutable ListOf <( Application Call ) Ġ-> ĠBoolean >() ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLogging Ġlevel Ġfor Ġ[ Call Logging ], Ġdefault Ġis Ġ[ Level . TRACE ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġlevel : ĠLevel Ġ= ĠLevel . TRACE ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLog Ġmessages Ġfor Ġcalls Ġmatching Ġa Ġ[ predicate ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġfilter ( predicate : Ġ( Application Call ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilters . add ( predicate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstarting : Ġ( Application ) Ġ-> ĠUnit Ġ= Ġ{ Ġlog (" Application Ġstarting : Ġ$ it ") Ġ} ĊĠĠĠ Ġprivate Ġval Ġstarted : Ġ( Application ) Ġ-> ĠUnit Ġ= Ġ{ Ġlog (" Application Ġstarted : Ġ$ it ") Ġ} ĊĠĠĠ Ġprivate Ġval Ġstopping : Ġ( Application ) Ġ-> ĠUnit Ġ= Ġ{ Ġlog (" Application Ġstopping : Ġ$ it ") Ġ} ĊĠĠĠ Ġprivate Ġvar Ġstopped : Ġ( Application ) Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstopped Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Application Ġstopped : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . unsubscribe ( Application Starting , Ġstarting ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . unsubscribe ( Application Started , Ġstarted ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . unsubscribe ( Application Stopping , Ġstopping ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . unsubscribe ( Application Stopped , Ġstopped ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmonitor . subscribe ( Application Starting , Ġstarting ) ĊĠĠĠĠĠĠĠ Ġmonitor . subscribe ( Application Started , Ġstarted ) ĊĠĠĠĠĠĠĠ Ġmonitor . subscribe ( Application Stopping , Ġstopping ) ĊĠĠĠĠĠĠĠ Ġmonitor . subscribe ( Application Stopped , Ġstopped ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInstall able Ġfeature Ġfor Ġ[ Call Logging ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġcompanion Ġobject ĠFeature Ġ: ĠApplication Feature < Application , ĠConfiguration , ĠCall Logging > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġkey : ĠAttribute Key < Call Logging > Ġ= ĠAttribute Key (" Call ĠLogging ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( pipeline : ĠApplication , Ġconfigure : ĠConfiguration . () Ġ-> ĠUnit ): ĠCall Logging Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogging Phase Ġ= ĠPipeline Phase (" Logging ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠConfiguration (). apply ( configure ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeature Ġ= ĠCall Logging ( pipeline . log , Ġpipeline . environment . monitor , Ġconfiguration . level , Ġconfiguration . filters . toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . insert Phase Before ( Application Call Pipeline . Infrastructure , Ġlogging Phase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . intercept ( logging Phase ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproceed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature . log Success ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfeature ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog ( message : ĠString ) Ġ= Ġwhen Ġ( level ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLevel . ERROR Ġ-> Ġlog . error ( message ) ĊĠĠĠĠĠĠĠ ĠLevel . WARN Ġ-> Ġlog . warn ( message ) ĊĠĠĠĠĠĠĠ ĠLevel . INFO Ġ-> Ġlog . info ( message ) ĊĠĠĠĠĠĠĠ ĠLevel . DEBUG Ġ-> Ġlog . debug ( message ) ĊĠĠĠĠĠĠĠ ĠLevel . TRACE Ġ-> Ġlog . trace ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Success ( call : ĠApplication Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filters . isEmpty () Ġ|| Ġfilters . any Ġ{ Ġit ( call ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġcall . response . status () Ġ?: Ġ" Unhandled " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatusCode . Found Ġ-> Ġlog ("$ status : Ġ${ call . request . to Log String ()} Ġ-> Ġ${ call . response . headers [ HttpHeaders . Location ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlog ("$ status : Ġ${ call . request . to Log String () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠGenerates Ġa Ġstring Ġrepresenting Ġthis Ġ[ Application Request ] Ġsuitable Ġfor Ġlogging Ċ Ġ*/ Ċ fun ĠApplication Request . to Log String () Ġ= Ġ"${ http Method . value } Ġ- Ġ${ path () }" Ċ