package Ġcom . example . challenge ap if r ave ga . service . logger Ċ Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . aspect j . lang . Pro ceeding Join Point Ċ import Ġorg . aspect j . lang . annotation . Around Ċ import Ġorg . aspect j . lang . annotation . Aspect Ċ import Ġorg . springframework . stereotype . Component Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{ Ġ} Ċ Ċ @ Aspect Ċ @ Component Ċ class ĠLog Aspect Ġ{ ĊĊĠĠĠ Ġ@ Suppress (" Too Generic Exception Ca ught ") ĊĠĠĠ Ġ@ Around ("@ annotation ( com . example . challenge ap if r ave ga . service . logger . Log Execution )") ĊĠĠĠ Ġfun Ġlog Execution Time ( join Point : ĠPro ceeding Join Point ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġjoin Point . signature . to Short String () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( StringBuilder (" start Ġ-> ĠExec uting Ġ$ signature , Ġ"), Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Parameters ( join Point . args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ( toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoin Point . proceed () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" *** ĠException Ġduring Ġexecuting Ġ$ signature , Ġ${ throwable . java Class } Ġ- Ġmessage : Ġ${ throwable . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġthrowable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= ĠSystem . currentTimeMillis () Ġ- Ġstart ĊĠĠĠĠĠĠĠ Ġlogger . info (" end Ġ-> ĠFinished Ġexecuting : Ġ$ signature , Ġreturned : Ġ'$ result ', Ġduration : Ġ$ duration Ġms ") ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStringBuilder . append Parameters ( args : ĠArray < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġappend (" parameters : Ġ[ ") ĊĠĠĠĠĠĠĠ Ġargs . forEach Indexed Ġ{ Ġi , Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( p . java Class . simple Name ). append (" (" ). append ( p . toString ()). append (" )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġargs . size Ġ- Ġ 1 ) Ġappend (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġappend (" ]") ĊĠĠĠ Ġ} Ċ Ċ }