/* ĊĊĠĠ ĠCopyright Ġ 2 0 2 1 ĠMichael ĠStr asser . ĊĊĠĠ Ġ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 Ġio . k logging . internal Ċ Ċ import Ġio . k logging . Level Ċ import Ġio . k logging . Level . TRACE Ċ import Ġio . k logging . events . Log Event Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ /** ĠObject Ġthat Ġhandles Ġdispatch ing Ġof Ġ[ Log Event ] s Ġto Ġzero Ġor Ġmore Ġsink s . Ġ*/ Ċ internal Ġobject ĠDispatcher Ġ: ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġk logging Parent Context ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDispatch Ġa Ġ[ Log Event ] Ġto Ġselected Ġtargets . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠEach Ġis Ġdis patched Ġin Ġa Ġseparate Ġcoroutine . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġdispatch Event ( log Event : ĠLog Event ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġare Ġtracing ĠK logging , Ġadd Ġevent ĠID Ġto Ġthe Ġitems Ġmap . ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġif Ġ( K logging Engine . k logging Min LogLevel () Ġ== ĠTRACE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event . copy With ( log Event . level , Ġlog Event . stack Trace , Ġmap Of (" eventId " Ġto Ġlog Event . id )) ĊĠĠĠĠĠĠĠ Ġelse Ġlog Event ĊĊĠĠĠĠĠĠĠ Ġsink s For ( log Event . logger , Ġlog Event . level ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġsink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace (" Dispatcher ", Ġ" Dispatch ing Ġevent Ġ${ event . id } Ġto Ġ${ sink . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . forward Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculate Ġthe Ġsink s Ġfor Ġthe Ġspecified Ġlogger Ġand Ġlevel . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠLogging Ġconfigurations Ġare Ġevaluated Ġin Ġthe Ġorder Ġthey Ġare Ġspecified . ĊĠĠĠĠ Ġ* ĠMatch ing Ġstops Ġon Ġsuccessful Ġmatch Ġif Ġthe Ġ` stop On Match ` Ġproperty Ġis ĊĠĠĠĠ Ġ* Ġ` true ` Ġ( it Ġis Ġfalse Ġby Ġdefault ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlogger Name Ġname Ġof Ġthe Ġlogger ĊĠĠĠĠ Ġ* Ġ@ param Ġlevel Ġlevel Ġat Ġwhich Ġto Ġemit Ġlogs ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġlist Ġof Ġ[ Sink ] s Ġfor Ġthis Ġlogger Ġat Ġthis Ġlevel , Ġwhich Ġmay Ġbe Ġempty ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġsink s For ( logger Name : ĠString , Ġlevel : ĠLevel ): ĠList < Sink > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġkeep Matching Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġsink Names Ġ= ĠK logging Engine . configs () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġconfig Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatches Ġ= Ġconfig . name Matcher ( logger Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( keep Matching Ġ&& Ġmatches ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeep Matching Ġ= Ġkeep Matching Ġ&& Ġ!( matches Ġ&& Ġconfig . stop On Match ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . ranges Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġlevel Ġin Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . sink Names Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠ Ġreturn ĠK logging Engine . sink s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Keys Ġ{ Ġit Ġin Ġsink Names Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . value Ġ} ĊĠĠĠ Ġ} Ċ } Ċ