From 658f2a048534ea8003817a2ac81d9614182fa473 Mon Sep 17 00:00:00 2001 From: curry772 Date: Fri, 5 Jun 2026 14:03:57 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20SiftingAppender=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=9D=BD=20=EB=B0=8F=20on/off=20=EC=A0=9C=EC=96=B4=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PatternLayoutEncoder를 buildAppender() 내부에서 appender별 독립 생성 (공유 인스턴스 제거) - SiftingAppender timeout 5분으로 단축 (기본 30분) - siftAppenderMap으로 appender 직접 관리, closeSiftAppender()로 즉시 파일 핸들 해제 - siftEnabled 플래그 추가 및 txIdFilter에서 체크 (on/off 제어) - doConfigure() 기동 시 DB log.level 값으로 siftEnabled 초기화 - FileLoggerPropertyChangeListener에서 SIFT log.level 변경 시 setSiftEnabled() 연동 --- .../FileLoggerPropertyChangeListener.java | 13 ++-- .../com/eactive/eai/common/util/Logger.java | 68 +++++++++++++------ 2 files changed, 56 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/eactive/eai/common/property/FileLoggerPropertyChangeListener.java b/src/main/java/com/eactive/eai/common/property/FileLoggerPropertyChangeListener.java index b3d4db9..037a366 100644 --- a/src/main/java/com/eactive/eai/common/property/FileLoggerPropertyChangeListener.java +++ b/src/main/java/com/eactive/eai/common/property/FileLoggerPropertyChangeListener.java @@ -16,15 +16,20 @@ public class FileLoggerPropertyChangeListener implements PropertyChangeListener PropManager prptManager = PropManager.getInstance(); PropGroupVO propGroupVO = (PropGroupVO)evt.getSource(); String loggerNames = prptManager.getProperty(LogKeys.LOGGER_INFO, LogKeys.LOGGER_LIST); - - if ( loggerNames != null && + + if ( loggerNames != null && loggerNames.contains( propGroupVO.getName() ) ) { - + if ( logger.isDebugEnabled() ) { - logger.debug("FileLoggerPropertyChangeListener propertyChange() " + propGroupVO.getName() ); + logger.debug("FileLoggerPropertyChangeListener propertyChange() " + propGroupVO.getName() ); } Logger.setLoggerLevel(propGroupVO.getName()); } + + if ( LogKeys.LOGGER_SIFT_PREFIX.equals(propGroupVO.getName()) ) { + String logLevel = prptManager.getProperty(LogKeys.LOGGER_SIFT_PREFIX, LogKeys.LOG_LEVEL); + Logger.setSiftEnabled( !"off".equalsIgnoreCase(logLevel) ); + } } @Override diff --git a/src/main/java/com/eactive/eai/common/util/Logger.java b/src/main/java/com/eactive/eai/common/util/Logger.java index 4c34d00..2474d43 100644 --- a/src/main/java/com/eactive/eai/common/util/Logger.java +++ b/src/main/java/com/eactive/eai/common/util/Logger.java @@ -5,6 +5,7 @@ import java.nio.charset.Charset; import java.util.HashMap; import java.util.Hashtable; import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.StrSubstitutor; @@ -29,6 +30,7 @@ import ch.qos.logback.core.FileAppender; import ch.qos.logback.core.rolling.RollingFileAppender; import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy; import ch.qos.logback.core.sift.AppenderFactory; +import ch.qos.logback.core.util.Duration; import ch.qos.logback.core.util.FileSize; import co.elastic.logging.logback.EcsEncoder; @@ -55,7 +57,10 @@ public class Logger implements LogKeys { public static String LOGGER_NET; public static String LOGGER_CLIENT; public static String LOGGER_SIFT; - + + private static final ConcurrentHashMap> siftAppenderMap = new ConcurrentHashMap<>(); + private static volatile boolean siftEnabled = true; + org.slf4j.Logger loggerImpl; // ch.qos.logback.classic.Logger loggerImpl; @@ -796,34 +801,26 @@ public class Logger implements LogKeys { // GW SIFT Logger - PatternLayoutEncoder sple = new PatternLayoutEncoder(); - sple.setContext(lc); - String appenderLayout = pmanager.getProperty(APPENDER_SIFT, PATTERN_LAYOUT); - if (StringUtils.isBlank(appenderLayout)) - sple.setPattern(defaultLayout); - else - sple.setPattern(appenderLayout); - String encoding = pmanager.getProperty(APPENDER_SIFT, ENCODING); - if (StringUtils.isNotBlank(encoding)) - sple.setCharset(Charset.forName(encoding)); - sple.start(); + final String siftLayout = StringUtils.defaultIfBlank(pmanager.getProperty(APPENDER_SIFT, PATTERN_LAYOUT), defaultLayout); + final String siftEncoding = pmanager.getProperty(APPENDER_SIFT, ENCODING); MDCBasedDiscriminator discriminator = new MDCBasedDiscriminator(); discriminator.setKey(DISCRIMINATOR); discriminator.setDefaultValue("default"); discriminator.start(); - + SiftingAppender siftAppender = new SiftingAppender(); siftAppender.setContext(lc); siftAppender.setName(APPENDER_SIFT); siftAppender.setDiscriminator(discriminator); + siftAppender.setTimeout(new Duration(60000*5)); // 1분으로 단축 (기본 30분 → 5분) siftAppender.setAppenderFactory(new AppenderFactory() { @Override public FileAppender buildAppender(Context context, String discriminatingValue) { String localServer = EAIServerManager.getInstance().getLocalServerName(); String appenderLogDirectory = pmanager.getProperty(APPENDER_SIFT, LOG_DIRECOTRY_PREFIX); - if (StringUtils.isBlank(appenderLogDirectory)) + if (StringUtils.isBlank(appenderLogDirectory)) appenderLogDirectory = logDirectory; String appenderLogDirectorySub = pmanager.getProperty(APPENDER_SIFT, LOG_DIRECOTRY_SUB); @@ -833,22 +830,29 @@ public class Logger implements LogKeys { String datePattern = pmanager.getProperty(APPENDER_SIFT, DATE_PATTERN); if (StringUtils.isBlank(datePattern)) datePattern = "-%d{yyyy-MM-dd}"; - - String sMaxBackupIndex = pmanager.getProperty(APPENDER_SIFT,MAX_BACKUP_INDEX); + + String sMaxBackupIndex = pmanager.getProperty(APPENDER_SIFT, MAX_BACKUP_INDEX); int maxBackupIndex = 0; try { maxBackupIndex = Integer.parseInt(sMaxBackupIndex); } catch(Exception e) { maxBackupIndex = 60; } - + + PatternLayoutEncoder sple = new PatternLayoutEncoder(); + sple.setContext(context); + sple.setPattern(siftLayout); + if (StringUtils.isNotBlank(siftEncoding)) + sple.setCharset(Charset.forName(siftEncoding)); + sple.start(); + RollingFileAppender rollingFileAppender = new RollingFileAppender<>(); rollingFileAppender.setContext(context); rollingFileAppender.setName("FILE-" + discriminatingValue); rollingFileAppender.setFile(appenderLogDirectory + localServer + File.separator + appenderLogDirectorySub + File.separator + discriminatingValue + ".log"); - + String sMaxFileSize = pmanager.getProperty(APPENDER_SIFT, MAX_FILE_SIZE, "500MB"); - + SizeAndTimeBasedRollingPolicy rollingPolicy = new SizeAndTimeBasedRollingPolicy<>(); rollingPolicy.setContext(context); rollingPolicy.setFileNamePattern(appenderLogDirectory + localServer + File.separator + appenderLogDirectorySub + File.separator + discriminatingValue + datePattern + ".%i.log"); @@ -865,15 +869,17 @@ public class Logger implements LogKeys { rollingFileAppender.setRollingPolicy(rollingPolicy); rollingFileAppender.start(); + siftAppenderMap.put(discriminatingValue, rollingFileAppender); return rollingFileAppender; } }); siftAppender.start(); - + String logLevel = pmanager.getProperty(LOGGER_SIFT_PREFIX, LOG_LEVEL); String aditivity = pmanager.getProperty(LOGGER_SIFT_PREFIX, ADITIVITY); - + siftEnabled = !"off".equalsIgnoreCase(logLevel); + ch.qos.logback.classic.Logger siftLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LOGGER_SIFT); siftLogger.setLevel(Level.toLevel(logLevel)); siftLogger.addAppender(siftAppender); @@ -914,6 +920,9 @@ public class Logger implements LogKeys { ch.qos.logback.core.filter.Filter txIdFilter = new ch.qos.logback.core.filter.AbstractMatcherFilter() { @Override public ch.qos.logback.core.spi.FilterReply decide(ILoggingEvent event) { + if (!siftEnabled) { + return ch.qos.logback.core.spi.FilterReply.DENY; + } String txId = event.getMDCPropertyMap().get(DISCRIMINATOR); if (org.apache.commons.lang3.StringUtils.isNotBlank(txId) && !"default".equals(txId)) { return ch.qos.logback.core.spi.FilterReply.ACCEPT; @@ -1147,6 +1156,23 @@ public class Logger implements LogKeys { // public boolean isFatal() { // return this.loggerImpl.getLevel().toInt()<=Level.ERROR_INT; // 5000 // } + public static void closeSiftAppender(String discriminatingValue) { + if (StringUtils.isBlank(discriminatingValue) || "default".equals(discriminatingValue)) return; + RollingFileAppender appender = siftAppenderMap.remove(discriminatingValue); + if (appender != null && appender.isStarted()) { + appender.stop(); + } + } + + public static void setSiftEnabled(boolean enabled) { + siftEnabled = enabled; + System.out.println("@ SiftAppender " + (enabled ? "enabled" : "disabled")); + } + + public static boolean isSiftEnabled() { + return siftEnabled; + } + public static void stop() { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); lc.stop();