package Ġk multi . logging Ċ Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . Print Stream Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ /** Ċ Ġ* Ġ@ author ĠAndrew ĠB is sell Ċ Ġ*/ Ċ Ċ private Ġval Ġtop Level Logger Ġ= Ġtop Level Logger Ġ{} Ċ Ċ class ĠJ vm Log gers Test Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠComp anion Logger () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcompanion Object Field Logger Ġ= Ġcompanion Logger Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠNested Class Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ: ĠComp anion Logger () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcompanion Object Field Logger Ġ= Ġcompanion Logger Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġclass Str Ġ= Ġthis :: class . toString (). trim Class Str () ĊĊĠĠĠĠĠĠĠ Ġfun Ġinherited Error ( msg : Ġ() Ġ-> ĠAny ?) Ġ= Ġlogger . error Ġ{ Ġmsg () Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġfield Error ( msg : Ġ() Ġ-> ĠAny ?) Ġ= Ġcompanion Object Field Logger . error Ġ{ Ġmsg () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġverify Logger Prefixes () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPrint Ġsome Ġoutput Ġfrom Ġthe Ġvarious Ġlog gers Ġto Ġstderr Ġ( via Ġs lf 4 j - simple ), Ġand Ġcapture ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġa ĠPrint Stream ĊĠĠĠĠĠĠĠ Ġval Ġba os Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġps Ġ= ĠPrint Stream ( ba os ) ĊĠĠĠĠĠĠĠ Ġval Ġold Err Ġ= ĠSystem . err ĊĠĠĠĠĠĠĠ ĠSystem . set Err ( ps ) ĊĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" inherited Ġlogger Ġon Ġmain Ġcompanion Ġobject " Ġ} ĊĠĠĠĠĠĠĠ Ġcompanion Object Field Logger . error Ġ{ Ġ" field Ġlogger Ġon Ġmain Ġcompanion Ġobject " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnested Ġ= ĠNested Class () ĊĠĠĠĠĠĠĠ Ġnested . inherited Error Ġ{ Ġ" inherited Ġlogger Ġon Ġnested Ġclass Ġcompanion Ġobject " Ġ} ĊĠĠĠĠĠĠĠ Ġnested . field Error Ġ{ Ġ" field Ġlogger Ġon Ġnested Ġclass Ġcompanion Ġobject " Ġ} ĊĠĠĠĠĠĠĠ Ġtop Level Logger . error Ġ{ Ġ" top Ġlevel " Ġ} ĊĠĠĠĠĠĠĠ ĠSystem . err . flush () ĊĠĠĠĠĠĠĠ ĠSystem . set Err ( old Err ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠValidate Ġthat Ġthe Ġlog Ġmessage Ġprefixes Ġsent Ġto Ġstderr Ġmatch Ġthe Ġexpected ĊĠĠĠĠĠĠĠ Ġval Ġmain Class Str Ġ= Ġthis :: class . toString (). trim Class Str () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Str s Ġ= Ġba os . toString (). lines () ĊĠĠĠĠĠĠĠ ĠassertEquals ( getLogger Prefix ( output Str s [ 0 ]), Ġmain Class Str ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( getLogger Prefix ( output Str s [ 1 ]), Ġmain Class Str ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( getLogger Prefix ( output Str s [ 2 ]), Ġnested . class Str ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( getLogger Prefix ( output Str s [ 3 ]), Ġnested . class Str ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( getLogger Prefix ( output Str s [ 4 ]), Ġmain Class Str ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġfun Ġget Logger Prefix ( msg : ĠString ): ĠString Ġ= ĊĠĠĠ Ġmsg . substring Before Last (" Ġ- Ġ") ĊĠĠĠĠĠĠĠ Ġ. substring After Last (" ERROR Ġ") Ċ Ċ private Ġfun ĠString . trim Class Str () Ġ= Ġthis ĊĠĠĠ Ġ. remove Prefix (" class Ġ") ĊĠĠĠ Ġ. remove Suffix (" Ġ( Kotlin Ġreflection Ġis Ġnot Ġavailable )") Ċ