java.util.logging을 사용한 좋은 예


273

프로그램에서 로그를 사용하고 싶습니다. java.util.logging 에 대해 들었지만 시작 방법을 모르겠습니다.

로깅으로 수행 할 수있는 작업에 대한 예가 있습니까? 내 프로그램에서 로깅을 어떻게 사용합니까?


7
여기에서 시작할 수 있습니다 : slf4j.org/manual.html
Jeremy Jeremy

1
나는 Steven Vascellaro에 동의합니다. 실질적인 목적이없는 주제 정책으로 인해 유용한 아이템이 파괴되는 것을보고 피곤합니다. 또한 OP가 java.util.logging에 대해 물었을 때 Jeremy와의 의견에 동의하지 않습니다. 나는 또한 네이티브 로깅에 관심이 있습니다 (답변, grwww 감사합니다!)
NOP

한 줄로 데이터를 기록하려면 : log.log (Level.INFO, "내 메시지 {0}", new Object [] {myDataId});
Mitja Gustin

답변:


335

java.util.logging 응용 프로그램과 함께 하나 이상의 jar 파일을 토트하지 않아도되며 훌륭한 Formatter와 잘 작동합니다.

일반적으로 모든 수업의 최상위에는 다음이 있어야합니다.

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

그런 다음 Logger 클래스 의 다양한 기능을 사용할 수 있습니다 .


최상위 수준의 실행 흐름에서 디버깅Level.FINE 하는 모든 항목에 사용하십시오 .

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

사용 Level.FINER/Level.FINEST 루프와 항상 기본 흐름 문제를 디버깅 할 때 그 많은 세부 사항을 볼 필요가 있습니다 장소에서 내부 :

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

로깅 기능의 매개 변수화 된 버전을 사용하여 GC가 따라야하는 수많은 문자열 연결 가비지가 생성되지 않도록하십시오. Object[]위와 같이 스택 할당에서 일반적으로 저렴합니다.


예외 처리에서는 항상 전체 예외 세부 사항을 기록하십시오.

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

로그 파일에서 ex.toString()" grep -n"for " Exception"를 입력하면 메시지도 볼 수 있기 때문에 항상 여기에 메시지로 전달 합니다 . 그렇지 않으면 스택 덤프에 의해 생성 된 다음 출력 라인에있게되며 해당 라인과 일치하는 고급 RegEx가 있어야하므로 종종보다 많은 출력을 얻을 수 있습니다.


3
이것은 일종의 파일에 씁니다. 내 프로그램에서 아직 작동하지 못했습니다. 나는 당신이 가지고있는 초기 라인을 가지고 있지만 지금까지 아무것도 작동하지 않았습니다.
Doug Hauf

5
로그를 어떻게 봅니까? 내가 사용하는 라이브러리는 Logger 객체를 초기화하고 .fine()메소드를 사용하여 로깅하지만 메시지를 표시 할 수없는 것 같습니다.
Anubian Noob

7
저는 1998 년부터 Java로 프로그래밍을 해왔습니다. Java에 로그인하는 것이 필요 이상으로 많은 골치 거리 인 것을 항상 발견했습니다. 이것은 내가 읽은 Java에 로그인하는 방법에 대한 가장 간단한 설명입니다. 간결합니다.
Steve McLeod 5

30
아무도 로그 파일을 찾을 수있는 곳을 언급하지 않은 것이 흥미 롭습니다.
Ahmedov 2016 년

4
로그의 위치가 궁금하다면 Logger에 대한 핸들러를 설정했는지 확인하십시오. 콘솔에 로그를 출력하려면 새 ConsoleHandler를 사용하고 addHandler 메소드를 사용하여 로거에 추가하십시오. 로거와 핸들러 모두에서 setLevel을 호출해야합니다.
Craig Brown

67

다음과 같이 로거를 선언해야합니다.

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

따라서 클래스 이름을 리 팩터하면 다음과 같습니다.

여기예제 와 함께 Java 로거에 대한 기사를 썼습니다 .


53

로깅에 대한 많은 예와 다른 유형이 있습니다. java.util.logging을 살펴보십시오. 패키지를 .

예제 코드 :

import java.util.logging.Logger;

public class Main {

  private static Logger LOGGER = Logger.getLogger("InfoLogging");

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

클래스 이름을 하드 코딩하지 않고 :

import java.util.logging.Logger;

public class Main {
  private static final Logger LOGGER = Logger.getLogger(
    Thread.currentThread().getStackTrace()[0].getClassName() );

  public static void main(String[] args) {
    LOGGER.info("Logging an INFO-level message");
  }
}

15
왜 로그 이름을 Main.class.getSimpleName()? 로 설정하지 않습니까? 이 방법으로 리팩토링 도구는 필요한 경우 올바르게 변경하지만 두 번째 솔루션만큼 복잡하지 않습니다.
Pijusn

3
로거 이름에 대한 스택 추적은 해킹, 느리고 정통입니다. 또한 AOP 프록시 또는 다른 바이트 코딩 특유의 이상한 이름을 깰 수 있습니다.
Adam Gent

9
stacktrace 비즈니스의 경우 -1입니다. 느리고 잠재적으로 컴파일러 최적화를 방해합니다.
phooji

4
로거를 초기화 할 때 왜 "느림"이 중요한가? 속도 저하에 대한 언급은 대부분의 사람들이 조기 최적화라고 부르는 것입니다 (예, 코드는 약간 해킹처럼 보입니다).
mikkom

3
@AndrewMcKinlay 어떤 상황에서 문제가 발생합니까? 로거 태그가 클래스 이름과 동일해야한다면 그렇게하는 것이 좋습니다. 리팩토링 도구는 자동으로 이름이 바뀌는 반면, 하드 코딩 된 문자열 인 경우 리팩토링 도구는 건너 뛰거나 "이름을 바꾸시겠습니까?"라고 말할 수도 있습니다.
Pijusn

23

SLF4J는 Apache Commons Logging (ACL)보다 나은 로깅 외관입니다. 여기에는 ACL, Log4J 또는 Java Util Logging에 대한 직접 호출이 다른 로깅 프레임 워크에 대한 브릿지가 있으므로 SLF4J를 통과하므로 원하는 경우 하나의 로그 구성 파일로 모든 출력을 하나의 로그 파일로 보낼 수 있습니다. 애플리케이션이 여러 로깅 프레임 워크를 사용하는 이유는 무엇입니까? 사용하는 타사 라이브러리, 특히 오래된 라이브러리가 사용하기 때문일 수 있습니다.

SLF4J는 다양한 로깅 구현을 지원합니다. 모든 것을 표준 출력으로 출력하고 Log4J 또는 Logback (Log4J보다 권장)을 사용할 수 있습니다.

http://www.slf4j.org/

http://logback.qos.ch/


9

개인적으로 minlog를 사용 합니다. 로깅 클래스는 수백 줄의 코드이므로 매우 간단합니다.


3
발자국을 최소화하려면이 라이브러리를 선택하십시오.
h3xStream

0

Apache의 commons logging 유틸리티를 사용하는 것이 좋습니다. 확장 성이 뛰어나고 다른 로거에 대해 별도의 로그 파일을 지원합니다. 여기를 참조하십시오 .


11
좋은 제안! 그럼에도 불구하고 그들이 요구하는 것에 대답하려고 노력하십시오. 그렇지 않으면 의견을 남기십시오.)
Ordiel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.