/** Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠH adi ĠL ash k ari ĠG hou chan i ĊĊ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat ĊĊ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 ĊĊ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . log 4 k Ċ Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġand Ġdefault Ġapp ender . Ċ Ġ*/ Ċ open Ġclass ĠJVM Appender ( ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPrint Ġwriter Ġto Ġhandle Ġthe Ġoutput Ġof Ġthis Ġapp ender . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġwriter : ĠPrintWriter Ġ= ĠPrintWriter ( System . out ), ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġlambda Ġfunction Ġto Ġgenerate Ġa Ġstring Ġof Ġthe Ġtimestamp Ġof Ġthe Ġlog . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġgenerate Timestamp : Ġ() Ġ-> ĠString Ġ= Ġ{ ĊĠĠĠ Ġval Ġsdf Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss . SS S ", ĠLocale . getDefault ()) ĊĠĠĠ Ġsdf . time Zone Ġ= ĠCalendar . getInstance (). time Zone ĊĠĠĠ Ġ"${ sdf . format ( Date ()) }/ Ġ" ĊĠ Ġ}, ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġlambda Ġfunction Ġto Ġgenerate Ġa Ġstring Ġto Ġshow Ġlevel Ġof Ġthe Ġlog . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġgenerate Level : Ġ( Level ) Ġ-> ĠString Ġ= Ġ{ ĊĠĠĠ Ġwhen Ġ( it . level ) Ġ{ ĊĠĠĠĠĠ ĠLevel . Verbose . level Ġ-> Ġ" V /" ĊĠĠĠĠĠ ĠLevel . Debug . level Ġ-> Ġ" D /" ĊĠĠĠĠĠ ĠLevel . Info . level Ġ-> Ġ" I /" ĊĠĠĠĠĠ ĠLevel . Warn . level Ġ-> Ġ" W /" ĊĠĠĠĠĠ ĠLevel . Error . level Ġ-> Ġ" E /" ĊĠĠĠĠĠ ĠLevel . Assert . level Ġ-> Ġ" A /" ĊĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠ Ġ} ĊĠ Ġ}, ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġlambda Ġfunction Ġto Ġgenerate Ġa Ġstring Ġto Ġshow Ġclass Ġname Ġof Ġthe Ġlog ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġgenerate ClassName : Ġ( Config ) Ġ-> ĠString Ġ= Ġ{ ĊĠĠĠ Ġ"${ it . tag . substring After Last ('.') }: Ġ" ĊĠ Ġ} Ċ ) Ġ: ĠApp ender ({ Ġlevel , Ġconfig , Ġevent Ġ-> ĊĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠ Ġis ĠSimple Event Ġ-> Ġ{ ĊĠĠĠĠĠ Ġwriter . println ("${ generate Timestamp ()} ${ generate Level ( level )} ${ generate ClassName ( config )} ${ event . message }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠSimple Throwable Event Ġ-> Ġ{ ĊĠĠĠĠĠ Ġwriter . println ("${ generate Timestamp ()} ${ generate Level ( level )} ${ generate ClassName ( config )} ${ event . message }") ĊĠĠĠĠĠ Ġevent . throwable . printStackTrace ( writer ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġwriter . flush () Ċ }) Ġ{ ĊĠ Ġopen Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġwriter . close () ĊĠ Ġ} Ċ } Ċ