CodeGym /Java Blog /무작위의 /자바 로깅
John Squirrels
레벨 41
San Francisco

자바 로깅

무작위의 그룹에 게시되었습니다
안녕! 강의를 작성할 때 실제 작업에서 절대적으로 필요한 특정 주제가 있는지 특히 강조합니다. 그러니 들어보세요! 오늘 우리가 다룰 주제는 채용 첫날부터 모든 프로젝트에 유용하게 사용될 것입니다. Java 로깅에 대해 이야기하겠습니다. 이 주제는 전혀 복잡하지 않습니다(쉽다고 말할 수도 있습니다). 하지만 첫 직장에서 강조할 뻔한 내용은 충분히 있을 테니 지금 당장 철저히 이해하는 것이 좋습니다 :) 자, 시작하겠습니다.

Java 로그인이란 무엇입니까?

로깅은 프로그램 작동에 대한 데이터를 기록하는 행위입니다. 이 데이터를 기록하는 장소를 "로그"라고 합니다. 두 가지 질문이 즉시 발생합니다. 어떤 데이터가 어디에 기록됩니까? "where"부터 시작하겠습니다. 다양한 위치에서 프로그램 작업에 대한 데이터를 작성할 수 있습니다. 예를 들어 공부하는 동안 System.out.println()콘솔에 데이터를 출력합니다. 이것은 가장 간단한 형식이지만 실제로 로깅입니다. 물론 이것은 사용자나 제품 지원 팀에게 그다지 편리하지 않습니다. 분명히 그들은 IDE를 설치하고 콘솔을 모니터링하고 싶어하지 않을 것입니다 :) 정보를 기록하는 데 더 일반적인 형식인 텍스트 파일이 있습니다. 인간은 이 형식으로 데이터를 읽는 것이 훨씬 더 편하고 확실히 데이터를 저장하는 것이 훨씬 더 편리합니다! 이제 두 번째 질문: 어떤 프로그램 데이터를 기록해야 합니까? 그것은 전적으로 당신에게 달려 있습니다! Java의 로깅 시스템은 매우 유연합니다. 프로그램이 수행하는 모든 작업을 기록하도록 구성할 수 있습니다. 한편으로 이것은 좋습니다. 그러나 반면에 Facebook이나 Twitter의 로그에 모든 내용을 기록한다면 얼마나 큰 로그가 될지 상상해 보십시오. 이러한 대기업은 아마도 그 정도의 데이터를 저장할 수 있는 능력이 있을 것입니다. 그러나 500GB의 텍스트 로그에서 하나의 중대한 오류에 대한 정보를 찾는 것이 얼마나 어려울지 상상해 보십시오. 그것은 건초 더미에서 바늘을 찾는 것보다 더 나쁠 것입니다. 따라서 Java는 오류 데이터만 기록하도록 구성할 수 있습니다. 또는 심각한 오류일 수도 있습니다! 즉, Java의 기본 로깅 시스템에 대해 말하는 것이 완전히 정확하지는 않습니다. 사실 프로그래머는 이 기능이 언어에 추가되기 전에 로깅이 필요했습니다. Java가 자체 로깅 라이브러리를 도입했을 때 모두가 이미 log4j 라이브러리를 사용하고 있었습니다. Java 로그인의 역사는 실제로 매우 길고 유익합니다. 요컨대 Java에는 자체 로깅 라이브러리가 있지만 거의 사용하지 않습니다 :) 나중에 여러 다른 로깅 라이브러리가 나타나 프로그래머가 사용하기 시작했을 때 호환성 문제가 발생했습니다. 사람들이 서로 다른 인터페이스를 가진 12개의 서로 다른 라이브러리에서 바퀴를 재발명하는 것을 막기 위해 추상 SLF4J 프레임워크("Service Logging Facade For Java")가 만들어졌습니다. SLF4J 클래스의 메서드를 사용하고 호출하더라도 내부적으로는 log4j, 표준 java.util.logging 등 이전의 모든 로깅 프레임워크를 실제로 사용하기 때문에 이를 추상화라고 합니다. 어떤 시점에서 다른 라이브러리에는 없는 Log4j의 특정 기능이 필요하지만 프로젝트를 이 라이브러리에 직접 연결하고 싶지 않다면 SLF4J를 사용하십시오. 그런 다음 Log4j 메서드를 호출하도록 합니다. 마음이 바뀌어 Log4j 기능이 더 이상 필요하지 않다고 결정한 경우 "여기Log4j 라이브러리가 있습니다 . 다음으로 아카이브의 압축을 풀고 IntelliJ IDEA를 사용하여 클래스 경로에 JAR 파일을 추가합니다. 메뉴 항목: 파일 -> 프로젝트 구조 -> 라이브러리 필요한 JAR 파일을 선택하고 프로젝트에 추가합니다(다운로드한 아카이브에는 많은 JAR 파일이 포함되어 있습니다. 필요한 파일을 보려면 그림을 확인하십시오.) 해당 학생을 위한 이 지침에 유의하십시오 로깅이 필요한 이유 - 2로깅이 필요한 이유 - 3. Maven 사용법을 모르는 사람. Maven을 사용하는 방법을 알고 있다면 Maven에서 시작하는 것이 일반적으로 더 좋습니다(훨씬 쉽습니다). Maven 을 사용하는 경우 다음 종속성을 추가합니다.

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
엄청난! 우리는 설정을 알아냈습니다 :) SLF4J가 어떻게 작동하는지 봅시다. 프로그램 작업이 어딘가에 기록되도록 하려면 어떻게 해야 합니까? 이를 위해서는 logger와 appender라는 두 가지가 필요합니다. 첫 번째부터 시작하겠습니다. 로거는 로깅을 완전히 제어할 수 있는 개체입니다. 로거를 만드는 것은 매우 쉽습니다. 정적 LoggerFactory.getLogger() 메서드를 사용하여 이 작업을 수행합니다. 메서드 매개 변수는 작업이 기록될 클래스입니다. 코드를 실행해 봅시다:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
콘솔 출력:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
여기서 무엇을 볼 수 있습니까? 먼저 오류 메시지가 표시됩니다. 이는 이제 필요한 설정이 부족하기 때문입니다. 따라서 현재 저희 로거는 오류 메시지(ERROR)만 콘솔에 출력할 수 있습니다. logger.info () 메서드가 작동하지 않았습니다. 하지만 logger.error() 가 그랬습니다! 콘솔에서 현재 날짜, 오류가 발생한 방법( main), "ERROR"라는 단어, 그리고 우리의 메시지! ERROR는 로깅 수준입니다. 일반적으로 로그 항목에 "ERROR"라는 단어가 표시되어 있으면 프로그램의 이 지점에서 오류가 발생한 것입니다. 항목에 "INFO"라는 단어가 표시된 경우 메시지는 단순히 프로그램의 정상 작동에 대한 현재 정보를 나타냅니다. SLF4J 라이브러리에는 로깅을 유연하게 구성할 수 있는 다양한 로깅 수준이 있습니다. 모두 관리하기가 매우 쉽습니다. 필요한 모든 로직이 이미 Java Logger 클래스에 있습니다. 관련 메서드를 호출하기만 하면 됩니다. 일상적인 메시지를 기록하려면 logger.info() 메서드를 호출하십시오. 오류 메시지의 경우 logger.error() 를 사용하십시오 . 경고의 경우 logger.warn()을 사용하십시오.

이제 appender에 대해 이야기 해 봅시다.

Appender는 데이터가 들어가는 곳입니다. 어떤 면에서는 데이터 소스의 반대, 즉 "B 지점"입니다. 기본적으로 데이터는 콘솔에 출력됩니다. 이전 예제에서는 아무것도 구성할 필요가 없었습니다. 텍스트는 콘솔에 표시되고 Log4j 라이브러리의 로거는 ERROR 수준 메시지만 콘솔에 출력할 수 있습니다. 분명히 사람들이 텍스트 파일에서 로그를 읽고 쓰는 것이 더 편리합니다. 로거의 기본 동작을 변경하려면 파일 추가자를 구성해야 합니다. 시작하려면 src 폴더에 직접 log4j.xml 파일을 만들어야 합니다. 당신은 이미 XML 형식에 익숙할 것입니다: 우리는 최근에 그것에 대한 교훈을 얻었습니다 :) 다음은 파일의 내용입니다:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
특별히 특별하거나 어려운 내용은 없습니다 :) 그래도 콘텐츠를 살펴보겠습니다.
<Configuration status="INFO">
이것은 소위 StatusLogger입니다. 로거와 관련이 없으며 Log4j의 내부 프로세스에서 사용됩니다. status="INFO" 대신 status="TRACE"를 설정하면 Log4j의 내부 작업에 대한 모든 정보가 콘솔에 표시됩니다(StatusLogger는 어펜더가 파일인 경우에도 콘솔에 데이터를 표시합니다). 지금은 필요하지 않으므로 그대로 두겠습니다.

<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
여기서 우리는 appender를 생성합니다. <File> 태그 파일 추가자가 될 것임을 나타냅니다. name="MyFileAppender"는 어펜더의 이름을 설정합니다. fileName="C:\Users\Username\Desktop\testlog.txt"는 모든 데이터가 기록될 로그 파일의 경로를 나타냅니다. append="true"는 파일 끝에 데이터를 기록해야 하는지 여부를 나타냅니다. 우리의 경우, 이것이 바로 우리가 할 일입니다. 값을 false로 설정하면 프로그램이 시작될 때마다 로그 파일의 이전 내용이 삭제됩니다. <PatternLayout 패턴="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5레벨 %logger{36} - %msg%n"/>서식 설정을 나타냅니다. 여기에서 정규 표현식을 사용하여 로그에서 텍스트 형식을 사용자 정의할 수 있습니다.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
여기서는 루트 수준을 나타냅니다. "INFO" 수준을 설정했습니다. 즉, INFO보다 높은 수준의 모든 메시지(위에서 살펴본 표에 따라)는 기록되지 않습니다. 프로그램에는 3개의 메시지가 있습니다: 하나는 INFO, 하나는 WARN, 하나는 ERROR입니다. 현재 구성에서는 3개의 메시지가 모두 기록됩니다. 루트 수준을 ERROR로 변경하면 LOGGER.error() 메서드 호출의 마지막 메시지만 로그에 기록됩니다. 또한 appender에 대한 참조도 여기에 표시됩니다. 이러한 참조를 생성하려면 <Root> 태그 안에 <ApprenderRef> 태그를 생성 하고 ref='your appender's name' 속성을 추가 해야 합니다 . 잊어버린 경우를 대비해 여기에서 추가자의 이름을 설정합니다. <. 그리고 여기 우리의 코드가 있습니다!

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
물론 약간 엉뚱하지만(RuntimeException을 포착하는 것은 의심스러운 생각입니다), 우리의 목적에는 완벽합니다 :) main() 메서드를 연속으로 4번 실행하고 testlog.txt 파일을 살펴보겠습니다. 미리 만들 필요는 없습니다. 라이브러리에서 자동으로 이 작업을 수행합니다. 모든 것이 작동했습니다! :) 이제 구성된 로거가 있습니다. 각 메서드에 로거 호출을 추가하여 이전 프로그램 중 일부를 가지고 놀 수 있습니다. 그런 다음 결과 로그를 살펴보십시오 :) 깊이 로그인 주제를 고려합니다. 앉은 자리에서 다 읽기는 어려울 것입니다. 즉, 유용한 추가 정보가 많이 포함되어 있습니다. 예를 들어 testlog.txt 파일이 특정 크기에 도달하면 새 텍스트 파일을 생성하도록 로거를 구성하는 방법을 배웁니다. :) 이것으로 수업을 마칩니다! 오늘 당신은 매우 중요한 주제에 익숙해졌고 이 지식은 당신의 미래 작업에 확실히 도움이 될 것입니다. 다음 시간까지! :)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION