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:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user