рдЬрд╛рд╡рд╛ / рд▓реЙрдЧрдмреИрдХ рдореЗрдВ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд▓реЙрдЧрд┐рдВрдЧ

рдмрд╛рд░реНрдЯ рдХреБрдЫ рд▓реЙрдЧ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИ


рдХрд╛рд░реНрдп


рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


  • рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреА рдЕрдкрдиреА рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рд╣реЛрддреА рд╣реИ,
  • ... рдЖрдкрдХрд╛ рд▓реЙрдЧ рдкреНрд░рд╛рд░реВрдк,
  • ... рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдЗрд╕рдХрд╛ рдиреНрдпреВрдирддрдо рд╕реНрддрд░,
  • рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ % рд╕рд╛рде рд▓реЙрдЧ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ,
  • рдордХреНрдЦреА рдкрд░ рдЗрд╕ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред

рдпрд╣ рдЖрд▓реЗрдЦ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕рд╛рджрдЧреА рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдкреГрдердХреНрдХрд░рдг рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдпреЛрдЧреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ тЖТ тЖТ тЖТ ... рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рдиреАрдЪреЗ рд╣реЛрдЧрд╛ред


рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб


  class ThingService { log = LoggerFactory.getLogger(); getThing() { log.debug("getThing..."); // => one.log } listThings() { log.debug("listThings..."); // => another.log } } 

Logback


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдПрдХ рдареЛрд╕ "рд▓реЙрдЧрдмреИрдХ" рд▓реЙрдЧрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


 ch.qos.logback:logback-classic:1.2.3 

рдЗрд╕реЗ XML рдХреЙрдиреНрдлрд┐рдЧрд░ рдФрд░ рдЬрд╛рд╡рд╛ рд╕реЗ рд╕реАрдзреЗ рджреЛрдиреЛрдВ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдкреНрд░реЛрдЪ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  public void configureLogback() throws JoranException { LoggerContext lc = LoggerFactory.getILoggerFactory(); lc.reset(); // reset prev config JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(lc); configurator.doConfigure("config.xml"); // any data source StatusPrinter.printInCaseOfErrorsOrWarnings(lc); //   : Logger root = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); root.setLevel(Level.INFO); //  } 

рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:


  1. рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЦреАрдВрдЪрддрд╛ рд╣реИ,
  2. рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЙрд╕реЗ рд╕реМрдВрдкреЗ рдЧрдП рдкрд░рд┐рд╢рд┐рд╖реНрдЯреЛрдВ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ,
  3. рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рд╕реЛрдЪрддрд╛ рд╣реИ рдФрд░ рдПрдирдХреЛрдбрд░ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИ,
  4. рдПрдирдХреЛрдбрд░ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ,
  5. рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ % рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддрд╛ % ,
  6. рд╕рдлрд▓рддрд╛ред

рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк XML рдХреЙрдиреНрдлрд┐рдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ / рдПрдирдХреЛрдбрд░ рдмрдирд╛рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реИ - рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЖрдВрддреНрд░ рд╕реЗ рд▓реЙрдЧрдмреИрдХ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓рдЧрднрдЧ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЛ start() рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рд░ рдЙрджрд╛рд╣рд░рдг:


  Logger rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); LoggerContext lc = rootLogger.getLoggerContext(); lc.reset(); // reset prev config var encoder = new PatternLayoutEncoder(); encoder.setContext(lc); encoder.setPattern("%-5level %message%n"); encoder.start(); var appender = new ConsoleAppender<ILoggingEvent>(); appender.setContext(lc); appender.setEncoder(encoder); appender.start(); rootLogger.setLevel(Level.DEBUG); rootLogger.addAppender(appender); 

рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд▓реЙрдЧ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВ


рддрд╛рдХрд┐ рд▓реЙрдЧрдмреИрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХреЗ, рдЙрд╕рдХрд╛ рдирд╛рдо ThreadLocal рдореИрдкреНрдб рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реАрдзреЗ MDC рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдпрд╣ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд╣рдо рдЙрдиреНрд╣реЗрдВ ILoggingEvent.getMDCPropertyMap() рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред


рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдзреНрд╡рдирд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╣реА рд░реВрдк рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдФрд░ рдПрдордбреАрд╕реА рдорд╛рди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рдлреНрд░реЗрдо рдкрд░ рд▓реМрдЯрд╛рдПрдВ, рдЬреЛ рдХрд┐ рдирдП ThreadLocal рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЛрдЬрдирд╛рдмрджреНрдз рдЙрджрд╛рд╣рд░рдг:


  try { MDC.put(MDC_KEY_METHOD, currentMethod); // 1.  currentMethod    // 2.    // 3.       AOP, . } finally { String previousMethod = //     MDC.put(previousMethod); } 

рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреА рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓


рдЖрдЗрдП рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:


  class MultiAppender extends AppenderBase<ILoggingEvent> { @Override protected void append(ILoggingEvent event) { method = event.getMDCPropertyMap().get(MDC_KEY_METHOD); Appender appender = getOrCreateAppender(method); appender.doAppend(event); } 

рд╡рд╣ рдЦреБрдж рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рд╛рдЗрд▓ рдРрдкреЗрдВрдбрд░реНрд╕ рдХреЗ рдПрдХ рдкреИрдХреЗрдЯ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХред рдПрдХ рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛, рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИред "рд░рд┐рдпрд▓" рдПрдкреЗрдВрдбрд░реНрд╕ рдорд╛рдВрдЧ рдкрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:


  fileAppender = new FileAppender<ILoggingEvent>(); fileAppender.setContext(lc); fileAppender.setAppend(false); fileAppender.setEncoder(getOrCreateEncoderByMethod(lc, method)); fileAppender.setFile(logFileByMethod.get(method)); fileAppender.start(); 

рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХрд╛ рдкреНрд░рд╛рд░реВрдк


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Encoder рдкреНрд░рдХрд╛рд░ рдХреА рдСрдЯреЛ-рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдХреИрд╢ рд░рдЦреЗрдВ:


  Map<String, String> patternByMethod = new HashMap<>(); //  ;  Encoder getOrCreateEncoderByMethod(LoggerContext lc, String method) { String pattern = patternByMethod.get(method); encoder = new PatternLayoutEncoder(); encoder.setContext(lc); encoder.setPattern(pattern); encoder.start(); return encoder; } 

рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдЕрдкрдирд╛ рд╕реНрддрд░ рд╣реЛрддрд╛ рд╣реИ


MultiAppender рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: рдпрджрд┐ рдЗрд╡реЗрдВрдЯ рд╕реНрддрд░ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реАрдорд╛ MultiAppender , рддрднреА рд╣рдо рдЗрд╕реЗ рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ:


  Map<String, Level> levelByMethod = new HashMap<>(); protected void append(ILoggingEvent event) { Level minLevel = levelByMethod.get(methodName); if (event.getLevel().levelInt >= minLevel.levelInt) { appender.doAppend(event); } 

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рддрд░реНрдХ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЕрдкрдиреЗ рдЪрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░


рдЕрдкрдиреЗ рдмрдЧреАрдЪреЗ рдХреЛ рдмрд╛рдбрд╝ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рд▓реЙрдЧ-рдмреИрдХ рдХреЗ рд╕рд┐рджреНрдз рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрдирд╡рд░реНрдЯрд░ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рдмрд╛рд╣рд░ рд╕реЗ рддреБрд░рдВрдд рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрджрд┐ рдЖрдкрдХреЛ MDC рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдШрдЯрдирд╛ рд╕реЗ рд▓реЗрдВред %custom рдЪрд░ рд╣реИрдВрдбрд▓рд░ рдпрд╣рд╛рдБ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:


  public class CustomConverter extends ClassicConverter { public String convert(ILoggingEvent event) { // mdc = event.getMDCPropertyMap(); return "variable-expanded"; } } 

рд╕рд╛рдорд╛рдиреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ:


  void configurePatterns(LoggerContext lc) { Map<String, String> rules = lc.getObject(CoreConstants.PATTERN_RULE_REGISTRY); if (rules == null) { rules = new HashMap<String, String>(); lc.putObject(CoreConstants.PATTERN_RULE_REGISTRY, rules); } rules.put("custom", CustomConverter.class.getName()); } 

рдФрд░ рд╣рдо рдПрдХ рдПрдирдХреЛрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, PatternLayoutEncoder , рдЬреЛ рд╕рдм рдХреБрдЫ PatternLayoutEncoder ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, %custom рдЪрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ "variable-expanded" ред


рдордХреНрдЦреА рдкрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдЕрджреНрдпрддрди


рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдПрдХ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рд╣реИ: рдпрд╣ рд╡рд┐рдиреНрдпрд╛рд╕рдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, LoggerContext::reset() рдХрд░рдирд╛ рди LoggerContext::reset() рдФрд░ рд╕рдВрдЪрд┐рдд рдХреИрд╢ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВред


рдмрд╣реБ рд╕реВрддреНрд░рдг


рдпрджрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╡рд┐рдзрд┐ рдЬреАрд╡рди рдореЗрдВ рдирдП рдзрд╛рдЧреЗ рд▓рд╛рддреА рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓реЙрдЧрд┐рдВрдЧ рдирд┐рдпрдо рдЙрди рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ - рдереНрд░реЗрдб рд▓реЛрдХрд▓рд┐рд╕ рдирдП рдзрд╛рдЧреЗ рдореЗрдВ рдЦреБрдж рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╡рд┐рдзрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдПрдХ рдирдИ рд╕реНрдЯреНрд░реАрдо рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ MDC рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


  Map<String, String> mdcOrig = MDC.getCopyOfContextMap(); ExecutorService es = Executors.newFixedThreadPool(1); es.submit(() -> threadWorker(mdcOrig)); void threadWorker(Map<String, String> parentMdc) { MDC.setContextMap(parentMdc); log.error("expected to appear in method2*.log"); } 

рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг


https://github.com/zencd/logback-setup


рд╕рд╛рд╣рд┐рддреНрдп


рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд▓реЙрдЧрдмреИрдХ рдореИрдиреБрдЕрд▓

Source: https://habr.com/ru/post/hi463601/


All Articles