로그 기록 기능 #5

완료
main
semin.baek 9 months ago
parent d84c499b79
commit 41782ce2cc

@ -22,6 +22,20 @@
"sqlMapperLocations": [ "sqlMapperLocations": [
"D:/projects/bsm-lab/dfx/dfxagent/src/docs/mapper-examples/**/*.xml" "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": { "dropBox": {
"receivedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/received", "receivedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/received",
"processedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/processed", "processedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/processed",

@ -16,6 +16,20 @@
"sqlMapperLocations": [ "sqlMapperLocations": [
"/home/dfxagent/agent/conf/mappers/**/*.xml" "/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": { "dropBox": {
"receivedMessageStorageRoot": "/home/dfxagent/agent/messages/received", "receivedMessageStorageRoot": "/home/dfxagent/agent/messages/received",
"processedMessageStorageRoot": "/home/dfxagent/agent/messages/processed", "processedMessageStorageRoot": "/home/dfxagent/agent/messages/processed",

@ -24,6 +24,20 @@
"sqlMapperLocations": [ "sqlMapperLocations": [
"D:/projects/bsm-lab/dfx/dfxagent/src/docs/mapper-examples/**/*.xml" "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": { "dropBox": {
"receivedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/received", "receivedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/received",
"processedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/processed", "processedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/processed",

@ -22,6 +22,20 @@
"sqlMapperLocations": [ "sqlMapperLocations": [
"/home/dfxagent/agent/conf/mappers/**/*.xml" "/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": { "dropBox": {
"receivedMessageStorageRoot": "/home/dfxagent/agent/messages/received", "receivedMessageStorageRoot": "/home/dfxagent/agent/messages/received",
"processedMessageStorageRoot": "/home/dfxagent/agent/messages/processed", "processedMessageStorageRoot": "/home/dfxagent/agent/messages/processed",

@ -3,6 +3,7 @@ package com.bsmlab.dfx.agent.config;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
import java.util.Map;
@Data @Data
public class AgentConfigDto { public class AgentConfigDto {
@ -14,6 +15,8 @@ public class AgentConfigDto {
private List<String> sqlMapperLocations; private List<String> sqlMapperLocations;
private DropBoxConfig dropBox; private DropBoxConfig dropBox;
private List<Postman> postman; private List<Postman> postman;
private LoggingConfig logging;
// ============================ INNER CLASSES ============================ // ============================ INNER CLASSES ============================
@Data @Data
@ -98,4 +101,14 @@ public class AgentConfigDto {
RECEIVE_FILE 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<Map<String, String>> packages;
}
} }

@ -1,13 +1,25 @@
package com.bsmlab.dfx.agent.config; 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.config.datasource.DynamicDataSourceService;
import com.bsmlab.dfx.agent.task.dropbox.DropBoxTaskExecutorService; import com.bsmlab.dfx.agent.task.dropbox.DropBoxTaskExecutorService;
import com.bsmlab.dfx.agent.task.postman.PostmanSchedulerService; import com.bsmlab.dfx.agent.task.postman.PostmanSchedulerService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
@Slf4j @Slf4j
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
@ -16,24 +28,54 @@ public class BeanInitializer implements SmartInitializingSingleton {
private final DynamicDataSourceService dynamicDataSourceService; private final DynamicDataSourceService dynamicDataSourceService;
private final PostmanSchedulerService postmanSchedulerService; private final PostmanSchedulerService postmanSchedulerService;
private final DropBoxTaskExecutorService dropBoxTaskExecutorService; private final DropBoxTaskExecutorService dropBoxTaskExecutorService;
private final AgentConfigReader agentConfigReader;
@Override @Override
public void afterSingletonsInstantiated() { public void afterSingletonsInstantiated() {
System.out.println("🔥 BeanInitializer afterSingletonsInstantiated() 진입!"); System.out.println("🔥 BeanInitializer afterSingletonsInstantiated() 진입!");
log.info("✅ BeanInitializer 작동 확인"); log.info("✅ BeanInitializer 작동 확인");
/* this.configureLogback();
// 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 쓰레드 생성
*/
private void configureLogback() {
AgentConfigDto agentConfigDto = this.agentConfigReader.getAgentConfigDto();
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
RollingFileAppender<ILoggingEvent> 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<ILoggingEvent> 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<Map<String, String>> packagesListMap = agentConfigDto.getLogging().getPackages();
if(packagesListMap != null) {
for(Map<String, String> 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);
}
}
}
} }
} }

@ -16,6 +16,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -135,14 +136,19 @@ public class DropBoxTaskExecutorService {
RestTemplate restTemplate = new RestTemplate(); RestTemplate restTemplate = new RestTemplate();
AgentConfigDto.KnownAgent knownAgent = agentConfigReader.getKnownAgent(receiveMessageDto.getSenderHostId()); AgentConfigDto.KnownAgent knownAgent = agentConfigReader.getKnownAgent(receiveMessageDto.getSenderHostId());
String url = "http://" + knownAgent.getHostName() + ":" + knownAgent.getListenPort() + "/telegram"; String url = "http://" + knownAgent.getHostName() + ":" + knownAgent.getListenPort() + "/telegram";
String response = restTemplate.postForObject(url, bodyEntity, String.class);
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
AckDto responseAckDto; AckDto responseAckDto;
try { try {
String response = restTemplate.postForObject(url, bodyEntity, String.class);
responseAckDto = objectMapper.readValue(response, AckDto.class); responseAckDto = objectMapper.readValue(response, AckDto.class);
log.info("message processing is done. {}", receiveMessageDto.getMessageUuid()); log.info("message processing is done. {}", receiveMessageDto.getMessageUuid());
log.info("response {}", responseAckDto); 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("Exception after sending ACK. messageUuid: {} ", receiveMessageDto.getMessageUuid());
log.error("{}", e, e); log.error("{}", e, e);
} }

Loading…
Cancel
Save