🐯
경민민 IT 핸드북
  • Orientation
    • 전달사항
    • 복습방법
    • 수료한 선배의 한마디
    • 간단 자기소개
    • 스터디
  • 백엔드
    • Java
      • 1장 프로그래밍 기초
      • 2장 자바 메모리구조
        • 1. Stack
        • 2. Heap
      • 6장 객체
      • 8장 상속
      • 9장 다형성
      • 10장 추상클래스와 인터페이스
      • 13장 Generic
      • 14장 Thread
      • 15장 Network
      • 16장 Lamda
        • 1. 내부 클래스 (Inner Class)
          • DTO , VO, Builder Pattern
        • 2. 람다 표현식 (Lambda Expression)
        • 3. 스트림 API (Stream API)
          • Optional
      • 17장 Enum
  • 프론트
    • Node.js
    • Java Script
      • ES6+
        • Node.js로 자바스크립트 실행
        • let , const , var
        • Destructuring문법
          • Rest(...) 문법
        • Arrow Function
        • 모듈
        • ETC
    • Type Script
      • 개요
      • TS설치 및 환경설정
      • 타입스크립트 기본
        • 기본 자료형들과 타입추론
        • Object, Array , Tuple
        • Any, Unknown, Union Type
        • Function Type
          • Type Assertion && Narrowing
          • Never type
        • Type Aliases와 Interface
        • 리터럴 타입
        • 함수 추가 문법
        • Class문법
        • 객체 타입 추가 문법
        • 실습문제 1차
        • 실습문제 2차
        • 실습문제 3차
    • React
      • 개요
      • SPA 와 MPA
        • SEO(작성예정)
      • 리액트 프로젝트 생성(18.3.1.ver)
        • HTML + react 샘플
        • CRA 와 Vite 비교
      • 리액트 개념들
        • Component
          • 클래스 컴포넌트(작성예정)
          • 함수형 컴포넌트(작성예정)
        • JSX
        • React Virtual Dom
          • Reconciliation
        • hook
          • useState
        • 리액트 데이터 전달
          • FLUX
      • 백엔드 서버 연동
        • 비동기요청
        • 웹소켓
        • Promise(작성예정)
      • 실습문제 1
      • 실습문제 2
      • 실습문제3
      • 실습문제4
  • 프레임워크
    • Spring
      • Spring 개발환경 구축
        • 프로젝트 환경설정
        • 프로젝트 생성
          • MVC Project 생성이슈
        • Maven 설정
        • web.xml 설정
        • Spring Bean Configuration.xml 설정
      • Spring Legacy Project
        • Spring 요청 및 응답 흐름
        • Spring 주요 Annotation
          • 의존성 주입방식의 차이점
          • @ModelAttribute와 유효성검사
          • 비동기처리
          • 스프링 예외처리
        • Logging
        • Pagination
        • Spring File 업로드 및 다운로드
        • Spring WebSocket
        • Spring AOP
      • Spring 라이브러리들(작성예정)
        • Lombok
        • Maven
        • MyBatis
      • Spring 구성 모듈(작성예정)
      • 스프링 과제
    • Spring Boot
      • Spring Boot 개발환경 구축
      • 스프링 부트 프로젝트 생성방법들
        • 프로젝트에서 사용하는 의존성들
      • 스프링 프로젝트 구조
        • SpringBootApplication
      • application.properties
      • Cross Origin
        • CORS
      • WebSocket
        • Stomp(작성중)
      • 로그인(작성중)
      • Spring Security(작성중)
      • 실습문제 Select
      • 실습문제 Update
      • 실습문제 Delete
  • 형상관리(Git)
    • GitHub설정
    • SourceTree를 활용한 깃허브 연동
      • 소스트리 설치
      • Clone
      • Branch
        • Branch Protection rules
          • Branch Protection Rules 상세규칙
        • Rebase 와 Squash (작성예정)
      • Team Project 설정
        • 팀장 프로젝트 셋팅
          • Collaborator
          • .gitignore 설정
        • 팀원 프로젝트 셋팅
        • 공통 프로젝트 진행
  • 프로젝트
    • 진행순서
      • 요구사항 분석 단계
        • 유용한 사이트
      • 프로그램 설계 단계
        • 유용한 사이트
      • 프로그램 구현단계
        • SourceTree를 활용한 Team Project설정
      • 테스트 단계
  • 배포
    • AWS-EC2 배포 연습
    • DevOps
      • IT시스템의 변화와 DevOps
      • DevOps 라이프사이클
    • 젠킨스
      • 도커
        • 도커 설치 방법
        • 도커 기본 명령어들
      • 젠킨스 설치
      • 젠킨스 프로젝트 생성
      • 젠킨스 소스코드 통합 - Github
      • 젠킨스 빌드 설정 - Maven
      • 배포 서버 구축하기
      • 파이프라인 구축
      • AWS 서버 생성
        • AWS 인스턴스 생성
        • AWS - Zenkins 연동
        • AWS - 배포서버 연동
        • AWS - Jenkins CI/CD파이프라인 구축
  • 유용한 사이트 모음
  • SQL
    • SQLD
      • 데이터 모델링의 이해 - 스키마
      • 데이터 모델링의 이해 - ERD
      • 데이터 모델링의 이해 - 정규화
      • 데이터 모델링의 이해 - NULL
      • SQL 기본 및 활용 - WINDOW FUNCTION
    • Oracle
      • 1장 개요
      • 2장 SQL
  • LLM 서비스
    • 1장 LLM에 대한 이해
    • 2장 프롬프트 엔지니어링
      • 프롬프트와 프롬프트 엔지니어링
      • GPT PlayGround
      • 프롬프트 작문 유형
      • 기본 프롬프트 엔지니어링 태크닉
      • 고급 프롬프트 엔지니어링 태크닉
        • ReAct Prompting
        • Active-Prompt
        • Reflexion
        • Graph Prompt
      • OpenAI API설정
      • OpenAI를 활용한 프롬프트 엔지니어링 실습
        • 실습 프롬프트
    • 3장 Lang Chain 프레임워크
      • LangSmith 프레임워크
        • LangSmith를 활용한 LangChain 모니터링 설정
      • LangChain 실습 1 - Prompt
        • 실습 코드
      • LangChain 실습 2 - LLM 캐시와 메모리
    • 4장 RAG
      • Document Loader - 문서 로더
      • Text Splitter - 텍스트 분할
      • Embedding - 임베딩
      • Vector Store - 벡터 저장소
      • Retriever - 검색기
      • ReRanker - 재평가자
      • RAG
Powered by GitBook
On this page
  • Intro
  • Slf4j
  • Slf4j에 필요한 의존성
  • Slf4j 사용방법
  • Logger 객체 추가
  • Logging Level과 Loggin용 메서드
  • log4j의 태그들 분석
  • appender
  • logger
  • root
  • 로그정보 파일로 기록하기
  • Daily Rolling FileAppender
  • 설정방법
  1. 프레임워크
  2. Spring
  3. Spring Legacy Project

Logging

Intro

  • Log란 클라이언트의 요청정보, 응답정보, 에러가 발생했을때의 상황 등 서버의 역할로 어플리케이션을 개발 및 운영할때 발생하는 모든 상황에 대한 기록(log)행위를 의미한다.

  • 개발자는 이러한 다양한 운영상의 Log정보를 통해 에러를 처리하고 서비스를 개선할 수 있으므로 Log를 기록하고 분석하는 행위는 정말 중요하다고 볼 수 있다.

  • 이러한 중요성 때문에 Log를 관리하는 프레임워크는 굉장히 다양하지만, Spring Framework에서는 각종 log 프레임워크를 통합하여 관리하는 Slf4j모듈을 제공한다

Slf4j

  • SLF4J(Simple Logging Facade For Java) : 자바를 위한 간단한 로깅 추상체,

  • 자바에는 로깅을 위한 다양한 라이브러리가 준비되어 있으나 스프링에서는 각 모듈을 통합하여 SLF4J한개의 모듈로만 개발이 가능하도록 구성되어 있다.

  • Slf4j방식으로 코드를 구현하면 실제로 배포될때는 의존성에 추가한 로깅프레임워크의 코드로 배포되어 작동한다

Slf4j에 필요한 의존성

  • MVC프로젝트 생성시 기본 로깅 의존성들이 자동으로 설치가 되어 있다.

  • 필요하다면 properties에서 버전정보만 간단하게 수정하여 사용하면 된다.

  • slf4j는 기본 로깅 프레임워크로 log4j를 사용한다.

<!-- Logging -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>${org.slf4j-version}</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>${org.slf4j-version}</version>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
	<version>${org.slf4j-version}</version>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.15</version>
	<exclusions>
		<exclusion>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
		</exclusion>
		<exclusion>
			<groupId>javax.jms</groupId>
			<artifactId>jms</artifactId>
		</exclusion>
		<exclusion>
			<groupId>com.sun.jdmk</groupId>
			<artifactId>jmxtools</artifactId>
		</exclusion>
		<exclusion>
			<groupId>com.sun.jmx</groupId>
			<artifactId>jmxri</artifactId>
		</exclusion>
	</exclusions>
	<scope>runtime</scope>
</dependency>

Slf4j 사용방법

Logger 객체 추가

  • Google을 통해 log4j사용방법을 검색해보면 아래와 같은 객체생성 방법을 통해 Logger객체를 만들고 log출력 메서드를 호출하는 것을 확인해 볼 수 있다.

import org.slf4j.Logger; // 굉장히 많은 클래스가 있지만 통합모듈인 slf4j.Logger선택
import org.slf4j.LoggerFactory; // 마찬가지로 slf4j로 임포트

private Logger logger = Logger.getLogger(LogTest.class);
  • 위 코드의 경우 직접 Logger객체를 생성하고 사용할 클래스를 선택해야 하는 번거로움이 존재한다. 이를 편리하게 만든게 Lombok의 @Slf4j 어노테이션이다

@Slf4j // lombok에서 제공하는 어노테이션
public class LogTest {
    
    public void method1 (){
        // @Slf4j  어노테이션 추가시 보이지 않는 log필드가 자동으로 추가된다.
        // private Logger log = Logger.getLogger(LogTest.class);    
        log.info("정보성   메세지"출력);
    }
    
      public void method2 (){
        log.info("정보성   메세지"출력);
    }
}

Logging Level과 Loggin용 메서드

  • slf4j에서는 정보를 단순히 출력하는 기능 뿐만 아니라 로그의 레벨을 여러 등급으로 나눠서 상황에 맞는 로그함수를 호출하도록 지원한다.

Logging Level

- fatal : 치명적인 에러가 발생할 경우 출력할 함수
- error : 요청 처리중 발생하는 오류성 메세지를 출력하는 함수
- warn : 경고성 메세지를 출력할때 사용하는 함수. 실행에는 문제없지만, 향후 오류가 발생할
         경우가 있을 경우 사용
- info  : 요청처리중 발생하는 정보성메세지 출력시 사용
- debug : 개발중에 필요한 로그가 있을 경우 사용
- trace : 모든 활동에대한 로그를 남길때 사용

Logging Methods

public static void main(String[] args) {
    log.error("error - {} " , "에레메시지임");
    log.warn("warn - {}" , "경고메세지");
    log.info("info - {}" , "인포메세지");
    log.debug("debug - {}" , "디버그");		
    log.trace("trace - {} ","트레이스");
}
  • 프로젝트 생성후 위 메서드 실행시 error(), warn(),inf() 메서드의 내용만 출력되는것을 확인 할 수 있다. 이는 프로젝트의 log4j.xml에서 설정한 출력용 로그 레벨을 지정하는 코드와 연관이 있다.

  • 위 코드는 MVC프로젝트 생성시 내장 log4j.xml에 대한 설정정보로 com.kh.test패키지 아래의 클래스들에 대한 로그 레벨을 info 등급으로 지정하고 있다.

  • 로그레벨을 info등급으로 설정하게되면 Logging Level이 info등급과 같거나 info등급보다 높은 경고성 메세지들이 출력된다.

  • 로그의 등급이 존재할때의 장점은 개발단계의 어플리케이션에서 로그레벨을 debug 등급으로 설정하여 개발에 필요한 파라미터값, 리턴값등을 확인을 한 후 , 운영단계로 넘어갔을때 로그레벨만 info등급으로 살짝변경하면 출력문을 하나하나 수정할 필요 없이 운영에 필요한 정보성 메세지만 출력되도록 관리할 수 있다.

System.out.print문은 더 이상 사용하지 않는다.

그 이유는 여러가지 존재하는데 첫번재로는유지보수성이 부족하다는 점이다.

System.out.print문은 로깅 레벨이 존재하지 않아서 메세지의 중요도에 대해서 설정하고 관리할 수 없으며 개발단계에서 운영단계로 넘어갈때 개발에서 사용했던 System.out.print문을 하나하나 지워줘야하는 불편함이 존재한다.

두번째로는 성능상의 이슈가 존재한다. System.out.println문은 동기방식 출력문으로 출력이 완료되기 전까지 다음 구문이 실행되지 않는다. 만약 출력문을 10000000번 반복출력하는 코드가 어딘가에 내장되어 있다면 해당출력문을 모두 출력하기 전까지 프로그램은 멈춰있는 상태에 있을 것이다. 로깅 프레임워크는 비동기방식 출력문을 지원하여 출력메세지를 효율적으로 출력하여 성능을 향샹시켜 준다

log4j의 태그들 분석

<?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/">
	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" /> 
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="com.kh.spring">
		<level value="info" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="warn" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

appender

  • 출력매체에 로그를 출력해주는 객체

  • 기본 appender객체는 console창에 로그를 출력하는 역할을 한다

  • 출력패턴은 layout안에 ConversionPattern의 value값으로 지정한다

  • 사용가능한 패턴은 정식 메뉴얼을 통해 확인해도 되고 자주사용되는 패턴은 하단 드랍다운메뉴를 확인하자

<appender name="console" class="org.apache.log4j.ConsoleAppender">
	<param name="Target" value="System.out" />
	<layout class="org.apache.log4j.PatternLayout">
		<param name="ConversionPattern" value="%-5p: %c - %m%n" /> 
	</layout>
</appender>
ConversionPattern
%c %C : 클래스명을 표시함.
%C{1}의 경우
클래스명이 com.kh.spring.LogTest일때 LogTest의미
%C{2}의 경우
클래스명이 com.kh.spring.LogTest일때 spring.LogTest의미
%d : 로그시간을 출력 -> java.text.SimpleDateFormat과 동일한 출력패턴을 사용함.
%M : 로그를 수행한 메소드명    
%m : 로그로 전달된 메세지.
%n : 개행문자
%F : 파일명을출력.
%L : 라인번호를 출력
%p : 로그이벤트명 (INFO , WARN, DEBUG...)
- 그외 -
%l : 로깅이 발생한 위치정보 - 링크를 제공
%t : 로그이벤트가 발생한 쓰레드명
%% : %를 출력하기위해 사용
%r : 어플리케이션이 시작된 이후 로깅이 발생한 시점까지의 시간(miliseconds)

logger

  • 패키지별 로그레벨을 정의하는 객체

  • 3rd party(스프링모듈)의 로그레벨도 정의할 수 있다.

  • level태그 생략시 root의 level로 설정된다

<logger name="com.kh.spring">
	<level value="info" />
</logger>

root

  • 최상위 로거 객체로 모든 로거의 공통설정을 정의한다.

  • priority : 로그의 기본 출력레벨을 설정한다. logger객체가 level을 지정하지 않은 경우 이 값이 자동으로 로그레벨로 지정된다.

  • appender-ref : root로거에 추가할 appender를 추가하는 태그. 여러 appender를 추가할 수 있다.

<root>
    <priority value="warn" />
    <appender-ref ref="console" />
    <appender-ref ref="dailyLog" />		
</root>

로그정보 파일로 기록하기

Daily Rolling FileAppender

  • 일정 기간 단위로 로그정보를 File에 기록해주는 객체로 회사의 운영 로그를 기록해 두었다가 서비스내용 분석, 데이터 수집 , 에러정보 해결등 다양한 용도로 사용한다.

<root>
    <priority value="warn" />
    <appender-ref ref="console" />
    <appender-ref ref="dailyLog" />		
</root>

설정방법

1) appender객체 생성성

<appender name="dailyLog" class="org.apache.log4j.DailyRollingFileAppender">
	<param name='threshold' value="INFO" />
	<!-- logger객체에 로깅레벨이 설정되어있지 않을 경우 로깅레벨의 기본값설정정 -->
	<param name="append" value="true"/>
	<!-- 파일 이어쓰기여부 지정 true(이어쓰기) / false(새로쓰기) -->
	<param name="file" value="/logs/kh.log"/>
	<!-- 파일을 생성할 위치 -->
	<param name="datePattern" value=".yyyyMMdd"/>

	<layout class="org.apache.log4j.PatternLayout">
		<param name="ConversionPattern" value="%-5p:[%d{HH:mm:ss.SSS}] %C{1}.%M(%F:%L) - %m%n"/>
	</layout>
</appender>

2) root-logger에 생성한 appender등록

<root>
    <priority value="warn" />
    <appender-ref ref="console" />
    
    <appender-ref ref="dailyLog" />		
    
</root>

Previous스프링 예외처리NextPagination

Last updated 11 months ago

https://logging.apache.org/log4j/2.x/manual/appenders.html
src/main/resources/log4j.xml