Log4j 로거 프로그래밍 설정
SLF4J를 사용하려고 합니다.log4j
바인드)를 최초로 실시합니다.
Logger Factory에서 반환할 수 있는 3개의 다른 이름의 로거를 설정하고 싶습니다.로거 팩토리는 다른 레벨을 기록하고 메시지를 다른 추가 프로그램에 푸시합니다.
- Logger 1 "FileLogger"는 DEBUG를 기록하여 에 추가합니다.
DailyRollingFileAppender
- Logger 2 "TracingLogger"는 TRACE+를 기록하고,
JmsAppender
- Logger 3 "Error Logger"가 ERROR+를 기록하고 다른 에 추가됨
JmsAppender
또한 프로그래밍 방식으로 구성했으면 합니다(XML 또는 v-in-in-in-in-in-in-in-in-in-in-in-in-in-in-in-in-inlog4j.properties
파일)을 클릭합니다.
저는 보통 이런 것들을 정의해서Logger
부트스트래핑 코드 어딘가에 있습니다.init()
방법.다만, 사용하고 싶기 때문에slf4j-log4j
로거를 정의하고 클래스 패스에 사용할 수 있도록 할 수 있는 장소가 불분명합니다.
SLF4J API를 사용하는 내 코드는 이러한 로거가 존재하는지 알 수 없기 때문에 이것이 SLF4J의 기본 목적(파사드)에 위배된다고 생각하지 않습니다.내 코드는 SLF4J API에 일반 콜을 발신하고 클래스 패스에 있는 log4j 로거로 전송합니다.
하지만 자바에서 클래스 패스에 log4j 로거를 설정하려면 어떻게 해야 하나요?
Log4j에 Appender를 프로그래밍 방식으로 추가/제거할 수 있습니다.
ConsoleAppender console = new ConsoleAppender(); //create appender
//configure the appender
String PATTERN = "%d [%p|%c|%C{1}] %m%n";
console.setLayout(new PatternLayout(PATTERN));
console.setThreshold(Level.FATAL);
console.activateOptions();
//add appender to any Logger (here is root)
Logger.getRootLogger().addAppender(console);
FileAppender fa = new FileAppender();
fa.setName("FileLogger");
fa.setFile("mylog.log");
fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
fa.setThreshold(Level.DEBUG);
fa.setAppend(true);
fa.activateOptions();
//add appender to any Logger (here is root)
Logger.getRootLogger().addAppender(fa);
//repeat with all other desired appenders
init()에 넣는 것을 추천합니다.이것보다 먼저 실행이 될 것이 확실합니다.그런 다음 루트 로거의 모든 기존 추가 프로그램을 제거할 수 있습니다.
Logger.getRootLogger().getLoggerRepository().resetConfiguration();
자신의 것을 추가하는 것부터 시작합니다.물론 classpath에 log4j가 필요합니다.
비고:
아무거나 가져가세요.Logger.getLogger(...)
부록을 추가하는 것을 좋아합니다.root logger는 다른 카테고리의 다른 부가기(additivity 플래그를 설정하여 특별히 설정하지 않는 한)를 통해 전달되는 모든 것을 처리할 것이기 때문에 루트 로거를 사용했을 뿐입니다.
로그가 어떻게 동작하는지, 로그가 기록되는 장소가 어떻게 결정되는지 알고 싶다면 이 매뉴얼을 읽고 자세한 정보를 얻으십시오.
요약:
Logger fizz = LoggerFactory.getLogger("com.fizz")
"com.fizz" 카테고리의 로거를 표시합니다.
위의 예에서는 이 예와 함께 기록된 모든 것이 루트 로거 상의 콘솔 및 파일어펜더로 참조됨을 의미합니다.
Logger.getLogger("com.fizz").addAppender(newAppender)에 Appender를 추가한 후 로그인을 시작합니다.fizz
root logger와 root logger의 appenders에 의해 처리됩니다.newAppender
.
구성을 사용하여 로거를 만드는 것이 아니라 시스템에서 가능한 모든 카테고리에 대한 핸들러를 제공하는 것입니다.
"양쪽 끝"(소비자 측과 구성 측)에서 log4j를 사용하려고 하는 것 같습니다.
slf4j api에 대해 코드를 작성하되 클래스 패스가 반환되는 log4j 로거 설정을 사전에(그리고 프로그래밍 방식으로) 결정하려면 반드시 logging 적응을 해야 합니다.
public class YourLoggingWrapper {
private static boolean loggingIsInitialized = false;
public YourLoggingWrapper() {
// ...blah
}
public static void debug(String debugMsg) {
log(LogLevel.Debug, debugMsg);
}
// Same for all other log levels your want to handle.
// You mentioned TRACE and ERROR.
private static void log(LogLevel level, String logMsg) {
if(!loggingIsInitialized)
initLogging();
org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger("DebugLogger");
switch(level) {
case: Debug:
logger.debug(logMsg);
break;
default:
// whatever
}
}
// log4j logging is lazily constructed; it gets initialized
// the first time the invoking app calls a log method
private static void initLogging() {
loggingIsInitialized = true;
org.apache.log4j.Logger debugLogger = org.apache.log4j.LoggerFactory.getLogger("DebugLogger");
// Now all the same configuration code that @oers suggested applies...
// configure the logger, configure and add its appenders, etc.
debugLogger.addAppender(someConfiguredFileAppender);
}
이 방법을 사용하면 log4j 로거의 구성 장소와 시기를 걱정할 필요가 없습니다.classpath가 처음 요청하면 느슨하게 구성되고 다시 전달되며 slf4j를 통해 사용할 수 있게 됩니다.도움이 됐으면 좋겠네요!
Java에서 프로그래밍 방식으로 log4j2를 구성하려는 경우 다음 링크를 참조하십시오(https://www.studytonight.com/post/log4j2-programmatic-configuration-in-java-class).
Console Appender 설정의 기본 코드를 다음에 나타냅니다.
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
builder.setStatusLevel(Level.DEBUG);
// naming the logger configuration
builder.setConfigurationName("DefaultLogger");
// create a console appender
AppenderComponentBuilder appenderBuilder = builder.newAppender("Console", "CONSOLE")
.addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT);
// add a layout like pattern, json etc
appenderBuilder.add(builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d %p %c [%t] %m%n"));
RootLoggerComponentBuilder rootLogger = builder.newRootLogger(Level.DEBUG);
rootLogger.add(builder.newAppenderRef("Console"));
builder.add(appenderBuilder);
builder.add(rootLogger);
Configurator.reconfigure(builder.build());
그러면 기본 rootLogger가 재설정되고 새 Appender도 생성됩니다.
log4j 속성에서 appender를 정의하고 프로그래밍 방식으로 업데이트하려는 경우 log4j 속성에서 이름을 설정하고 이름으로 가져옵니다.
log4j.properties 엔트리의 예를 다음에 나타냅니다.
log4j.appender.stdout.Name=console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.Threshold=INFO
업데이트하려면 다음을 수행합니다.
((ConsoleAppender) Logger.getRootLogger().getAppender("console")).setThreshold(Level.DEBUG);
언급URL : https://stackoverflow.com/questions/8965946/configuring-log4j-loggers-programmatically
'programing' 카테고리의 다른 글
사용하시는 어플리케이션에서 sql과 sql의 계산을 실행하는 경우의 장점과 단점은 무엇입니까? (0) | 2022.07.30 |
---|---|
getchar()는 입력 문자열과 동일한 출력을 제공합니다. (0) | 2022.07.30 |
@JsonProperty 속성은 언제 사용되며 어떤 용도로 사용됩니까? (0) | 2022.07.30 |
Vue.js에서 속성과 메서드를 재정의하는 적절한 방법? (0) | 2022.07.30 |
Vue/Vuex - 모듈2는 모듈1에 의존하며 모듈1은 서버로부터 데이터를 취득합니다. (0) | 2022.07.28 |