개요
log4j2를 사용하면서 특정 로그만 특정 파일로 분리하고 싶었습니다. 기본적으로는 패키지 단위로 설정 가능하지만, 동일 패키지 내에서도 기본 로그와 특정 로그로 분리해서 동작하게 하고 싶었습니다.
기존에 한 번 해본 경험이 있는 작업이었는데, 어렵지 않아서 별도로 기록하지는 않았었습니다. 그런데, 오랜만에 다시 쓸 일이 있어서 했더니 생각지 못한 부분에서 시간이 허비해버렸습니다. 다시 시간낭비 하지 않도록 기재합니다.
예제코드
</ExampleProject/src/main/resources/log4j2.xml>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitoringInterval="30" shutdownHook="disable">
<Properties>
<Property name="basic_format">[%d{yyyy-MM-dd HH:mm:ss}][%5p][%c %L] %m%n</Property>
<Property name="basic_dir">/DEV/PRJ/webapp/example/logs/</Property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="${basic_format}" />
</Console>
<!-- <분리로그어펜더> -->
<RollingFile name="TmpLogFileAppender" append="true"
ignoreExceptions="false"
>
<FileName>${basic_dir}/example-tmp.log</FileName>
<FilePattern>${basic_dir}/backup_logs/example-tmp-%d{yyyyMMdd}.log.zip</FilePattern>
<PatternLayout pattern="${basic_format}" />
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
</Policies>
</RollingFile>
<!-- </분리로그어펜더> -->
</Appenders>
<Loggers>
<!-- <분리로그> -->
<Logger name="TmpLog-com.cafe24.twilightsh.standardexample.log.ExampleLogController" level="INFO" additivity="false"><AppenderRef ref="TmpLogFileAppender" /></Logger>
<!-- </분리로그> -->
<Root level="INFO">
<AppenderRef ref="console" />
</Root>
</Loggers>
</Configuration>
<ExampleLogController.java>
@Controller
public class ExampleLogController {
/**
* 로그설정.
*/
protected Log log = LogFactory.getLog(this.getClass());
/**
* 임시로그설정.
*/
protected Log tmpLog = LogFactory.getLog("TmpLog-"+this.getClass().getName());
…생략…
@RequestMapping(value = "/example/log/writeExampleLog.do")
public ModelAndView writeExampleLog(final HttpServletRequest request, final ModelMap model) {
final String pattern = "yyMMddHHmmss";
final String logKeyForm = "[LogKey:" + DateFormatUtils.format(new Date(), pattern) + Integer.toHexString(new Random().nextInt(255)) + "]";
try {
// <분리로그>임시로그
if (tmpLog.isInfoEnabled()) {
tmpLog.info(logKeyForm + "로그남기기");
}
// </분리로그>
final JSONObject responseBody = new JSONObject();
responseBody.put("resultCd", "SUCCESS");
return responseBody.toString();
} catch (final Throwable t) {
final String commonMsg = "예제API로그 생성 실패.";
throw new RuntimeException(
logKeyForm + commonMsg
, t);
}
}
}
해설
어펜더를 사용하여 로그 분리
기본 로그파일 외에 별도의 로그파일을 생성하기 위해 Java 파일 내에서 Log를 2개 선언했습니다.
|
log는 일반적으로 선언하는 평범한 방식으로 선언했지만, tmpLog는 접두어"TmpLog-"를 붙여주었습니다. 이 분리된 tmp로그객체를 위해 xml 파일 내에서는 의 name 속성을 선언할 때 접두어"TmpLog-"를 붙여주었습니다.
<Logger name="TmpLog-com.cafe24.twilightsh.standardexample.log.ExampleLogController" level="INFO" additivity="false"><AppenderRef ref="TmpLogFileAppender" /></Logger>
name="TmpLog-com.cafe24.twilightsh.standardexample.log.ExampleLogController"에서 접두어"TmpLog-"를 붙여서 로그 남길 클래스명을 기재했습니다.
‘ <AppenderRef ref="TmpLogFileAppender" /> ’로 설정했으므로 ‘ <Appenders> ’에서 ‘name="TmpLogFileAppender"’인 어펜더를 사용합니다.
분리된 로그파일 설정
이 분리된 로그파일 어펜더(‘name="TmpLogFileAppender"’)를 이용해 일별로 로그파일을 남기고자 했습니다.
<RollingFile name="TmpLogFileAppender" append="true"
ignoreExceptions="false"
>
<FileName>${basic_dir}/example-tmp.log</FileName>
<FilePattern>${basic_dir}/backup_logs/example-tmp-%d{yyyyMMdd}.log.zip</FilePattern>
<PatternLayout pattern="${basic_format}" />
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
</Policies>
</RollingFile>
이를 위해 다음 3가지 설정을 했습니다.
- 어펜더 종류는 ‘RollingFile’
- ‘ <TimeBasedTriggeringPolicy interval="1" modulate="true" /> ’ 정책
- 로그파일 패턴을 일별설정인 ‘%d{yyyyMMdd}’. 이는 하루가 바뀔 때마다 날짜로 백업파일이 생성됨을 의미합니다.(‘/example-tmp.log’는 오늘(현재) 파일 이름)
주의점
name="TmpLog-com.cafe24.twilightsh.standardexample.log.ExampleLogController"에서 접두어"TmpLog-"를 제외한 나머지 부분은 정확한 팩키지 또는 클래스명이어야 합니다. 정확한 이름이 아니면 로그가 기록되지 않습니다.
참고자료
- 일별 로그 설정방법은 Copilot에 ‘log4j2 일별 로그’로 조회하여 나온 방법을 사용했습니다.
'컴 이것저것 > Java' 카테고리의 다른 글
파일 전송 시 boundary -httpClient (0) | 2024.09.03 |
---|---|
<Spring> Scheduler (0) | 2022.11.28 |
javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (1) | 2022.08.29 |
Spring -ErrorPage[3] -@ControllerAdvice (0) | 2022.08.04 |
Spring -ErrorPage[2] -ExceptionResolver (0) | 2022.08.03 |