CLV Logging lib

Proč?

  • chceme aby aplikační logy obsahovaly data pro rekonstrukci flow
  • nechceme aby každá druhá metoda v kódu vypadala takto
...
public String doSmtg(String input) {

  log.info("method a trying to do b with params c..");
  
  var result = doIt();
  
  log.info("method a will return b..");
    
  return result;
}
...

Proč?

  • chceme aby aplikační logy obsahovaly data pro rekonstrukci flow
  • nechceme aby každá druhá metoda v kódu vypadala takto
...
public String doSmtg(String input) {
  
  var start = Timer.now();
  log.info("method a trying to do b with params c..");
  
  var result = doIt();
  
  var end = Timer.end()
  log.info("method a will return b.. in: " + end-start + "ms");
    
  return result;
}
...

Proč?

  • chceme aby aplikační logy obsahovaly data pro rekonstrukci flow
  • nechceme aby každá druhá metoda v kódu vypadala takto
...
public String doSmtg(String input) {
  
  var start = Timer.now();
  var parametersDescription = describe(input)
  log.info("method a trying to do b with params " 
           + parametersDescription + "..");
  
  var result = doIt();
  
  var resultDescription = describe(result)
  var end = Timer.end()
  log.info("method a will return "+ resultDescription + ".. in: "
           + end-start + "ms");
    
  return result;
}
...

Proč?

  • chceme aby aplikační logy obsahovaly data pro rekonstrukci flow
  • nechceme aby každá druhá metoda v kódu vypadala takto
...
public String doSmtg(String input) {
  
  var start = Timer.now();
  var parametersDescription = describe(input)
  log.info("method a trying to do b with params " 
           + parametersDescription + "..");
  
  var result = doIt();
  
  var resultDescription = describe(result)
  var end = Timer.end()
  log.info("method a will return "+ resultDescription + ".. in: "
           + end-start + "ms");
    
  return result;
}
...

Na co?

  • snadné odlogování business flow
  • konsistentní logování

Na co ne!!

  • není určeno k nahrazení ERROR, WARN logů
  • nemá sloužit ani jako DEBUG logy

Jak?

@Log

Jak?

  • @Log
    • nad class - aplikuje se na všechny metody*
    • nad metodou - aplikuje se na metodu*

 

  • loguje na začátku metody

         metoda X spuštěna s parametry Y.

  • loguje na konci metody
       
    metoda X skončila s návratem Y v čase Z.

 

  • loguje pomocí slf4j, implementace se použije dle zvolené implementaci v aplikace kde se knihovna použije

AOP

  • Aspekty - umožňují "pověsit" kus kódu na definované místo
public class TestService {

  public String method(String input) {

    return "result";
  }
}
public class Aspect {

  public String doIt(Origin originExecution) {
		
    log.info("log me");
    return originExecution.execute();
  }
}

AOP

  • Aspekty - umožňují "pověsit" kus kódu na definované místo
public class TestService {
  
  @Log
  public String method(String input) {

    return "result";
  }
}
public class Aspect {

  @"Pověs toto nad metodu která má na sobě @Log"
  public String doIt(Origin originExecution) {
		
    log.info("log me");
    return originExecution.execute();
  }
}

AOP

  • Aspekty - umožňují "pověsit" kus kódu na definované místo
public class TestService {
  
  @Log
  public String method(String input) {

    log.info("log me");
    return "result";
  }
}

AOP

  • Jak se tam ten kód dostane?

JWM

CLASS

COMPILED

CLASS

OBJ. INSTANCE

  • runtime
  • (post)compile time
  • load time

AOP

JWM

CLASS

COMPILED

CLASS

OBJ. INSTANCE

                                                                                          PROXY

  • Jak se tam ten kód dostane?
  • runtime
  • compile time
  • load time

AOP

JWM

CLASS

COMPILED

CLASS

OBJ. INSTANCE

                                                       INJECT CODE WHILE CLASS LOADING

  • Jak se tam ten kód dostane?
  • runtime
  • compile time
  • load time

AOP

JWM

CLASS

COMPILED

CLASS

OBJ. INSTANCE

  • Jak se tam ten kód dostane?
  • runtime
  • compile time
  • load time

INJECT CODE WHILE OR AFTER CLASS COMPILATION

AOP

  • Omezení ?
  • runtime - proxy -> veškerá omezení která z toho plynou:
    • jen public metody
    • ignoruje inner volání
  • load time - použije "agenta" pro úpravu kódu
    • agent se musí přidat na classPath při runnu
  • compile time - kód je upraven hned při kompilaci
    • někdy je třeba zvolit post-compileTime (hlavně když je více úprav..např. lombok)
  • java compiler "-parameters" - zapne debug symboly a umožní tak použít real jména parametrů

Spring Boot

  • je to spring boot componenta s auto konfigurací
    • po přidání závislosti se při povolení auto konfigurace @EnableAutoConfiguration automaticky aspect vytvoří a je k dispozici

Knihovna

  • @Log
  • Aspect - LoggingAspect
  • Logger - holder pro aplikační logger 
  • Descriptory - definice formátů message pro různé datové typy
    • jak fungují
    • jak se vyhodnocují
    • jak se definují

Pozor descriptory pracují s předanými daty a pokud imlementujete vlastní MUSÍTE hlídat že data která chcete nejsou null atd..

CLV logging lib

By Jiří Čížek

CLV logging lib

  • 113