
рдХрд╛рд░реНрдп
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
- рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреА рдЕрдкрдиреА рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рд╣реЛрддреА рд╣реИ,
- ... рдЖрдкрдХрд╛ рд▓реЙрдЧ рдкреНрд░рд╛рд░реВрдк,
- ... рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдЗрд╕рдХрд╛ рдиреНрдпреВрдирддрдо рд╕реНрддрд░,
- рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ
%
рд╕рд╛рде рд▓реЙрдЧ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, - рдордХреНрдЦреА рдкрд░ рдЗрд╕ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
рдпрд╣ рдЖрд▓реЗрдЦ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕рд╛рджрдЧреА рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдкреГрдердХреНрдХрд░рдг рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдпреЛрдЧреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ
тЖТ
тЖТ
тЖТ
... рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рдиреАрдЪреЗ рд╣реЛрдЧрд╛ред
рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб
class ThingService { log = LoggerFactory.getLogger(); getThing() { log.debug("getThing...");
Logback
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдПрдХ рдареЛрд╕ "рд▓реЙрдЧрдмреИрдХ" рд▓реЙрдЧрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
ch.qos.logback:logback-classic:1.2.3
рдЗрд╕реЗ XML рдХреЙрдиреНрдлрд┐рдЧрд░ рдФрд░ рдЬрд╛рд╡рд╛ рд╕реЗ рд╕реАрдзреЗ рджреЛрдиреЛрдВ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдкреНрд░реЛрдЪ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
public void configureLogback() throws JoranException { LoggerContext lc = LoggerFactory.getILoggerFactory(); lc.reset();
рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:
- рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЦреАрдВрдЪрддрд╛ рд╣реИ,
- рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдЙрд╕реЗ рд╕реМрдВрдкреЗ рдЧрдП рдкрд░рд┐рд╢рд┐рд╖реНрдЯреЛрдВ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ,
- рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рд╕реЛрдЪрддрд╛ рд╣реИ рдФрд░ рдПрдирдХреЛрдбрд░ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИ,
- рдПрдирдХреЛрдбрд░ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ,
- рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ
%
рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддрд╛ %
, - рд╕рдлрд▓рддрд╛ред
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк XML рдХреЙрдиреНрдлрд┐рдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ / рдПрдирдХреЛрдбрд░ рдмрдирд╛рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реИ - рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЖрдВрддреНрд░ рд╕реЗ рд▓реЙрдЧрдмреИрдХ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓рдЧрднрдЧ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЛ start()
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рд░ рдЙрджрд╛рд╣рд░рдг:
Logger rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); LoggerContext lc = rootLogger.getLoggerContext(); lc.reset();
рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рд▓реЙрдЧ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВ
рддрд╛рдХрд┐ рд▓реЙрдЧрдмреИрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХреЗ, рдЙрд╕рдХрд╛ рдирд╛рдо ThreadLocal
рдореИрдкреНрдб рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реАрдзреЗ MDC
рд╡рд░реНрдЧ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдпрд╣ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд╣рдо рдЙрдиреНрд╣реЗрдВ ILoggingEvent.getMDCPropertyMap()
рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдзреНрд╡рдирд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╣реА рд░реВрдк рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдФрд░ рдПрдордбреАрд╕реА рдорд╛рди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рдлреНрд░реЗрдо рдкрд░ рд▓реМрдЯрд╛рдПрдВ, рдЬреЛ рдХрд┐ рдирдП ThreadLocal
рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЛрдЬрдирд╛рдмрджреНрдз рдЙрджрд╛рд╣рд░рдг:
try { MDC.put(MDC_KEY_METHOD, currentMethod);
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреА рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓
рдЖрдЗрдП рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:
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<>();
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛ рдЕрдкрдирд╛ рд╕реНрддрд░ рд╣реЛрддрд╛ рд╣реИ
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) {
рд╕рд╛рдорд╛рдиреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ:
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
рд╕рд╛рд╣рд┐рддреНрдп
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд▓реЙрдЧрдмреИрдХ рдореИрдиреБрдЕрд▓