728x90
===
https://dodomain93.tistory.com/45
[JBoss 7.4] serverlog와 log4j 로그 별도 기록
기본적으로 기동 스크립트를 통해 JBoss 인스턴스를 기동하게 되면, nohup 로그 상에 JBoss의 로그와 JBoss에 배포한 애플리케이션의 로그가 같이 찍히게 된다. 고객사가 JBoss의 로그와 애플리케이션
dodomain93.tistory.com
===
과거에 이런 게시글을 작성한 적이 있는데,
실제로는 어떤 설정을 하면 log4j가 먹히는지
조금 궁금해서 테스트 환경을 구성하여 해보았다.
예시는 log4j 라이브러리를 사용하기 위한 테스트 방법이다.
[구성]
화면과 같이,
log4j2.xml과 jboss-deployment-structure.xml과
lib에는 log4j 관련 라이브러리를 위치시켰다.

테스트 용 호출 페이지는 다음과 같다. 사랑해요 GPT
[log4j-test.jsp]
<%@ page import="java.net.URL" %>
<%@ page import="java.security.CodeSource" %>
<%@ page import="org.apache.logging.log4j.LogManager" %>
<%@ page import="org.apache.logging.log4j.Logger" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%!
private String getClassLocation(Class<?> clazz) {
try {
CodeSource cs = clazz.getProtectionDomain().getCodeSource();
if (cs != null && cs.getLocation() != null) {
return cs.getLocation().toString();
}
return "UNKNOWN";
} catch (Exception e) {
return "ERROR: " + e.getMessage();
}
}
private String getClassLoaderInfo(Class<?> clazz) {
try {
ClassLoader cl = clazz.getClassLoader();
return (cl == null) ? "BootstrapClassLoader" : cl.toString();
} catch (Exception e) {
return "ERROR: " + e.getMessage();
}
}
%>
<%
String testMsg = "JBoss application bundled Log4j2 test message. time=" + new java.util.Date();
Logger logger = LogManager.getLogger("AppBundledLog4j2Test");
logger.info(testMsg);
Object ctxObj = LogManager.getContext(false);
Class<?> logManagerClass = org.apache.logging.log4j.LogManager.class;
Class<?> loggerClass = org.apache.logging.log4j.Logger.class;
Class<?> ctxClass = (ctxObj != null) ? ctxObj.getClass() : null;
String logManagerLocation = getClassLocation(logManagerClass);
String loggerLocation = getClassLocation(loggerClass);
String ctxLocation = (ctxClass != null) ? getClassLocation(ctxClass) : "NULL";
String ctxClassLoader = (ctxClass != null) ? getClassLoaderInfo(ctxClass) : "NULL";
boolean isLog4jCoreContext =
(ctxClass != null && "org.apache.logging.log4j.core.LoggerContext".equals(ctxClass.getName()));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Log4j2 Priority Test</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { border-collapse: collapse; width: 100%; margin-top: 15px; }
th, td { border: 1px solid #ccc; padding: 8px; text-align: left; vertical-align: top; }
th { background: #f4f4f4; }
.code { font-family: Consolas, monospace; word-break: break-all; }
.ok { color: green; font-weight: bold; }
.fail { color: red; font-weight: bold; }
</style>
</head>
<body>
<h2>Log4j2 Priority Test</h2>
<p>테스트 메시지: <span class="code"><%= testMsg %></span></p>
<table>
<tr><th>항목</th><th>값</th></tr>
<tr><td>LogManager loaded from</td><td class="code"><%= logManagerLocation %></td></tr>
<tr><td>Logger loaded from</td><td class="code"><%= loggerLocation %></td></tr>
<tr><td>Context actual class</td><td class="code"><%= (ctxClass != null ? ctxClass.getName() : "NULL") %></td></tr>
<tr><td>Context loaded from</td><td class="code"><%= ctxLocation %></td></tr>
<tr><td>Context classloader</td><td class="code"><%= ctxClassLoader %></td></tr>
<tr>
<td>판정</td>
<td>
<% if (isLog4jCoreContext) { %>
<span class="ok">애플리케이션의 log4j-core LoggerContext 사용 가능</span>
<% } else { %>
<span class="fail">JBoss / 서버 로깅 구현체가 사용 중일 가능성 높음</span>
<% } %>
</td>
</tr>
</table>
</body>
</html>
log4j2.xml 내용은 아래와 같다.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" name="AppLog4j2Config">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %c - %msg%n"/>
</Console>
<File name="FileAppender" fileName="/sw/domains/node11/logs/app-log4j2-test.log" append="true">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %c - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Logger name="AppBundledLog4j2Test" level="info" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileAppender"/>
</Logger>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="FileAppender"/>
</Root>
</Loggers>
</Configuration>
jboss-deployment-structure.xml은 아래와 같다.
[app@test11 WEB-INF]$ cat jboss-deployment-structure.xml
<jboss-deployment-structure>
<deployment>
</deployment>
</jboss-deployment-structure>
현상
Add Logging Api Dependencies -> true
Use Deployment Logging Config -> true

Case 1.
Add Logging Api Dependencies -> false
Use Deployment Logging Config -> true

Case 2.
Add Logging Api Dependencies -> true
Use Deployment Logging Config -> false

Case 3.
Add Logging Api Dependencies -> false
Use Deployment Logging Config -> false

Case 4.
Add Logging Api Dependencies -> true
Use Deployment Logging Config -> true
jboss-deployment-structure.xml
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.apache.log4j" />
<module name="org.jboss.logmanager.log4j"/>
<module name="org.apache.logging.log4j.core" />
<module name="org.jboss.logmanager.log4j" />
</exclusions>
</deployment>
</jboss-deployment-structure>

Case 5.
Add Logging Api Dependencies -> true
Use Deployment Logging Config -> true
jboss-deployment-structure.xml
<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="logging"/>
</exclude-subsystems>
</deployment>
</jboss-deployment-structure>

'WAS > JBoss&WildFly' 카테고리의 다른 글
| jboss - cubrid 연동 (0) | 2026.04.03 |
|---|---|
| jboss-deployment-structure.xml <exclusions> 사용 해보기 (1) | 2026.03.24 |
| http method 제한 (0) | 2026.03.16 |
| Session Timeout 설정 (0) | 2026.03.16 |
| wildfly23 - postgresql 13 연동 (1) | 2026.03.12 |