본문 바로가기

WAS/JBoss&WildFly

log4j 설정 관련 추가 정리

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