fix: SiftingAppender 파일 락 및 on/off 제어 개선

- PatternLayoutEncoder를 buildAppender() 내부에서 appender별 독립 생성 (공유 인스턴스
제거)
   - SiftingAppender timeout 5분으로 단축 (기본 30분)
   - siftAppenderMap으로 appender 직접 관리, closeSiftAppender()로 즉시 파일 핸들 해제
   - siftEnabled 플래그 추가 및 txIdFilter에서 체크 (on/off 제어)
   - doConfigure() 기동 시 DB log.level 값으로 siftEnabled 초기화
   - FileLoggerPropertyChangeListener에서 SIFT log.level 변경 시
setSiftEnabled() 연동
This commit is contained in:
curry772
2026-06-05 14:03:57 +09:00
parent 98cd6198b2
commit 658f2a0485
2 changed files with 56 additions and 25 deletions
@@ -16,15 +16,20 @@ public class FileLoggerPropertyChangeListener implements PropertyChangeListener
PropManager prptManager = PropManager.getInstance(); PropManager prptManager = PropManager.getInstance();
PropGroupVO propGroupVO = (PropGroupVO)evt.getSource(); PropGroupVO propGroupVO = (PropGroupVO)evt.getSource();
String loggerNames = prptManager.getProperty(LogKeys.LOGGER_INFO, LogKeys.LOGGER_LIST); String loggerNames = prptManager.getProperty(LogKeys.LOGGER_INFO, LogKeys.LOGGER_LIST);
if ( loggerNames != null && if ( loggerNames != null &&
loggerNames.contains( propGroupVO.getName() ) ) { loggerNames.contains( propGroupVO.getName() ) ) {
if ( logger.isDebugEnabled() ) { if ( logger.isDebugEnabled() ) {
logger.debug("FileLoggerPropertyChangeListener propertyChange() " + propGroupVO.getName() ); logger.debug("FileLoggerPropertyChangeListener propertyChange() " + propGroupVO.getName() );
} }
Logger.setLoggerLevel(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 @Override
@@ -5,6 +5,7 @@ import java.nio.charset.Charset;
import java.util.HashMap; import java.util.HashMap;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.text.StrSubstitutor; 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.RollingFileAppender;
import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy; import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
import ch.qos.logback.core.sift.AppenderFactory; import ch.qos.logback.core.sift.AppenderFactory;
import ch.qos.logback.core.util.Duration;
import ch.qos.logback.core.util.FileSize; import ch.qos.logback.core.util.FileSize;
import co.elastic.logging.logback.EcsEncoder; import co.elastic.logging.logback.EcsEncoder;
@@ -55,7 +57,10 @@ public class Logger implements LogKeys {
public static String LOGGER_NET; public static String LOGGER_NET;
public static String LOGGER_CLIENT; public static String LOGGER_CLIENT;
public static String LOGGER_SIFT; public static String LOGGER_SIFT;
private static final ConcurrentHashMap<String, RollingFileAppender<ILoggingEvent>> siftAppenderMap = new ConcurrentHashMap<>();
private static volatile boolean siftEnabled = true;
org.slf4j.Logger loggerImpl; org.slf4j.Logger loggerImpl;
// ch.qos.logback.classic.Logger loggerImpl; // ch.qos.logback.classic.Logger loggerImpl;
@@ -796,34 +801,26 @@ public class Logger implements LogKeys {
// GW SIFT Logger // GW SIFT Logger
PatternLayoutEncoder sple = new PatternLayoutEncoder(); final String siftLayout = StringUtils.defaultIfBlank(pmanager.getProperty(APPENDER_SIFT, PATTERN_LAYOUT), defaultLayout);
sple.setContext(lc); final String siftEncoding = pmanager.getProperty(APPENDER_SIFT, ENCODING);
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();
MDCBasedDiscriminator discriminator = new MDCBasedDiscriminator(); MDCBasedDiscriminator discriminator = new MDCBasedDiscriminator();
discriminator.setKey(DISCRIMINATOR); discriminator.setKey(DISCRIMINATOR);
discriminator.setDefaultValue("default"); discriminator.setDefaultValue("default");
discriminator.start(); discriminator.start();
SiftingAppender siftAppender = new SiftingAppender(); SiftingAppender siftAppender = new SiftingAppender();
siftAppender.setContext(lc); siftAppender.setContext(lc);
siftAppender.setName(APPENDER_SIFT); siftAppender.setName(APPENDER_SIFT);
siftAppender.setDiscriminator(discriminator); siftAppender.setDiscriminator(discriminator);
siftAppender.setTimeout(new Duration(60000*5)); // 1분으로 단축 (기본 30분 → 5분)
siftAppender.setAppenderFactory(new AppenderFactory<ILoggingEvent>() { siftAppender.setAppenderFactory(new AppenderFactory<ILoggingEvent>() {
@Override @Override
public FileAppender<ILoggingEvent> buildAppender(Context context, String discriminatingValue) { public FileAppender<ILoggingEvent> buildAppender(Context context, String discriminatingValue) {
String localServer = EAIServerManager.getInstance().getLocalServerName(); String localServer = EAIServerManager.getInstance().getLocalServerName();
String appenderLogDirectory = pmanager.getProperty(APPENDER_SIFT, LOG_DIRECOTRY_PREFIX); String appenderLogDirectory = pmanager.getProperty(APPENDER_SIFT, LOG_DIRECOTRY_PREFIX);
if (StringUtils.isBlank(appenderLogDirectory)) if (StringUtils.isBlank(appenderLogDirectory))
appenderLogDirectory = logDirectory; appenderLogDirectory = logDirectory;
String appenderLogDirectorySub = pmanager.getProperty(APPENDER_SIFT, LOG_DIRECOTRY_SUB); 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); String datePattern = pmanager.getProperty(APPENDER_SIFT, DATE_PATTERN);
if (StringUtils.isBlank(datePattern)) if (StringUtils.isBlank(datePattern))
datePattern = "-%d{yyyy-MM-dd}"; 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; int maxBackupIndex = 0;
try { try {
maxBackupIndex = Integer.parseInt(sMaxBackupIndex); maxBackupIndex = Integer.parseInt(sMaxBackupIndex);
} catch(Exception e) { } catch(Exception e) {
maxBackupIndex = 60; maxBackupIndex = 60;
} }
PatternLayoutEncoder sple = new PatternLayoutEncoder();
sple.setContext(context);
sple.setPattern(siftLayout);
if (StringUtils.isNotBlank(siftEncoding))
sple.setCharset(Charset.forName(siftEncoding));
sple.start();
RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>(); RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>();
rollingFileAppender.setContext(context); rollingFileAppender.setContext(context);
rollingFileAppender.setName("FILE-" + discriminatingValue); rollingFileAppender.setName("FILE-" + discriminatingValue);
rollingFileAppender.setFile(appenderLogDirectory + localServer + File.separator + appenderLogDirectorySub + File.separator + discriminatingValue + ".log"); rollingFileAppender.setFile(appenderLogDirectory + localServer + File.separator + appenderLogDirectorySub + File.separator + discriminatingValue + ".log");
String sMaxFileSize = pmanager.getProperty(APPENDER_SIFT, MAX_FILE_SIZE, "500MB"); String sMaxFileSize = pmanager.getProperty(APPENDER_SIFT, MAX_FILE_SIZE, "500MB");
SizeAndTimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new SizeAndTimeBasedRollingPolicy<>(); SizeAndTimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new SizeAndTimeBasedRollingPolicy<>();
rollingPolicy.setContext(context); rollingPolicy.setContext(context);
rollingPolicy.setFileNamePattern(appenderLogDirectory + localServer + File.separator + appenderLogDirectorySub + File.separator + discriminatingValue + datePattern + ".%i.log"); 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.setRollingPolicy(rollingPolicy);
rollingFileAppender.start(); rollingFileAppender.start();
siftAppenderMap.put(discriminatingValue, rollingFileAppender);
return rollingFileAppender; return rollingFileAppender;
} }
}); });
siftAppender.start(); siftAppender.start();
String logLevel = pmanager.getProperty(LOGGER_SIFT_PREFIX, LOG_LEVEL); String logLevel = pmanager.getProperty(LOGGER_SIFT_PREFIX, LOG_LEVEL);
String aditivity = pmanager.getProperty(LOGGER_SIFT_PREFIX, ADITIVITY); 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); ch.qos.logback.classic.Logger siftLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LOGGER_SIFT);
siftLogger.setLevel(Level.toLevel(logLevel)); siftLogger.setLevel(Level.toLevel(logLevel));
siftLogger.addAppender(siftAppender); siftLogger.addAppender(siftAppender);
@@ -914,6 +920,9 @@ public class Logger implements LogKeys {
ch.qos.logback.core.filter.Filter<ILoggingEvent> txIdFilter = new ch.qos.logback.core.filter.AbstractMatcherFilter<ILoggingEvent>() { ch.qos.logback.core.filter.Filter<ILoggingEvent> txIdFilter = new ch.qos.logback.core.filter.AbstractMatcherFilter<ILoggingEvent>() {
@Override @Override
public ch.qos.logback.core.spi.FilterReply decide(ILoggingEvent event) { 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); String txId = event.getMDCPropertyMap().get(DISCRIMINATOR);
if (org.apache.commons.lang3.StringUtils.isNotBlank(txId) && !"default".equals(txId)) { if (org.apache.commons.lang3.StringUtils.isNotBlank(txId) && !"default".equals(txId)) {
return ch.qos.logback.core.spi.FilterReply.ACCEPT; return ch.qos.logback.core.spi.FilterReply.ACCEPT;
@@ -1147,6 +1156,23 @@ public class Logger implements LogKeys {
// public boolean isFatal() { // public boolean isFatal() {
// return this.loggerImpl.getLevel().toInt()<=Level.ERROR_INT; // 5000 // return this.loggerImpl.getLevel().toInt()<=Level.ERROR_INT; // 5000
// } // }
public static void closeSiftAppender(String discriminatingValue) {
if (StringUtils.isBlank(discriminatingValue) || "default".equals(discriminatingValue)) return;
RollingFileAppender<ILoggingEvent> 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() { public static void stop() {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
lc.stop(); lc.stop();