LANGUAGE/Java & Groovy 2018. 1. 31. 23:32

!markdown


# Java


### Logback (로그백)


Java프로젝트에서 Log를 다루기 위해 `Logback 라이브러리`를 쓰는데, 일반적으로 logback.xml 파일로 로그설정을 다루곤한다. 


`runtime중`에 원하는 대로 다룰 수 있을까 싶어서 온갖 문서와 예제를 뒤져보고 테스트해 봤는데 


Logback은 정말 유연하다.


만들었던 소스 예제를 정리겸 공유하자 :D




### Groovy Source


Groovy 소스이지만, Java User라면 비슷하기에 금방 파악하실 수 있을 것이라 생각됩니다 ㅎㅎ




### Example) Change logger level on runtime (실행중에 Logger Level 변경하기)


```java

String loggerLevel = "debug";

Level changeLevel = Level.valueOf(loggerLevel);


//변경할 로거리스트

List<String> userControlLoggerList = ['com.meta', 'com.datastreams', 'com.ibatis', 'org.mybatis']


//로거컨텍스트

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();


//로거리스트에 있는 것만 변경

userControlLoggerList.each{ loggerNameToChange ->

    Logger loggerToChange = loggerContext.getLogger(loggerNameToChange);

    loggerToChange.setLevel(changeLevel);

}

```



### Example) Controller on Spring (Spring에서 로그레벨 변경가능한 Controller 만들기)


- groovy 소스


```java

@Controller

@RequestMapping("/log/control/*")

public class MaintenanceController {


private org.slf4j.Logger logger = LoggerFactory.getLogger(getClass())


List<String> userControlLoggerList = ['com.meta', 'com.datastreams', 'com.ibatis', 'org.mybatis']


/*************************

* Logger Level 변경

*************************/

@RequestMapping("level")

@ResponseBody

boolean changeLoggerLevel(String loggerLevel){

//- Logger

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory()

List<Logger> loggerList = loggerContext.getLoggerList().findAll{ loggerElement -> userControlLoggerList.contains(loggerElement.name) }

Level changeLevel = Level.valueOf(loggerLevel)

loggerList.each{ loggerElement ->

loggerElement.level = changeLevel

logger.info("[Change Logger Level] ${loggerElement.name} was set to ${loggerElement.level}")

}

return true

}


}

```