로그 기록 기능 #5

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

@ -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",

@ -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",

@ -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",

@ -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",

@ -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<String> sqlMapperLocations;
private DropBoxConfig dropBox;
private List<Postman> 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<Map<String, String>> packages;
}
}

@ -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<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.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);
}

Loading…
Cancel
Save