Spring, Springboot LogBack 설정 LogBack in xml, Java
이번에는 spring에서 logBack을 설정하는 방법을 포스팅 하게 되었습니다.
먼저 설정에 앞서 xml또는 Java의 두 가지의 버전이 있습니다.
XML로 설정하는 방법 또는 Java로 설정하는 방법을 예시와 함께 설명 드리겠습니다.
먼저 XML로 설정하는 방법을 보면 아래 코드와 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 콘솔 로그 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 파일 생성 -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/log.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/log.%d{yyyy-mm-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- Keep 30 days worth of logs -->
</rollingPolicy>
<!--<append>true</append>-->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 패키징 log -->
<logger name="com.*" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<!-- SQL Log -->
<logger name="jdbc.sqlonly" level="DEBUG">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.sqltiming" level="INFO">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.resultset" level="OFF">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.audit" level="OFF">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.resultsettable" level="INFO">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="jdbc.connection" level="OFF">
<appender-ref ref="CONSOLE" />
</logger>
<!-- logger level -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
console 로그 설정과 DB 로그 설정 또는 Log파일 생성 등 설정 정보가 있습니다.
xml 파일을 연결시켜 줍니다. yml 또는 properties (예시의 경우 properties )
# logBack
logging.config=classpath:templates/logback.xml
추가로 SQL Log를 남기고 싶다면,
의존성을 추가 합니다.
/* SQL log */
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
이후 log4jdbc.log4j2.properties 파일을 생성하여
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
위와 같이 셋팅 해 줍니다.
디비 커넥션 정보가 있는 곳에서 DB 정보를 수정 해 줍니다.
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:sqlserver://localhost:1433;databaseName=DB;encrypt=true;trustServerCertificate=true
spring.datasource.username=username
spring.datasource.password=password
결과:
IDE console
log 파일
로그가 console또는 Log 파일에서 잘 확인 되는 것을 알 수 있습니다.
Java로 구현한 버전은 다음과 같습니다.
먼저 @Configuration할 class 하나와 메소드 @Bean을 생성 합니다.(@Bean 어노테이션이 들어간 method는 void를 사용할 수 없습니다. (반환 타입 필수 입니다.) 아래 코드는 예시 임을 참고 해 주시면 감사드리겠습니다.)
@Configuration
public class LogBackConfig {
@Bean
public void configureLogback() {
}
}
@Bean 메소드 안에 Log에 적용할 패키지 경로 및 추가적으로 필요한 설정을 추가 해 줍니다.
@Bean
public void configureLogback() {
Logger rootLogger = (Logger) LoggerFactory.getLogger("com.*");
// Set log level
rootLogger.setAdditive(false);
rootLogger.setLevel(Level.DEBUG);
// DB Logger SET
Logger sqlonly = (Logger) LoggerFactory.getLogger("jdbc.sqlonly");
sqlonly.setLevel(Level.DEBUG);
Logger sqltiming = (Logger) LoggerFactory.getLogger("jdbc.sqltiming");
sqltiming.setLevel(Level.INFO);
Logger resultset = (Logger) LoggerFactory.getLogger("jdbc.resultset");
resultset.setLevel(Level.OFF);
Logger audit = (Logger) LoggerFactory.getLogger("jdbc.audit");
audit.setLevel(Level.OFF);
Logger resultsettable = (Logger) LoggerFactory.getLogger("jdbc.resultsettable");
resultsettable.setLevel(Level.INFO);
Logger connection = (Logger) LoggerFactory.getLogger("jdbc.connection");
connection.setLevel(Level.OFF);
}
@Bean configureLogback()에서
loggerContext를 선언하여 LoggerFactory를 담아 줍니다.
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
그 다음 console, File, FileRollingPolicy, patternEncoder를 추가 한 후, root log에 append 해 줍니다.
// 콘솔
ConsoleAppender consoleAppender = new ConsoleAppender();
consoleAppender.setContext(loggerContext);
consoleAppender.setName("CONSOLE");
// 파일
FileAppender fileAppender = new FileAppender();
fileAppender.setContext(loggerContext);
fileAppender.setName("FILE");
fileAppender.setFile("logs/log-"+date+".log");
TimeBasedRollingPolicy rollingPolicy = new TimeBasedRollingPolicy();
rollingPolicy.setContext(loggerContext);
rollingPolicy.setParent(fileAppender); // rollingFileAppender
rollingPolicy.setFileNamePattern("logs/log.%d{yyyy-MM-dd}.%i.log");
rollingPolicy.setMaxHistory(30);
rollingPolicy.setTotalSizeCap(FileSize.valueOf("100MB"));
// log 패턴 인코딩
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
// %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
encoder.setPattern("%date %-5level [%thread] %logger{35} - %msg%n");
encoder.start();
// 콘솔
consoleAppender.setEncoder(encoder);
consoleAppender.start();
// 파일
fileAppender.setEncoder(encoder);
fileAppender.start();
// root log append
rootLogger.addAppender(fileAppender);
rootLogger.addAppender(consoleAppender);
DB Log 설정, 필요시 append 합니다.
// DB Logger SET
sqlonly.addAppender(consoleAppender);
sqltiming.addAppender(consoleAppender);
resultset.addAppender(consoleAppender);
audit.addAppender(consoleAppender);
resultsettable.addAppender(consoleAppender);
connection.addAppender(consoleAppender);
sqlonly.addAppender(fileAppender);
sqltiming.addAppender(fileAppender);
resultset.addAppender(fileAppender);
audit.addAppender(fileAppender);
resultsettable.addAppender(fileAppender);
connection.addAppender(fileAppender);
결과 예시는 xml 결과의 사진과 같습니다.
코드 간소화 정리 버전 sql (x) console과 log file 설정
@Configuration
@Primary
public class LogBackConfig {
@Value("${spring.log.path}")
private String logPath;
@Bean
public LoggerContext loggerContext() {
return (LoggerContext) LoggerFactory.getILoggerFactory();
}
@Bean
public PatternLayoutEncoder patternLayoutEncoder(LoggerContext loggerContext) {
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
return encoder;
}
@Bean
public ConsoleAppender consoleAppender(LoggerContext loggerContext, PatternLayoutEncoder encoder) {
ConsoleAppender consoleAppender = new ConsoleAppender();
consoleAppender.setContext(loggerContext);
consoleAppender.setName("CONSOLE");
consoleAppender.setEncoder(encoder);
consoleAppender.start();
ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(consoleAppender);
return consoleAppender;
}
@Bean
public FileAppender fileAppender(LoggerContext loggerContext, PatternLayoutEncoder encoder) {
FileAppender fileAppender = new FileAppender();
fileAppender.setContext(loggerContext);
fileAppender.setName("FILE");
fileAppender.setFile(logPath+"log-"+ StringUtils.getYYYYMMDD()+".log"); // Set the path for the log file
fileAppender.setEncoder(encoder);
fileAppender.start();
ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(fileAppender);
return fileAppender;
}
}