From 541166dc35814eea8bad72498cc5c07fd13f167a Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Thu, 8 Dec 2022 17:45:39 +0800 Subject: [PATCH] added LoggerController class --- .../net/woggioni/jwo/LoggerController.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/net/woggioni/jwo/LoggerController.java diff --git a/src/main/java/net/woggioni/jwo/LoggerController.java b/src/main/java/net/woggioni/jwo/LoggerController.java new file mode 100644 index 0000000..67ae666 --- /dev/null +++ b/src/main/java/net/woggioni/jwo/LoggerController.java @@ -0,0 +1,60 @@ +package net.woggioni.jwo; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.event.LoggingEvent; +import org.slf4j.event.SubstituteLoggingEvent; +import org.slf4j.helpers.SubstituteLogger; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LoggerController { + + private static final Object lock = new Object(); + + private static boolean initialized = false; + private static final Queue eventQueue = new LinkedBlockingQueue<>(); + private static final List substituteLoggers = new ArrayList<>(); + + public static Logger lazyLogger(String className) { + synchronized (lock) { + Logger result; + if (initialized) { + result = LoggerFactory.getLogger(className); + } else { + SubstituteLogger substituteLogger = new SubstituteLogger(className, eventQueue, false); + substituteLoggers.add(substituteLogger); + result = substituteLogger; + } + return result; + } + } + + public static Logger lazyLogger(Class cls) { + return lazyLogger(cls.getName()); + } + + public static void initializeLoggers() { + synchronized (lock) { + SubstituteLogger firstLogger = null; + for (SubstituteLogger log : substituteLoggers) { + if (firstLogger == null) firstLogger = log; + Logger realLogger = LoggerFactory.getLogger(log.getName()); + log.setDelegate(realLogger); + } + if (firstLogger != null) { + for (LoggingEvent evt : eventQueue) { + firstLogger.log(evt); + } + } + initialized = true; + } + } +} +