slf4j-simple을 구성하는 방법


답변:


218

그것은 시스템 속성을 통해

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

또는 simplelogger.properties클래스 패스의 파일

자세한 내용은 http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html 을 참조하십시오


덕분에 System.properties에서 "org.slf4j.simpleLogger.defaultLogLevel"을 "error"로 설정했지만 slf4j는 여전히 INFO 레벨 메시지를 기록합니다. 어떤 생각? BTW, simplelogger.properties를 어디에 두어야합니까?
Gelin Luo

2
org.slf4j.simpleLogger.defaultLogLevel 대신 org.slf4j.simplelogger.defaultlog를 사용해보십시오. 파일은 classpath, 기본 패키지에 있어야합니다
Evgeniy Dorofeev

2
실제로 그것은 ( defaultLogLevel) 작동합니다. 방금 잘못된 폴더에서 프로그램을 수정하고 있음을 발견 defaultlog했습니다. ;-) 작동하지 않습니다. 그래서 당신은 아마 그것을 받아 들였지만 답변을 편집하고 싶을 것입니다
Gelin Luo

11
참고 사항 : 실제로 사용중인 SimpleLogger의 버전에 따라 두 가지 대답이 모두 좋습니다. 예를 들어, defaultLogLevel은 1.7.5에서 작동하지만 defaultlog는 1.6.6에서 작동합니다. 프로젝트 로깅을 구성하고이 게시물을 확인할 때이 사실을 알았습니다.
Ken Shih

112

다음은 simplelogger.properties클래스 경로에 배치 할 수 있는 샘플 입니다 (사용할 속성의 주석 처리를 제거하십시오).

# SLF4J's SimpleLogger configuration file
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.

# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
#org.slf4j.simpleLogger.defaultLogLevel=info

# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
#org.slf4j.simpleLogger.log.xxxxx=

# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
#org.slf4j.simpleLogger.showDateTime=false

# The date and time format to be used in the output messages.
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
# If the format is not specified or is invalid, the default format is used.
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z

# Set to true if you want to output the current thread name.
# Defaults to true.
#org.slf4j.simpleLogger.showThreadName=true

# Set to true if you want the Logger instance name to be included in output messages.
# Defaults to true.
#org.slf4j.simpleLogger.showLogName=true

# Set to true if you want the last component of the name to be included in output messages.
# Defaults to false.
#org.slf4j.simpleLogger.showShortLogName=false

1
@RobertHunt이 로그를 파일로 저장하는 방법?
Devavrata

6
@Devavrata 속성 추가 org.slf4j.simpleLogger.logFile-파일의 경로 또는 특수 값 "System.out"및 "System.err"이 될 수있는 출력 대상입니다. 기본값은 "System.err"입니다. slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt

여러 값을 가질 수 있습니까? 그렇다면 어떻게합니까? 내가 원하는 것처럼 org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad

1
@LOLWTFasdasdasdad 불행히도 System.out, System.err 또는 파일 경로와 같은 단일 대상 만 지원합니다. 간단하게 설계되었으므로 고급 기능을 원할 경우 Log4J 또는 Logback과 같은 전체 로깅 구현을 고려해야합니다.
Robert Hunt

74

시스템 속성을 설정하여 프로그래밍 방식으로 변경할 수 있습니다.

public class App {

    public static void main(String[] args) {

        System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");

        final org.slf4j.Logger log = LoggerFactory.getLogger(App.class);

        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warning");
        log.error("error");

    }
}

로그 레벨은 오류> 경고> 정보> 디버그> 추적입니다.

로거가 생성되면 로그 수준을 변경할 수 없습니다. 로깅 레벨을 동적으로 변경해야하는 경우 SLF4J와 함께 log4j 를 사용할 수 있습니다 .


3
"로거가 생성되면 로그 수준을 변경할 수 없습니다." -이것이 실제로 지정되어 있습니까?
ksl

2
org.slf4j.impl.SimpleLogger의 ksl. 첫 번째 로거가 작성되면 init () 메소드가 실행되고 시스템 특성에서 기본 로깅 레벨을 페치합니다. 이것은 언제라도 새로 고침되지 않습니다. 또한 org.slf4j.impl.SimpleLoggerFactory는 클래스에 대한 로거를 한 번만 작성하므로 주어진 클래스 (또는 이름)에 대해 항상 동일한 로거가 리턴됩니다. 그러나 다른 레벨의 로거를 가질 수 있습니다. 로깅 레벨을 변경하려고 할 때 이러한 다른 레벨 로거를 "로그"변수에 지정하는 것이 가능합니다. 매우 깔끔한 솔루션은 아니지만 작동해야합니다.
eemelipa

@Eemuli org.slf4j.impl.SimpleLoggerdoc이 아닌 실제 소스 코드를 의미합니까?
ksl

LOG_FILE_KEY로거가 생성되면 속성을 변경할 수 없다는 것도 사실 입니까?
ksl

1
예, 실제 소스 코드를 의미합니다. LOG_FILE_KEY에 대해 잘 모르겠습니다.
eemelipa

4

나는 Eemuli가 로그 레벨을 만든 후에는 변경할 수 없다고 말한 것을 알았습니다. 디자인일지도 모르지만, 그것은 사실이 아닙니다.

나는 slf4j에 로그인 한 라이브러리를 사용하는 상황에 빠졌고 maven mojo 플러그인을 작성하는 동안 라이브러리를 사용하고있었습니다.

Maven은 slf4j SimpleLogger의 (해킹 된) 버전을 사용하는데, 플러그인 코드를 log4j와 같은 로그로 다시 라우팅하여 제어 할 수 없었습니다.

그리고 maven logging 구성을 변경할 수 없습니다.

그래서 시끄러운 정보 메시지를 조용히하기 위해 런타임에 SimpleLogger를 사용하여 이와 같은 리플렉션을 사용할 수 있음을 알았습니다.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
    try
    {
        Logger l = LoggerFactory.getLogger("full.classname.of.noisy.logger");  //This is actually a MavenSimpleLogger, but due to various classloader issues, can't work with the directly.
        Field f = l.getClass().getSuperclass().getDeclaredField("currentLogLevel");
        f.setAccessible(true);
        f.set(l, LocationAwareLogger.WARN_INT);
    }
    catch (Exception e)
    {
        getLog().warn("Failed to reset the log level of " + loggerName + ", it will continue being noisy.", e);
    }

물론, 이것은 다음에 maven 사람들이 로거를 변경할 때 깨지기 때문에 매우 안정적이고 신뢰할 수있는 솔루션은 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.