• 개발환경
  • 실행환경
  • 실행환경 예제
  • 공통컴포넌트
개발환경 실행환경 실행환경 예제 공통컴포넌트
  • 실행환경 소개
  • 공통기반 핵심
  • 공통기반
  • 화면처리
  • 업무처리
  • 데이터처리
  • 연계통합
  • 배치처리
실행환경 소개
  • OverView
공통기반 핵심
    IoC Container
    • Basics
    • Dependencies
    • Bean Scopes
    • Customizing
    • Profiles
    • Inheritance
    • Extension
    • The ApplicationContext
    • Annotation
    • Components Scan
    • JSR 330
    • JavaConfig
    • Environment Abstraction
    • Inversion of Control
    • Generic
    AOP
    • AspectJ
    • AOP XML
    • AOP 가이드라인
  • Resource
  • SpEL
공통기반
    Server Security
    • Server Security Architecture
    • Authentication
    • Authorization
    • 설정 간소화
    • Server Security 업그레이드
  • Session 방식 접근제어
  • Scheduling 서비스
  • Logging
    • Log4j2

        Log4j2

        • Log4j2 코드로 설정
        • Log4j2 파일로 설정
    • SLF4J
  • Id Generation 서비스
  • Property
    • Property Service
    • Property Source
  • Environment
  • Cache
    • EhCache
    • Abstraction
  • Marshalling/Unmarshallig
  • XML Manipulation
  • Object Pooling
  • Crypto
    • 암복호화 서비스
    • Crypto 간소화 서비스
  • FTP
  • Mail 서비스
  • Compress/Decompress
    • 압축 파일의 종류
    File Upload/Download
    • File Upload

        File Upload

        • Multipart
    • File Download

        File Download

        • Tomcat 한글
  • File Handling
  • Excel
  • String Util
화면처리
    Web Servlet
    • MVC
    • DispatcherServlet
    • HandlerMapping
    • Tag Configuration
    • Controller
    • Validation
    Bean Validation
    • View
    • @CommandMap
    Web Reactive
    • Reactive Core
    • DispatcherHandler
    • Annotated Controllers
    • Functional Endpoints
    • WebClient
  • Ajax 지원
  • Internationalization
  • Security
    • Jakarta Commons Validator
    • Validation Rule
  • UI Adaptor
  • UI 비동기요청
  • jQuery Ajax
  • WebSocket
    • STOMP
    • SockJS
  • Bootstrap
  • 모바일 UX/UI
  • JQuery Mobile
업무처리
  • Exception Handling
  • Spring Web Flow
    • SWF Getting Started

        SWF Getting Started

        • Hello world 예제
    • SWF Configuration

        SWF Configuration

        • 시스템 설정
        • MVC 연동
        • Securing Flows
        • Flow Managed Persistence
    • SWF Elements

        SWF Elements

        • Flow 정의
        • Expression Language
        • Rendering View
        • Executing Actions
        • Flow 상속
데이터처리
  • DataSource
  • IBatis
    • iBATIS Configuration
    • Spring-iBATIS Integration
    • Data Type
    • parameterMap
    • Inline Parameters
    • resultMap
    • Dynamic SQL
    MyBatis
    • 주요 변경사항
    • 시작하기
    • Configuration XML
    • Mapper XML Files
  • MyBatis 적용 가이드
  • JPA
    • JPA Repository
    • Query Method
    MongoDB
    • MongoDB support
    • Repositories
    ORM
    • Entities
    • Entity Operation
    • Association Mapping
    • Query Language
    • Native SQL
    • Concurrency
    • Cache Handling
    • Fetch Strategy
    • Spring Integration
    • JPA Configuration
    Transaction
    • Declarative
    • Programmatic
    Reactive
    • R2DBC
    • MongoDB
    • Cassandra
    • Redis
연계통합
  • Naming Service
  • Integration Service
    • Metadata
    • API
  • WebService
  • Restful
  • Cloud Data Stream
  • Swagger
배치처리
    배치 실행환경 소개
    • SQLite
    • Logback logging
    Job
    • Job Variable
    Step
    • Step Variable
  • ItemReader
  • ItemWriter
  • Resource Variable
  • JobRepository
  • JobLauncher
    • Remote JobLauncher
  • JobRunner
  • JobRegistry
  • JobExplorer
  • JobOperator
  • Skip/Retry/Repeat
  • MultiDataProcessing
  • History Management
  • 동기/비동기 처리 예제
  • Listener
  • 병행처리
  • CodeBaseException
  • 센터 컷(CenterCut)
  • 이벤트알림 템플릿 관리
  • Flow Control
페이지보기 페이지편집 문서에 이슈 생성 프로젝트에 이슈 생성

실행환경

    • OverView
      • Basics
      • Dependencies
      • Bean Scopes
      • Customizing
      • Profiles
      • Inheritance
      • Extension
      • The ApplicationContext
      • Annotation
      • Components Scan
      • JSR 330
      • JavaConfig
      • Environment Abstraction
      • Inversion of Control
      • Generic
      • AspectJ
      • AOP XML
      • AOP 가이드라인
    • Resource
    • SpEL
      • Server Security Architecture
      • Authentication
      • Authorization
      • 설정 간소화
      • Server Security 업그레이드
    • Session 방식 접근제어
    • Scheduling 서비스
      • Log4j2
        • Log4j2 코드로 설정
        • Log4j2 파일로 설정
      • SLF4J
    • Id Generation 서비스
      • Property Service
      • Property Source
    • Environment
      • EhCache
      • Abstraction
    • Marshalling/Unmarshallig
    • XML Manipulation
    • Object Pooling
      • 암복호화 서비스
      • Crypto 간소화 서비스
    • FTP
    • Mail 서비스
      • 압축 파일의 종류
      • File Upload
        • Multipart
      • File Download
        • Tomcat 한글
    • File Handling
    • Excel
    • String Util
      • MVC
      • DispatcherServlet
      • HandlerMapping
      • Tag Configuration
      • Controller
      • Validation
      • View
      • @CommandMap
      • Reactive Core
      • DispatcherHandler
      • Annotated Controllers
      • Functional Endpoints
      • WebClient
    • Ajax 지원
    • Internationalization
      • Jakarta Commons Validator
      • Validation Rule
    • UI Adaptor
    • UI 비동기요청
    • jQuery Ajax
      • STOMP
      • SockJS
    • Bootstrap
    • 모바일 UX/UI
    • JQuery Mobile
    • Exception Handling
      • SWF Getting Started
        • Hello world 예제
      • SWF Configuration
        • 시스템 설정
        • MVC 연동
        • Securing Flows
        • Flow Managed Persistence
      • SWF Elements
        • Flow 정의
        • Expression Language
        • Rendering View
        • Executing Actions
        • Flow 상속
    • DataSource
      • iBATIS Configuration
      • Spring-iBATIS Integration
      • Data Type
      • parameterMap
      • Inline Parameters
      • resultMap
      • Dynamic SQL
      • 주요 변경사항
      • 시작하기
      • Configuration XML
      • Mapper XML Files
    • MyBatis 적용 가이드
      • JPA Repository
      • Query Method
      • MongoDB support
      • Repositories
      • Entities
      • Entity Operation
      • Association Mapping
      • Query Language
      • Native SQL
      • Concurrency
      • Cache Handling
      • Fetch Strategy
      • Spring Integration
      • JPA Configuration
      • Declarative
      • Programmatic
      • R2DBC
      • MongoDB
      • Cassandra
      • Redis
    • Naming Service
      • Metadata
      • API
    • WebService
    • Restful
    • Cloud Data Stream
    • Swagger
      • SQLite
      • Logback logging
      • Job Variable
      • Step Variable
    • ItemReader
    • ItemWriter
    • Resource Variable
    • JobRepository
      • Remote JobLauncher
    • JobRunner
    • JobRegistry
    • JobExplorer
    • JobOperator
    • Skip/Retry/Repeat
    • MultiDataProcessing
    • History Management
    • 동기/비동기 처리 예제
    • Listener
    • 병행처리
    • CodeBaseException
    • 센터 컷(CenterCut)
    • 이벤트알림 템플릿 관리
    • Flow Control
  1. Home
  2. 실행환경
  3. 공통기반
  4. Logging
  • 페이지 보기
  • 페이지 편집
  • 문서에 이슈 생성
  • 프로젝트에 이슈 생성

이 페이지의 구성

Log4j2

  • 설명
    • Log4j 2 변경사항
    • Log4j 2 추가기능
    • Migration to Log4j 2 from Log4j 1.x

설명

Log4j 2 변경사항

  • Java 6 이상 필요
  • XML 환경설정 단순화 (Log4j 1.x 와 호환되지 않음)
  • Property 파일을 통한 환경설정을 지원하지 않음
  • JSON을 통한 환경설정 지원
  • 파라미터 방식으로 Log Message 출력
  • 환경설정 변경시 서버 재기동 없이 자동 재호출
  • 필터링 기능 향상
  • NoSQLAppender 등의 다양한 Appender 제공

Log4j 2 추가기능

1. Substituting Parameters

로그 메시지를 구성하는 방법으로, 기존 문자열 결합 방식과 달리 {} 안에 파라미터를 대입하여 로그 메시지를 생성하는 방법이다.
아래 코드는 출력할 로그 메시지를 완성하기 전에 Log Level을 체크하고, isDebugEnabled인 경우에만 메서드를 수행한다.

logger.debug("Logging in user {} with birthday {}", user.getName(), user.getBirthdayCalendar());

2. Formatting Parameters

Substituting Parameters 로깅 방식을 사용하면 코드 내에서 직접 formatting이 가능하다.
이 기능을 사용하려면 getFormatterLogger() 메서드를 통해 Logger 오브젝트를 생성해야 한다.
포맷 변환 문자와 형식은 Java.util.Formatter 클래스를 참조한다.

public static Logger logger = LogManager.getFormatterLogger("egovframework");

logger.debug("Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());
logger.debug("Integer.MAX_VALUE = %,d", Integer.MAX_VALUE);
logger.debug("Long.MAX_VALUE = %,d", Long.MAX_VALUE);

// 출력결과
// User John Smith with birthday 05 23, 1995
// Integer.MAX_VALUE = 2,147,483,647
// Long.MAX_VALUE = 9,223,372,036,854,775,807

3. Flow Tracing

Log4j 2는 trace(), debug(), info() 등과 같은 로깅 메서드 뿐 아니라, 어플리케이션 실행 순서를 좀 더 쉽게 파악할 수 있도록 하는 추가적인 메서드를 제공한다.

메서드기능위치사용
entry()로그의 시작을 표시, 전달된 메서드 파라미터 출력로깅 메서드 시작부분logger.entry() or logger.entry(Object… params)
exit()로그의 끝을 표시, 리턴값 출력return문 or 로깅 메서드 끝부분logger.exit() or logger.exit(Object… result)
throwing()예외나 에러가 발생했을 때, 해당 예외/에러정보를 출력예외발생 시throw logger.throwing(new MyException);
catching()예외을 catch했을 때, 해당 예외정보를 출력catch문logger.catching(e);

이러한 메서드들이 만드는 로깅 이벤트가 기본적인 로깅 이벤트와 분리될 수 있도록 디폴트 Log Level와 Marker가 설정되어 있다.
이에 따라 entry와 exit 메서드는 TRACE 레벨에서만 출력되며 FLOW Marker를 통해 다른 로그 메세지로부터 분리(필터링)할 수 있고,
throwing과 catching 메서드는 ERROR 레벨에서만 출력되며 EXCEPTION Marker를 통해 필터링할 수 있다.

메서드Log LevelMarker
entry()TRACEENTER or FLOW
exit()TRACEEXIT or FLOW
throwing()ERRORTHROWING or EXCEPTION
catching()ERRORCATCHING or EXCEPTION
   public String saveDept(String deptNo) {

     logger.entry(deptNo); // 메서드 시작부분에 명시, 전달받은 파라미터 출력

     Dept dept = service.saveDept(deptNo);

     String nextPg = "redirect:/dept/deptList.do";

     return logger.exit(nextPg); // 메서드 종료부분에 명시, 리턴할 파라미터 출력
   }

   public static void main(String[] args) {
     saveDept("20");

     // 출력결과
     // TRACE saveDept - entry(20)
     // TRACE saveDept - exit(redirect:/dept/deptList.do)
   }

4. Markers

한꺼번에 다량의 로그가 출력되면 어느 위치에서 문제가 발생했는지 정확하게 예측할 수 없다.
또한 Log4j와 같은 Logging Framework를 사용하는 이유는 어플리케이션에서 발생하는 문제를 확인하고 디버깅 하기 위한 것이다.
이는 원하는 시점에서 로그 정보의 필터링이 가능해야함을 뜻한다.

이미 로깅 메서드와 Logger의 Log Level 설정을 통해 출력할 로그를 필터링 할 수 있지만,
Log4j 2에서는 Marker 기능을 통해 좀 더 상세한 필터링을 지원한다. 예를 들어, Flow Tracing 메서드와 기본적인 로깅 이벤트를 분리하고 싶거나, SQL문만 별도로 출력하고 싶은 경우에는 Marker 설정을 통해 기능을 구현할 수 있다.

Marker는 다음과 같은 특징을 갖는다.

  • Marker name은 유일해야 한다.
  • Marker는 final로 선언되어야 하며, 오직 하나의 Parent Marker를 갖는다.
public class MyClass {
  private static final Logger LOGGER = LogManager.getLogger(MyClass.class);

  // Marker name = "SQL"
  private static final Marker SQL_MARKER = MarkerManager.getMarker("SQL");

  // Marker name = "SQL_UPDATE", Parent marker = SQL_MARKER
  private static final Marker UPDATE_MARKER = MarkerManager.getMarker("SQL_UPDATE", SQL_MARKER);

  // Marker name = "SQL_QUERY", Parent marker = SQL_MARKER
  private static final Marker QUERY_MARKER = MarkerManager.getMarker("SQL_QUERY", SQL_MARKER);

  public String doQuery(String table) {

    LOGGER.entry(table);

    LOGGER.debug(QUERY_MARKER, "SELECT * FROM {}", table); // select.log 파일에 출력됨

    return LOGGER.exit();
}

public String doUpdate(String table, Map<String, String> params) {

    LOGGER.entry(table);

    LOGGER.debug(UPDATE_MARKER, "UPDATE {} SET {}", table, formatCols()); // update.log 파일에 출력됨

    return logger.exit();
}
...
<Appenders>
  <File name="fileQuery" fileName="./logs/file/select.log">
    <MarkerFilter marker="SQL_QUERY" onMatch="ACCEPT" onMismatch="DENY" />
    <PatternLayout pattern="%level %m%n" />
  </File>
  <File name="fileUpdate" fileName="./logs/file/update.log">
    <MarkerFilter marker="SQL_UPDATE" onMatch="ACCEPT" onMismatch="DENY" />
    <PatternLayout pattern="%level %m%n" />
  </File>
  ...
</Appenders>
...

참고자료

Flow Tracing
Markers

Migration to Log4j 2 from Log4j 1.x

1. Log4j 2 jar 추가 (log4j-api.jar, log4j-core.jar) + Log4j 1.x jar 제거

<!-- Log4j 1.2 -->
<!--
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2</version>
</dependency>
-->

<!-- Log4j 2 -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>x.x.x</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>x.x.x</version>
</dependency>

2. Log4j 1.x -> Log4j 2 변환 Bridge jar 추가 (log4j-1.2-api.jar)

기존 Log4j 1.x API가 Log4j 2 API로 변환 처리될 수 있도록 Log4j 2 Bridge를 추가한다.

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-1.2-api</artifactId>
  <version>x.x.x</version>
</dependency>

3. Log4j 1.x의 Logger API 변경

Log4j 2의 Logger 객체를 생성할 수 있도록, Logger 생성 메서드를 다음과 같이 변경한다.

Log4j 1.xLog4j 2
Packageorg.apache.log4jorg.apache.logging.log4j
Logger 생성org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger();org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger();

4. Log4j 2 설정 추가 (log4j2.xml)

Log4j 2에서는 설정 태그들이 직관적이고 간단하게 변경되었다. 더 자세한 설명은 Log4j 2 상세 설정 을 참조하도록 한다.

  • Log4j 1.x
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>
  </appender>
  <category name="org.apache.log4j.xml">
    <priority value="info" />
  </category>
  <Root>
    <priority value ="debug" />
    <appender-ref ref="STDOUT" />
  </Root>
</log4j:configuration>
  • Log4j 2
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Logger name="org.apache.log4j.xml" level="info"/>
    <Root level="debug">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
</Configuration>

참고자료

Migration to Log4j 2
Log4j 2 API Documentation
Log4j 2 Implementation Documentation

  • 대표전화  1566-3598 (070-4448-2678)
  • 대표문의메일  egovframesupport@gmail.com
전자정부 표준프레임워크 Git
이용 안내 라이센스

COPYRIGHT (C) 2024 eGovFramework. ALL RIGHTS RESERVED.