package Ġcom . d anie le b ach ic chi . badge log k Ċ Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġfor Ġall ĠLog Destination . ĠSub class Ġit Ġfor Ġcreate Ġa Ġcustom ĠLog ĠDestination . Ċ Ġ* Ċ Ġ* Ġ@ author ĠD anie le ĠB ach ic chi Ċ Ġ*/ Ċ abstract Ġclass ĠLog Destination Ġ{ ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMinimum Ġ[ Logger . LogLevel ] Ġwhich Ġthis ĠLog Destination Ġwill Ġprint Ġthe Ġlog Ġrow . ĊĠĠĠĠ Ġ* ĠAll Ġlevels Ġunder Ġthe Ġminimum Ġlevel Ġwill Ġnot Ġbe Ġgenerated ĊĠĠĠĠ Ġ* Ġ([ Log Destination . send ] Ġwill Ġreturn Ġan Ġempty Ġstring ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠDefault Ġvalue Ġis Ġ[ Logger . LogLevel . VERBOSE ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġmin Level : ĠLogger . LogLevel Ġ= ĠLogger . LogLevel . VERBOSE ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠString Ġformat Ġfor Ġevery Ġsingle Ġrows Ġgenerated Ġby Ġthis Ġ[ Log Destination ]. ĊĠĠĠĠ Ġ* ĠCheck Ġout Ġthe Ġdocumentation Ġto Ġknow Ġhow Ġto Ġcustomize Ġit ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġformat : ĠString Ġ= Ġ" T Ġ'-' ĠL Ġ'-' Ġ'[' c ':' l '] ' ĠM Ġe " ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDate Ġformatter Ġfor Ġthe Ġlog Ġrow . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġdate Formatter : ĠSimpleDateFormat Ġ= ĊĠĠĠĠĠĠĠ ĠSimpleDateFormat (" yyyy - MM - dd ' T ' HH : mm ' Z '", ĠLocale . US ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ LogLevel Descriptor ] Ġused Ġinside Ġthis Ġ[ Log Destination ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġlog Level Descriptor Ġ= ĠLogLevel Descriptor () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdate Formatter . time Zone Ġ= ĠTime Zone . getTime Zone (" UTC ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġformatted Ġlog Ġrow Ġstring Ġaccording Ġto Ġ[ Log Destination . format ]. ĊĠĠĠĠ Ġ* ĠOver write Ġthis Ġmethod Ġto Ġsave Ġthe Ġlog Ġrow Ġgenerated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġ[ Log Destination . min Level ] Ġis Ġgreater Ġthan Ġ[ level ] Ġthan Ġthe Ġlog Ġrow Ġgenerated Ġwill Ġbe Ġan ĊĠĠĠĠ Ġ* Ġempty Ġstring . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlevel Ġthe Ġlog Ġlevel Ġof Ġthis Ġlog Ġrow . ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Ġthe Ġmessage Ġof Ġthis Ġlog Ġrow . ĊĠĠĠĠ Ġ* Ġ@ param Ġerror Ġthe Ġthrowable Ġerror Ġ( if Ġpresent ) Ġof Ġthis Ġlog Ġrow . ĊĠĠĠĠ Ġ* Ġ@ param Ġtag Ġthe Ġtag Ġof Ġthis Ġlog Ġrow . ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġthe Ġclass Ġname Ġfor Ġthis Ġlog Ġrow . ĊĠĠĠĠ Ġ* Ġ@ param Ġmethod Ġthe Ġmethod Ġname Ġof Ġthis Ġlog Ġrow . ĊĠĠĠĠ Ġ* Ġ@ param Ġline Ġthe Ġline Ġnumber Ġinside Ġthe Ġ[ file ] Ġof Ġthis Ġlog Ġrow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġformatted Ġlog Ġrow Ġstring . ĊĠĠĠĠ Ġ* ĠEmpty Ġif Ġ[ Log Destination . min Level ] Ġis Ġgreater Ġthan Ġ[ level ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠĠ Ġopen Ġfun Ġsend ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel : ĠLogger . LogLevel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror : ĠThrowable ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline : ĠInt ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠĠ Ġif Ġ( min Level . ordinal Ġ> Ġlevel . ordinal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĊĠĠĠĠĠĠĠĠ Ġreturn Ġformat Message ( format , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Message ( format : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel : ĠLogger . LogLevel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror : ĠThrowable ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠDate () ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġformat Variables Ġ= Ġformat . chunk ed ( 1 ) ĊĠĠĠĠĠĠĠ Ġvar Ġcustom String Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( variable Ġin Ġformat Variables ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Ġ== Ġ"'" Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom String Ġ= Ġ! custom String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom String Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen ( variable ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" M " Ġ-> Ġresult Ġ+= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" l " Ġ-> Ġresult Ġ+= Ġ"$ line " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" m " Ġ-> Ġresult Ġ+= Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" f " Ġ-> Ġresult Ġ+= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" c " Ġ-> Ġresult Ġ+= Ġfile . substring ( file . lastIndexOf (".") Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" t " Ġ-> Ġresult Ġ+= Ġtag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" e " Ġ-> Ġresult Ġ+= Ġif Ġ( error Ġ!= Ġnull ) Ġ"\ n " Ġ+ Ġerror . stack Trace ToString () Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" L " Ġ-> Ġresult Ġ+= Ġlog Level Descriptor . describe ( level ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" T " Ġ-> Ġresult Ġ+= Ġdate Formatter . format ( now ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ" Ġ-> Ġresult Ġ+= Ġ" Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ /** Ċ Ġ* ĠData Ġclass Ġfor Ġdescribing Ġthe Ġvarious Ġ[ Logger . LogLevel ] Ġinside Ġthis Ġ[ Log Destination ] Ċ Ġ* Ġ*/ Ċ data Ġclass ĠLogLevel Descriptor ( var Ġverbose : ĠString Ġ= Ġ" VERBOSE ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdebug : ĠString Ġ= Ġ" DEBUG ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinfo : ĠString Ġ= Ġ" INFO ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwarning : ĠString Ġ= Ġ" WARNING ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġerror : ĠString Ġ= Ġ" ERROR ") Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġdescription Ġof Ġthe Ġ[ Logger . LogLevel ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlevel ĠThe Ġlevel Ġyou Ġwant Ġthe Ġdescription Ġfor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdescribe ( level : ĠLogger . LogLevel ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( level ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . LogLevel . VERBOSE Ġ-> Ġverbose ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . LogLevel . DEBUG Ġ-> Ġdebug ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . LogLevel . INFO Ġ-> Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . LogLevel . WARNING Ġ-> Ġwarning ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . LogLevel . ERROR Ġ-> Ġerror ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }