Java로 로그인하면 어떻게됩니까? [닫은]


117

왜 다른 것 대신 다음 패키지 중 하나를 사용합니까?

  • 자바 로깅
  • 커먼즈 로깅
  • Log4j
  • SLF4j
  • 로그 백

4
SLF4j를 Commons Logging과 비교 하는 stackoverflow.com/questions/873051을 원할 수 있습니다 .
James McMahon

24
왜 Ceki가 3 개의 로깅 프레임 워크를 만들 었는가 !!! 그게 광기 ...
MP.

6
@mP. -log4j가 첫 번째 였고 불일치가 발생하고 slf4j + logback이 작성되었습니다. slf4j는 API 이며 API 구현을 로그 백 합니다. 다른 모든 것에 관계없이 slf4j는 매우 유용합니다.
Thorbjørn Ravn Andersen 2011

3
Ceki Gülcü가 SLF4J + Logback을 만든 이유에 대한 자세한 내용은 다음 Devoxx 토크를 참조하십시오. parleys.com/#st=5&id=1701
bitek

이것에서 나오는 가장 좋은 것은 로깅 세계를 통합 할 slf4j API입니다. 저는 로그 백이 아직 개발자들과 함께 임계치를 달성하지 못했다고 생각합니다.
Thorbjørn Ravn Andersen

답변:


86

(내가 아는 한) api apperance의 시간순으로 :

  • Log4j는 대부분의 사람들이 사용하기 때문에 (내 경험상)
  • 오픈 소스 프로젝트가이를 사용하기 때문에 Commons Logging (통합 솔루션에서 사용되는 모든 로깅 프레임 워크와 통합 할 수 있음) 특히 API / 프레임 워크 / OSS이고 Commons Logging을 사용하는 다른 패키지에 의존하는 경우에 유효합니다.
  • Commons Logging은 특정 로깅 프레임 워크에 "잠그고"싶지 않기 때문에 (대신에 Commons Logging이 제공하는 것을 잠그고 있습니다)-이 점을 이유로 사용하는 것이 합리적이지 않다고 생각합니다.
  • 여분의 jar를 추가하고 싶지 않기 때문에 Java 로깅.
  • Commons Logging보다 새롭고 매개 변수화 된 로깅을 제공하기 때문에 SLF4j :

logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
    // Note that it's actually *more* efficient than this - see Huxi's comment below...
    logger.debug("The entry is " + entry + "."); 
}
  • Logback은 log4j보다 최신이기 때문에 SLF4j를 직접 구현하므로 매개 변수화 된 로깅을 지원합니다.
  • SLF4j / Logback은 log4j를했던 동일한 사람이 작성했기 때문에 더 잘 만들었습니다. ( Ken G 에 따르면 -감사합니다. 이전 뉴스 게시물을 볼 때 적합 할 것 같습니다 )
  • SLF4j는 log4j 어댑터도 게시하므로 이전 코드에서 log4j를 "switch out"할 필요가 없습니다. log4j.properties가 SLF4j를 사용하도록 설정하면 구성됩니다.

3
커먼즈 로깅의이면에있는 아이디어는 라이브러리에서 사용해야한다는 것입니다. 이런 식으로 라이브러리는 호스팅 애플리케이션이 사용하는 동일한 로깅 프레임 워크 (커먼즈 로깅을 통해)를 항상 사용할 수 있습니다.
Joachim Sauer

질문에 대해 Loki에게 감사드립니다. 이제 더 이상 기본 프레임 워크로 log4j를 사용하지 않을 것임을 알고 있습니다. SLF4j FTW! 또한 SLF4j가 log4j와 같은 사람에 의해 작성되었음을 지적한 Ken G에게 감사합니다
Stephen

3
코드 예제의 주석이 100 % 정확하지 않습니다. 메시지의 실제 서식은 이벤트가 정말 펜더에 의해 처리되는 경우에만 일어날 수 있도록 Logback에 의해 느리게 수행 하고 펜더는 형식의 메시지가 필요합니다 - 예를 들어, 경우에 일어나지 않을 것 인 SocketAppender 이벤트를 사용하여 직렬화하기 때문에 변경되지 않은 메시지 패턴 + 인수를 문자열로. 나는 그것이 당신이 "효과적으로"어떻게 정의 하느냐에 달려 있다고 생각한다. 확실히 동일한 메시지를 내 보냅니다 (적어도 항목과 객체가 같으면;)) 내 nitpicking을 용서하십시오.
Huxi

6
SLF4J는 실제로 다른 로깅 프레임 워크 위에있는 API 일뿐입니다. Commons Logging의 목표와 비슷하지만 내 경험으로는 더 직관적입니다.
James McMahon

37

Java로 로그인하는 것이 혼란스럽고 일관성이 없으며 문서화가 잘못되었으며 특히 우연한 것으로 나타났습니다. 더욱이, 이러한 로깅 프레임 워크 사이에는 엄청난 유사성이있어 노력의 중복과 실제로 어떤 로깅 환경에 있는지에 대한 혼란을 초래합니다. 특히 심각한 Java 웹 애플리케이션 스택에서 작업하는 경우 배수한 번에 로깅 환경; (예 : 최대 절전 모드는 log4j 및 tomcat java.util.logging을 사용할 수 있습니다). Apache commons는 다양한 로깅 프레임 워크를 연결하기위한 것이지만 실제로는 더 복잡해집니다. 이것을 미리 모르면 완전히 당황합니다. 내 로그 메시지가 콘솔 등에 인쇄되지 않는 이유는 무엇입니까? 오, 내가 log4j가 아닌 Tomcat 로그를보고 있기 때문입니다. 또 다른 복잡성 계층을 추가하면 응용 프로그램 서버에는 특정 웹 응용 프로그램에 대한 로컬 구성을 인식하지 못할 수있는 전역 로깅 구성이있을 수 있습니다. 마지막으로, 이러한 모든 로깅 프레임 워크는 너무 복잡합니다. Java에 로그인하는 것은 나 같은 개발자를 실망시키고 혼란스럽게 만드는 혼란스러운 혼란이었습니다.

Java의 초기 버전에는이 시나리오로 이어지는 기본 제공 로깅 프레임 워크가 없었습니다.


19
이것이 대답입니까? 폭언처럼 보입니다.
Michael Myers

15
미안 해요. 그것은 이다 호언 장담의 작은 비트. 그러나 이것은 또한 "Java에서 로깅에 대해 무슨 일이 일어나고 있습니까?"에 대한 일관된 응답입니다. 간단히 말해서 대답은 깊이 깨 졌다는 것입니다.
Julien Chastang

1
글쎄, 그것은 -1 표의 가치가 없습니다; P 그러나 생각할 것이 있습니다.
guyumu

21
문제는 Sun이 실제로 Java 1.4에 java.util.logging을 추가했을 때 시작되었습니다. 그 전에 LOG4J는 잘 확립되어 널리 사용되었습니다. 그 후 LOG4J와 java.util.logging을 모두 지원하는 래퍼가 필요했습니다. 또한 jul은 java. * 패키지에 포함되어 있기 때문에 SLF4J가 다른 프레임 워크를 연결하는 방식 인 JAR을 교체하여 대체 할 수 없습니다. 이것은 아마도 썬 사상 최악의 아이디어 였을 것입니다. 그리고 결국 "좋은 자바 시민"이 jul을 사용해야한다는 잘못된 가정으로 이어졌습니다.
Huxi

4
@Huxi, 나는 Calendar API가 더 나쁘다고 유지합니다. 썬을 방어하기 위해 그것은 그들의 코드가 아니라 Taglient에서 나왔습니다.
Thorbjørn Ravn Andersen 2012

22

이전에 언급되지 않은 중요한 점이 하나 있습니다.

SLF4J (및 로깅 백엔드로서 Logback 및 LOG4J 모두)는 소위 Mapped Diagnostic Context (MDC, javadoc문서 참조 )를 지원합니다.

이는 기본적으로 로깅 이벤트에 추가 컨텍스트 정보를 추가하는 데 사용할 수있는 스레드 로컬 Map <String, String>입니다. MDC의 현재 상태는 모든 이벤트에 첨부됩니다.

이것은 사용자 이름과 요청의 URL (웹앱의 경우)과 같은 항목을 입력하면 매우 유용 할 수 있습니다. 예를 들어 필터를 사용하여 자동으로 수행 할 수 있습니다.


2
기술적으로는 스레드 로컬 Map <String, String>입니다.
pdxleif


4

우리 회사 프로젝트에서는 LOG4j를 사용하며 Stephen이 그의 예에서 보여준 것처럼 사용하기 매우 쉽습니다. 또한 LOG4j에 대한 자체 패턴 클래스를 작성하여 자체 출력 파일 스키마를 만들 수 있습니다. 로그 파일의 모양을 설명 할 수 있습니다. 원래 log4j 클래스를 향상시킬 수 있습니다.

모든 LOG4j 속성은 log4j.properties 파일에서 변경할 수 있으므로 프로젝트마다 다른 파일을 사용할 수 있습니다.

Java 로깅은 내가 가장 좋아하는 것은 아니지만 처음부터 log4j를 사용하기 때문일 수 있습니다.


4

커먼즈 로깅 개요 는 기본 로깅 프레임 워크 통제 할 수 없을 때, 라이브러리 코드에서 로깅 다음의 존재에 대한 이유를 제공합니다. 외부 애플리케이션에 연결되는 다양한 Apache 프로젝트에 매우 중요합니다. 완전히 제어 할 수있는 내부 IT 프로젝트에는 그렇게 중요하지 않을 수 있습니다.

즉, 내가 아는 다른 많은 개발자와 마찬가지로 Commons Logging에 글을 씁니다. 그 이유는 정신적 부담을 최소화하기 위함입니다. 프로젝트 또는 작업을 변경할 수 있으며 새로운 프레임 워크를 배울 필요가 없습니다 (새 작업 / 프로젝트도 CL을 사용하고 / 또는 CL로 이동하도록 설득 할 수있는 경우).

또한 어떤 프레임 워크를 사용하든 자체 래퍼를 만드는 데 가치가 있습니다. 여기 에 설명 된대로 LogWrapper 개체를 사용하여 사용자 지정 문자열 화 (중요)를 제공하고 로깅 문의 시각적 혼란을 최소화합니다 (덜 중요 함).


1
SLF4J를 통해 모든 CL 로깅을 라우팅하는 데 사용할 수있는 commons.logging => SLF4J 브리지도 있습니다. SLF4J는 commons.logging, LOG4J 및 (약간 번거롭지 만 가능한 한 좋은) java.util.logging의 브리징을 지원하므로 모든 로그는 사용할 SLF4J 백엔드에서 끝납니다. slf4j.org/legacy.html을 참조하십시오 . 저는 Logback, btw를 사용하지만 편견이라고 주장 할 수 있습니다.
Huxi

2

일반적으로 기본적으로 Log4J를 사용합니다.

Java 1.4에 대한 종속성이 마음에 들지 않으면 Java 로깅을 사용하지만 Log4J를 선호합니다.

이미 사용했던 것을 향상시키고 있다면 Commons Logging을 사용할 것입니다.


1.4에 대한 의존성에 신경 쓰지 않았습니까 ?? 1.4도 서비스 수명이 끝났습니다.
Tom Hawtin-tackline

2
@Tom He는 jdk1.4 +를 의미합니다.
mP.

사실 나는 최근에 여전히 JDK 1.3 :-(에서 실행중인 시스템에서 몇 가지 작업을 수행했습니다, 그리고 나는 유지 마지막으로 전은 2 년 미만이었다 JDK 1.2 시스템을. 그들은 절대적으로하지 않는 한 너무 많은 장소는 업그레이드하지 .에, 그들은 바로 업그레이드 설치를 거부
마이클 Rutherfurd

0

어떤 로깅 프레임 워크 에든 쓸 수있는 얇은 로깅 파사드를 만드는 것이 좋습니다.이 시점에서 백업 엔진의 선택이 거의 논쟁 점이됩니다.


2
그것이 커먼즈 로깅이하는 일인데 왜 바퀴를 재발 명할까요? 또한 여러분의 파사드가 커먼즈 로깅이 이미하는 것처럼 처리해야하는 몇 가지 문제가 있습니다.
James AN Stauffer

+1 커먼즈 로깅 인수에 대응하기 위해 일부 엔터프라이즈 앱은 사용자 지정 로거를 사용합니다. 항상 기본 구현을 숨기는 것이 좋습니다. '얇은'포장지는 다른 병을 포장 할 필요를 없애고 재창조만큼 중요하지 않습니다.
questzen

1
최근에 프레임 워크를 Compact Framework (.Net)로 이식했을 때 저를 구했습니다. nLog에 하드 코딩 된 종속성이 있었다면 망 쳤을 것입니다. 이 접근 방식을 사용했기 때문에 null 로거를 삽입하고 만족할 수있었습니다. 누군가 나를 다시 0으로 투표 해주세요 :-)
tsimon

3
하나는 이미 존재합니다. slf4j를 살펴보십시오. 런타임 클래스 경로에서 jar를 전환하여 애플리케이션 시작시 로깅 프레임 워크를 전환 할 수 있도록 허용하는 씬 래퍼입니다.
deterb

1
막힘은 어떤 프레임 워크를 사용할지 알아내는 자체 방법을 가지고 있습니다. Ceki가 생성 한 로깅 프레임 워크 수. 사용자는 항상 인터 디렉션 수준을 설정하고 자체 로깅으로 인해 막히는 구현을 숨기려고 노력해야합니다. 그런 다음 Travis가 언급 한대로 원하는 모든 f / w를 플러그인 할 수 있습니다.
mP.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.