JavaRush /Java Blog /Random-KO /로깅이 필요한 이유는 무엇입니까?

로깅이 필요한 이유는 무엇입니까?

Random-KO 그룹에 게시되었습니다
안녕하세요! 강의를 작성할 때 특히 특정 주제가 실제 업무에서 확실히 사용될 것인지 주목합니다. 로깅이 필요한 이유 - 1 주의하세요! 오늘 우리가 다룰 주제는 작업 첫날부터 모든 프로젝트에 확실히 유용할 것입니다. 로깅에 대해 이야기하겠습니다. 이 주제는 전혀 어렵지 않습니다(쉽다고도 말할 수 있습니다). 하지만 첫 직장에서는 이미 뻔한 일을 처리할 만큼 충분한 스트레스가 있을 것이므로 지금 철저하게 정리하는 것이 좋습니다. :) 그럼 시작하겠습니다. 로깅이란 무엇입니까? 로깅은 프로그램 작동에 대한 데이터를 어딘가에 기록하는 것입니다. 이 데이터가 기록되는 곳을 ' 로그 '라고 합니다. 한 번에 두 가지 질문이 발생합니다. 어디에 어떤 데이터가 기록됩니까? "어디"부터 시작해 보겠습니다. 다양한 위치에 프로그램 작동 데이터를 기록할 수 있습니다. 예를 들어, 연구 중에 를 사용하여 콘솔에 데이터를 출력하는 경우가 많습니다 System.out.println(). 이것은 가장 단순하지만 실제 로깅입니다. 물론 이는 클라이언트나 제품 지원 팀에게는 그리 편리하지 않습니다. 그들은 분명히 IDE를 설치하고 콘솔을 모니터링하고 싶지 않을 것입니다. 정보를 기록하는 데 더 친숙한 형식인 텍스트 파일도 있습니다. 사람들이 이런 식으로 읽는 것이 훨씬 더 쉽고, 확실히 저장하기도 훨씬 더 쉽습니다! 이제 두 번째 질문입니다. 프로그램 작동에 관한 어떤 데이터를 로그에 기록해야 합니까? 하지만 여기에서는 모든 것이 당신에게 달려 있습니다! Java 로깅 시스템은 매우 유연합니다. 프로그램의 전체 진행 상황이 기록되도록 구성할 수 있습니다. 한편으로는 이것이 좋습니다. 그러나 반면에 모든 내용이 거기에 기록되면 Facebook 또는 Twitter 로그의 크기가 얼마나 될 수 있는지 상상해 보십시오. 이런 대기업은 아마도 이 정도의 정보도 저장할 수 있는 능력을 갖추고 있을 것입니다. 하지만 500GB의 텍스트가 포함된 로그에서 심각한 오류 하나에 대한 정보를 검색하는 것이 얼마나 어려울지 상상해 보십시오. 건초더미 속의 바늘보다 더 나쁩니다. 따라서 Java에서의 로깅은 오류 데이터만 로그(log)에 기록되도록 구성할 수 있습니다. 아니면 심각한 오류에 관한 것일 수도 있습니다! 그러나 "Java에 로그인"이라고 말하는 것은 완전히 정확하지 않습니다. 사실 이 기능이 언어에 추가되기 전에 프로그래머들 사이에서 로깅에 대한 필요성이 발생했습니다. 그리고 Java가 자체 로깅 라이브러리를 갖게 되었을 때 모든 사람들은 이미 log4j 라이브러리를 사용하고 있었습니다. Java 로그인의 역사는 실제로 매우 길고 유익하며 여가 시간에는 Habré에서 이 게시물을 읽을 수 있습니다 . 간단히 말해서 Java에는 자체 로깅 라이브러리가 있지만 이를 사용하는 사람은 거의 없습니다. :) 나중에 여러 다른 로깅 라이브러리가 나타나고 모든 프로그래머가 다른 로깅 라이브러리를 사용하기 시작했을 때 호환성 문제가 발생했습니다. 사람들이 서로 다른 인터페이스를 갖춘 12개의 서로 다른 라이브러리를 사용하여 동일한 작업을 수행하는 것을 방지하기 위해 slf4j 추상화 프레임워크 가 만들어졌습니다.(“Java용 서비스 로깅 Facade”). slf4j 클래스를 사용하고 해당 메소드를 호출하더라도 내부적으로는 log4j, 표준 java.util.logging 등 이전의 모든 로깅 프레임워크가 실행되고 있기 때문에 이를 추상화라고 합니다. 현재 다른 라이브러리에는 없는 log4j의 특정 기능이 필요하지만 프로젝트를 이 특정 라이브러리에 엄격하게 연결하고 싶지 않은 경우 slf4j를 사용하면 됩니다. 그리고 그녀는 이미 log4j 메소드를 "풀"할 것입니다. 마음이 바뀌어 log4j 기능이 더 이상 필요하지 않다고 결정한 경우 다른 라이브러리를 사용하도록 "래퍼"(즉, slf4j)를 재구성하기만 하면 됩니다. 귀하의 코드는 특정 라이브러리가 아닌 slf4j의 메소드를 호출하기 때문에 작동이 중지되지 않습니다. 작은 여담. 다음 예제가 작동하려면 여기에서 slf4j 라이브러리를 다운로드하고 여기에서 log4j 라이브러리를 다운로드해야 합니다 . 다음으로, 아카이브의 압축을 풀고 Intellij IDEA를 통해 클래스 경로에 필요한 jar 파일을 추가해야 합니다. 메뉴 항목: 파일 -> 프로젝트 구조 -> 라이브러리 필요한 항아리를 선택하고 프로젝트에 추가합니다(다운로드한 아카이브에는 많은 항아리가 있습니다. 그림에서 필요한 항아리를 확인하세요) 로깅이 필요한 이유 - 2로깅이 필요한 이유 - 3참고 - 이 지침은 Maven을 어떻게 사용하는지 모르는 학생 Maven을 사용하는 방법을 알고 있다면 처음부터 시작하는 것이 더 좋습니다. Maven을 사용하는 경우 다음 종속성을 추가하세요.
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
좋습니다. 설정을 정리했습니다 :) slf4j가 어떻게 작동하는지 살펴보겠습니다. 프로그램 진행 상황이 어딘가에 기록되도록 하려면 어떻게 해야 합니까? 이를 위해서는 로거어펜더 라는 두 가지가 필요합니다 . 첫 번째부터 시작하겠습니다. 로거는 기록 보관을 완벽하게 관리하는 개체입니다 . 로거를 생성하는 것은 매우 쉽습니다. 정적 메서드( )를 사용하여 수행됩니다 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 record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
콘솔 출력: ERROR StatusLogger Log4j 2 구성 파일을 찾을 수 없습니다. 기본 구성(콘솔에 오류만 기록) 또는 사용자가 프로그래밍 방식으로 제공한 구성을 사용합니다. Log4j 2 내부 초기화 로깅을 표시하려면 시스템 속성 'log4j2.debug'를 설정하세요. Log4j 2 15:49:08.907 [main] ERROR MyTestClass - 프로그램에서 오류가 발생했습니다! 여기서 무엇을 볼 수 있나요? 먼저 오류 메시지가 표시됩니다. 현재 필요한 설정이 부족하기 때문에 나타나는 것입니다. 따라서 이제 로거는 오류 메시지(ERROR)만 콘솔에만 출력할 수 있습니다. 메소드가 logger.info()실행되지 않았습니다. 하지만 logger.error()효과가 있었어요! 콘솔에는 현재 날짜, 오류가 발생한 방법( main), ERROR라는 단어 및 메시지가 표시됩니다! ERROR는 로깅 수준입니다. 일반적으로 로그 항목에 ERROR라는 단어가 표시되면 프로그램의 해당 지점에서 오류가 발생했음을 의미합니다. 항목에 INFO라는 단어가 표시되어 있으면 이는 단순히 프로그램의 정상적인 작동에 대한 현재 정보임을 의미합니다. SLF4J 라이브러리에는 로깅을 유연하게 구성할 수 있는 몇 가지 다양한 로깅 수준이 있습니다. 관리하기가 매우 쉽습니다. 필요한 모든 로직이 이미 클래스에 포함되어 있습니다 Logger. 필요한 메소드만 호출하면 됩니다. 일반 메시지를 게시하려면 으로 전화하세요 logger.info(). 에러 메시지 - logger.error(). 경고 표시 - 이제 Appenderlogger.warn() 에 대해 이야기해 보겠습니다 . 어펜더는 데이터가 들어오는 장소입니다. 데이터 소스의 반대말은 'B 지점'이라고 할 수 있습니다. 기본적으로 데이터는 콘솔에 출력됩니다. 이전 예에서는 아무것도 구성할 필요가 없었습니다. 텍스트는 콘솔 자체에 표시되었지만 log4j 라이브러리의 로거는 ERROR 수준 메시지만 콘솔에 출력할 수 있습니다. 사람들이 텍스트 파일에서 로그를 읽고 동일한 파일에 로그를 저장하는 것이 확실히 더 편리합니다. 로거의 기본 동작을 변경하려면 파일 어펜더를 구성해야 합니다 . 우선 src 폴더에 , Maven을 사용하는 경우 resources 폴더에, Maven을 사용하는 경우 resources 폴더에 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">
이것이 소위 상태 로거입니다. 이는 우리 로거와 관련이 없으며 log4j에서 내부적으로 사용됩니다. status=”INFO” 대신 status=”TRACE”를 설정할 수 있으며, log4j의 내부 작동에 대한 모든 정보는 콘솔에 출력됩니다(프로그램에 대한 추가자가 파일인 경우에도 status-logger는 데이터를 콘솔에 출력합니다). -기반을 둔). 지금은 필요하지 않으므로 모든 것을 그대로 두겠습니다.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
여기서는 어펜더를 생성합니다. 태그는 <File>파일 1이 될 것임을 나타냅니다. name="MyFileAppender"- 어펜더의 이름. fileName="C:\Users\Username\Desktop\testlog.txt"— 모든 데이터가 기록될 로그 파일의 경로입니다. append="true"— 파일 끝에 추가 데이터를 써야 하는지 여부. 우리의 경우에는 그럴 것입니다. false 로 설정하면 프로그램을 다시 시작할 때마다 이전 로그 내용이 삭제됩니다. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- 서식 설정입니다. 여기에서는 정규식을 사용하여 로그의 텍스트 형식을 사용자 정의할 수 있습니다.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
여기서는 로깅 수준(루트 수준)을 지정합니다. INFO 수준이 설정되어 있습니다. 즉, 위에서 살펴본 표에 따라 INFO보다 높은 수준의 모든 메시지는 로그에 포함되지 않습니다. 프로그램에는 INFO, WARN, ERROR 등 3개의 메시지가 있습니다. 현재 구성에서는 3개의 메시지가 모두 로그에 기록됩니다. 루트 수준을 ERROR로 변경하면 LOGGER.error()의 마지막 메시지만 기록됩니다. 또한, 어펜더에 대한 링크가 여기에 배치됩니다. <Root>이러한 링크를 생성하려면 태그 내부에 태그를 생성 <ApprenderRef>하고 여기에 매개변수를 추가해야 합니다 ref=”Name твоего аппендера”. 잊어버린 경우를 대비해 여기에 어펜더의 이름을 만들었습니다. <File name="MyFileAppender" 그리고 여기에 우리 프로그램의 코드가 있습니다!
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("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
물론 약간 비뚤어지긴 했지만(RuntimeException을 잡는 것은 평범한 아이디어입니다), 우리의 목적에 딱 맞습니다 :) 우리의 메소드를 main()4번 연속으로 실행하고 testlog.txt 파일을 살펴보겠습니다. 미리 만들 필요는 없습니다. 라이브러리가 자동으로 생성합니다. 모든 것이 작동했습니다! :) 이제 로거가 구성되었습니다. 이전에 작성한 일부 프로그램을 가지고 모든 메소드에 로거 호출을 추가하고 결과 로그를 살펴볼 수 있습니다. :) 추가 내용을 보려면 이 기사를 적극 권장합니다 . 거기에는 벌목이라는 주제가 심도 있게 논의되는데, 한 번에 읽기는 쉽지 않을 것이다. 그러나 여기에는 유용한 추가 정보가 많이 포함되어 있습니다. 예를 들어, testlog.txt 파일이 특정 크기에 도달하면 새 텍스트 파일을 생성하도록 로거를 구성하는 방법을 배우게 됩니다. :) 그리고 이것이 우리 수업의 끝입니다! 오늘 당신은 매우 중요한 주제에 대해 배웠고, 이 지식은 당신의 향후 작업에 확실히 유용할 것입니다. 또 보자! :)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION