diff --git a/src/docs/settings-examples/dfxagent-bd-test-cubrid-local.json b/src/docs/settings-examples/dfxagent-bd-test-cubrid-local.json index ce98daa..5637d12 100644 --- a/src/docs/settings-examples/dfxagent-bd-test-cubrid-local.json +++ b/src/docs/settings-examples/dfxagent-bd-test-cubrid-local.json @@ -22,6 +22,20 @@ "sqlMapperLocations": [ "D:/projects/bsm-lab/dfx/dfxagent/src/docs/mapper-examples/**/*.xml" ], + "logging": { + "logDirectory": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/logs", + "logFileName": "dfxagent.log", + "logName": "DFX_LOG", + "maxHistory": 30, + "logPattern": "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n", + "rootLogLevel": "DEBUG", + "packages": [ + { + "com.bsmlab.dfx.agent": "DEBUG", + "jdbc.sqlonly": "DEBUG" + } + ] + }, "dropBox": { "receivedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/received", "processedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/processed", diff --git a/src/docs/settings-examples/dfxagent-bd-test-cubrid.json b/src/docs/settings-examples/dfxagent-bd-test-cubrid.json index db4275a..8a42839 100644 --- a/src/docs/settings-examples/dfxagent-bd-test-cubrid.json +++ b/src/docs/settings-examples/dfxagent-bd-test-cubrid.json @@ -16,6 +16,20 @@ "sqlMapperLocations": [ "/home/dfxagent/agent/conf/mappers/**/*.xml" ], + "logging": { + "logDirectory": "/home/dfxagent/agent/logs", + "logFileName": "dfxagent.log", + "logName": "DFX_LOG", + "maxHistory": 30, + "logPattern": "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n", + "rootLogLevel": "DEBUG", + "packages": [ + { + "com.bsmlab.dfx.agent": "DEBUG", + "jdbc.sqlonly": "DEBUG" + } + ] + }, "dropBox": { "receivedMessageStorageRoot": "/home/dfxagent/agent/messages/received", "processedMessageStorageRoot": "/home/dfxagent/agent/messages/processed", diff --git a/src/docs/settings-examples/dfxagent-bd-test-oracle-local.json b/src/docs/settings-examples/dfxagent-bd-test-oracle-local.json index 7539892..c23173c 100644 --- a/src/docs/settings-examples/dfxagent-bd-test-oracle-local.json +++ b/src/docs/settings-examples/dfxagent-bd-test-oracle-local.json @@ -24,6 +24,20 @@ "sqlMapperLocations": [ "D:/projects/bsm-lab/dfx/dfxagent/src/docs/mapper-examples/**/*.xml" ], + "logging": { + "logDirectory": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/logs", + "logFileName": "dfxagent.log", + "logName": "DFX_LOG", + "maxHistory": 30, + "logPattern": "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n", + "rootLogLevel": "DEBUG", + "packages": [ + { + "com.bsmlab.dfx.agent": "DEBUG", + "jdbc.sqlonly": "DEBUG" + } + ] + }, "dropBox": { "receivedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/received", "processedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/processed", diff --git a/src/docs/settings-examples/dfxagent-bd-test-oracle.json b/src/docs/settings-examples/dfxagent-bd-test-oracle.json index 78de84c..f4f9e62 100644 --- a/src/docs/settings-examples/dfxagent-bd-test-oracle.json +++ b/src/docs/settings-examples/dfxagent-bd-test-oracle.json @@ -22,6 +22,20 @@ "sqlMapperLocations": [ "/home/dfxagent/agent/conf/mappers/**/*.xml" ], + "logging": { + "logDirectory": "/home/dfxagent/agent/logs", + "logFileName": "dfxagent.log", + "logName": "DFX_LOG", + "maxHistory": 30, + "logPattern": "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n", + "rootLogLevel": "DEBUG", + "packages": [ + { + "com.bsmlab.dfx.agent": "DEBUG", + "jdbc.sqlonly": "DEBUG" + } + ] + }, "dropBox": { "receivedMessageStorageRoot": "/home/dfxagent/agent/messages/received", "processedMessageStorageRoot": "/home/dfxagent/agent/messages/processed", diff --git a/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigDto.java b/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigDto.java index df5b4cb..50eca7c 100644 --- a/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigDto.java +++ b/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigDto.java @@ -3,6 +3,7 @@ package com.bsmlab.dfx.agent.config; import lombok.Data; import java.util.List; +import java.util.Map; @Data public class AgentConfigDto { @@ -14,6 +15,8 @@ public class AgentConfigDto { private List sqlMapperLocations; private DropBoxConfig dropBox; private List postman; + private LoggingConfig logging; + // ============================ INNER CLASSES ============================ @Data @@ -98,4 +101,14 @@ public class AgentConfigDto { RECEIVE_FILE } + @Data + public static class LoggingConfig { + private String logDirectory; + private String logFileName; + private String logName; + private int maxHistory; + private String logPattern; + private String rootLogLevel; + private List> packages; + } } diff --git a/src/main/java/com/bsmlab/dfx/agent/config/BeanInitializer.java b/src/main/java/com/bsmlab/dfx/agent/config/BeanInitializer.java index ef08172..39bb63b 100644 --- a/src/main/java/com/bsmlab/dfx/agent/config/BeanInitializer.java +++ b/src/main/java/com/bsmlab/dfx/agent/config/BeanInitializer.java @@ -1,13 +1,25 @@ package com.bsmlab.dfx.agent.config; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.encoder.PatternLayoutEncoder; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.rolling.RollingFileAppender; +import ch.qos.logback.core.rolling.TimeBasedRollingPolicy; import com.bsmlab.dfx.agent.config.datasource.DynamicDataSourceService; import com.bsmlab.dfx.agent.task.dropbox.DropBoxTaskExecutorService; import com.bsmlab.dfx.agent.task.postman.PostmanSchedulerService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.stereotype.Component; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; + @Slf4j @Component @RequiredArgsConstructor @@ -16,24 +28,54 @@ public class BeanInitializer implements SmartInitializingSingleton { private final DynamicDataSourceService dynamicDataSourceService; private final PostmanSchedulerService postmanSchedulerService; private final DropBoxTaskExecutorService dropBoxTaskExecutorService; + private final AgentConfigReader agentConfigReader; @Override public void afterSingletonsInstantiated() { System.out.println("πŸ”₯ BeanInitializer afterSingletonsInstantiated() μ§„μž…!"); log.info("βœ… BeanInitializer μž‘λ™ 확인"); - /* - // DfxAgentConfiguration μ—μ„œ μƒμ„±ν•œ 빈 쀑 DataSource κ΄€λ ¨ 섀정을 λ§ˆλ¬΄λ¦¬ν•œλ‹€. - dynamicDataSourceService.setSqlSessionFactoryMap(dfxAgentConfiguration.getTemporarySqlSessionFactoryMap()); - dynamicDataSourceService.setTransactionManagerMap(dfxAgentConfiguration.getTemporaryTransactionManagerMap()); - - // PostmanSchedulerService, DropBoxTaskExecutorService λŠ” @RequiredArgsConstructor 이기 λ•Œλ¬Έμ— μžλ™μœΌλ‘œ injection λœλ‹€ - // κ·Έ ν›„ @PostConstruct 둜직이 싀행될 것이닀. - log.debug("BeanInitializer afterSingletonsInstantiated [run]"); - log.debug("{} ready", postmanSchedulerService.getClass().getName()); - log.debug("{} ready", dropBoxTaskExecutorService.getClass().getName()); - //TODO 4. Worker μ“°λ ˆλ“œ 생성 - - */ + this.configureLogback(); + } + private void configureLogback() { + AgentConfigDto agentConfigDto = this.agentConfigReader.getAgentConfigDto(); + LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); + RollingFileAppender appender = new RollingFileAppender<>(); + appender.setContext(loggerContext); + appender.setName(agentConfigDto.getLogging().getLogName()); + String logFilePath = Paths.get(agentConfigDto.getLogging().getLogDirectory(), agentConfigDto.getLogging().getLogFileName()).toString(); + appender.setFile(logFilePath); + TimeBasedRollingPolicy rollingPolicy = new TimeBasedRollingPolicy<>(); + rollingPolicy.setContext(loggerContext); + rollingPolicy.setParent(appender); + rollingPolicy.setFileNamePattern(logFilePath + ".%d{yyyy-MM-dd}.gz"); + rollingPolicy.setMaxHistory(agentConfigDto.getLogging().getMaxHistory()); + rollingPolicy.setCleanHistoryOnStart(true); + rollingPolicy.start(); + PatternLayoutEncoder encoder = new PatternLayoutEncoder(); + encoder.setContext(loggerContext); + encoder.setPattern(agentConfigDto.getLogging().getLogPattern()); + encoder.start(); + appender.setEncoder(encoder); + appender.setRollingPolicy(rollingPolicy); + appender.start(); + Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); + Level logLevel = Level.toLevel(agentConfigDto.getLogging().getRootLogLevel()); + rootLogger.setLevel(logLevel); + rootLogger.detachAndStopAllAppenders(); + rootLogger.addAppender(appender); + List> packagesListMap = agentConfigDto.getLogging().getPackages(); + if(packagesListMap != null) { + for(Map packagesMap : packagesListMap) { + for(String packageName : packagesMap.keySet()) { + Level packageLogLevel = Level.toLevel(packagesMap.get(packageName)); + Logger logger = loggerContext.getLogger(packageName); + logger.setLevel(packageLogLevel); + logger.setAdditive(false); // λΆ€λͺ¨ 둜그 λ°©μ§€ + logger.detachAndStopAllAppenders(); + logger.addAppender(appender); + } + } + } } } diff --git a/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxTaskExecutorService.java b/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxTaskExecutorService.java index 7279320..bc96b67 100644 --- a/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxTaskExecutorService.java +++ b/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxTaskExecutorService.java @@ -16,6 +16,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; import java.io.FileInputStream; @@ -135,14 +136,19 @@ public class DropBoxTaskExecutorService { RestTemplate restTemplate = new RestTemplate(); AgentConfigDto.KnownAgent knownAgent = agentConfigReader.getKnownAgent(receiveMessageDto.getSenderHostId()); String url = "http://" + knownAgent.getHostName() + ":" + knownAgent.getListenPort() + "/telegram"; - String response = restTemplate.postForObject(url, bodyEntity, String.class); ObjectMapper objectMapper = new ObjectMapper(); AckDto responseAckDto; try { + String response = restTemplate.postForObject(url, bodyEntity, String.class); responseAckDto = objectMapper.readValue(response, AckDto.class); log.info("message processing is done. {}", receiveMessageDto.getMessageUuid()); log.info("response {}", responseAckDto); - } catch (JsonProcessingException e) { + } + catch (ResourceAccessException e) { + log.error("Exception on sending ACK for dropbox process result. messageUuid: {}, Sending URL: {}", receiveMessageDto.getMessageUuid(), url); + log.error("{}", e, e); + } + catch (JsonProcessingException e) { log.error("Exception after sending ACK. messageUuid: {} ", receiveMessageDto.getMessageUuid()); log.error("{}", e, e); }