[SPRING] LogBack appender를 프로그래밍 방식으로 구성
SPRINGLogBack appender를 프로그래밍 방식으로 구성
logback.xml에 logback.xml에 정의 된 logback appender가 있습니다. DB appender이지만, bean으로 정의 된 자체 연결 풀을 사용하여 Java에서 appender를 구성하는 방법이 있는지 궁금합니다.
나는 비슷한 것들을 발견하지만 결코 실제적인 대답은 찾지 못한다.
해결법
-
==============================
1.여기에 나와있는 간단한 예제가 나와 있습니다 (이 예제에서는 FileAppender를 사용합니다).
여기에 나와있는 간단한 예제가 나와 있습니다 (이 예제에서는 FileAppender를 사용합니다).
import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.FileAppender; public class Loggerutils { public static void main(String[] args) { Logger foo = createLoggerFor("foo", "foo.log"); Logger bar = createLoggerFor("bar", "bar.log"); foo.info("test"); bar.info("bar"); } private static Logger createLoggerFor(String string, String file) { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); PatternLayoutEncoder ple = new PatternLayoutEncoder(); ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n"); ple.setContext(lc); ple.start(); FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>(); fileAppender.setFile(file); fileAppender.setEncoder(ple); fileAppender.setContext(lc); fileAppender.start(); Logger logger = (Logger) LoggerFactory.getLogger(string); logger.addAppender(fileAppender); logger.setLevel(Level.DEBUG); logger.setAdditive(false); /* set to true if root should log too */ return logger; } }
-
==============================
2.appenders를 프로그래밍 방식으로 구성 할 수 있습니다. 거의 모든 애펜더는 프로그래밍 방식의 구성을 사용하여 테스트됩니다. 따라서 로그백 프로젝트 소스 코드에는 프로그래밍 방식의 appender 구성에 대한 많은 예제가 있습니다. logback-core appender는 logback-core / src / test / java를보고, logback-classic / src / test / java에서 logback-classic appender를 찾으십시오.
appenders를 프로그래밍 방식으로 구성 할 수 있습니다. 거의 모든 애펜더는 프로그래밍 방식의 구성을 사용하여 테스트됩니다. 따라서 로그백 프로젝트 소스 코드에는 프로그래밍 방식의 appender 구성에 대한 많은 예제가 있습니다. logback-core appender는 logback-core / src / test / java를보고, logback-classic / src / test / java에서 logback-classic appender를 찾으십시오.
-
==============================
3.참고로 로거 작성 코드를 수정하려고 할 때 로거가 작동하려면 많은 규칙이 필요합니다.
참고로 로거 작성 코드를 수정하려고 할 때 로거가 작동하려면 많은 규칙이 필요합니다.
이 규칙은 slf4j / logback의 프로그램 적 구성 :
package testpackage import ch.qos.logback.classic.Level import ch.qos.logback.classic.Logger import ch.qos.logback.classic.LoggerContext import ch.qos.logback.classic.encoder.PatternLayoutEncoder import ch.qos.logback.core.ConsoleAppender import ch.qos.logback.core.rolling.RollingFileAppender import ch.qos.logback.core.rolling.TimeBasedRollingPolicy import org.slf4j.LoggerFactory class TestLogConfig { public static void main(String[] args) { LoggerContext logCtx = LoggerFactory.getILoggerFactory(); PatternLayoutEncoder logEncoder = new PatternLayoutEncoder(); logEncoder.setContext(logCtx); logEncoder.setPattern("%-12date{YYYY-MM-dd HH:mm:ss.SSS} %-5level - %msg%n"); logEncoder.start(); ConsoleAppender logConsoleAppender = new ConsoleAppender(); logConsoleAppender.setContext(logCtx); logConsoleAppender.setName("console"); logConsoleAppender.setEncoder(logEncoder); logConsoleAppender.start(); logEncoder = new PatternLayoutEncoder(); logEncoder.setContext(logCtx); logEncoder.setPattern("%-12date{YYYY-MM-dd HH:mm:ss.SSS} %-5level - %msg%n"); logEncoder.start(); RollingFileAppender logFileAppender = new RollingFileAppender(); logFileAppender.setContext(logCtx); logFileAppender.setName("logFile"); logFileAppender.setEncoder(logEncoder); logFileAppender.setAppend(true); logFileAppender.setFile("logs/logfile.log"); TimeBasedRollingPolicy logFilePolicy = new TimeBasedRollingPolicy(); logFilePolicy.setContext(logCtx); logFilePolicy.setParent(logFileAppender); logFilePolicy.setFileNamePattern("logs/logfile-%d{yyyy-MM-dd_HH}.log"); logFilePolicy.setMaxHistory(7); logFilePolicy.start(); logFileAppender.setRollingPolicy(logFilePolicy); logFileAppender.start(); Logger log = logCtx.getLogger("Main"); log.additive = false; log.level = Level.INFO; log.addAppender(logConsoleAppender); log.addAppender(logFileAppender); } }
-
==============================
4.누군가가 프로그래밍 방식 구성의 구체적인 예를 찾고 있다면.
누군가가 프로그래밍 방식 구성의 구체적인 예를 찾고 있다면.
여기에 ConsoleAppender의 문자셋을 설정합니다.
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); ConsoleAppender<ILoggingEvent> appender = (ConsoleAppender) lc.getLogger("appconsole").getAppender("STDOUT"); LayoutWrappingEncoder<ILoggingEvent> enc = (LayoutWrappingEncoder<ILoggingEvent>) appender.getEncoder(); enc.setCharset(Charset.forName("utf-8"));
그리고 내 logback.xml :
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <charset>866</charset> <pattern>[%level] %msg%n</pattern> </encoder> </appender> <logger name="appconsole"> <appender-ref ref="STDOUT" /> </logger>
프로그래밍 방식으로 로거를 구성해야하는 이유는 무엇입니까? 때문에, 내 애플 리케이션 (봄 부팅) jar 파일에 포장. 따라서 Logback.xml 파일은 항아리 안에 숨어있는 것처럼 보입니다. 그러나 포장을 풀고 변경하는 것이 편리하지 않아야합니다. 그리고 app.jar 옆에 logback.xml 파일이 필요하지 않습니다. 앱의 모든 구성 속성을 포함하는 app.yaml 파일 만 있습니다.
-
==============================
5.(아직?) 코멘트를 허용하지, 난 단지 세 가지 팁을 추가하고 싶습니다;
(아직?) 코멘트를 허용하지, 난 단지 세 가지 팁을 추가하고 싶습니다;
다음과 같은 간단한 개인 필터 클래스를 통한 라우팅
private static class ThresholdLoggerFilter extends Filter<ILoggingEvent> { private final Level level; private ThresholdLoggerFilter(Level level){ this.level = level; } @Override public FilterReply decide(ILoggingEvent event) { if (event.getLevel().isGreaterOrEqual(level)) { return FilterReply.NEUTRAL; } else { return FilterReply.DENY; } } }
myFilter.start () 및 myAppender.addFilter (myFilter);를 호출하면됩니다.
모니터링되는 일부 등록 정보 파일에 루트 로깅 수준을 유지하여 유효한 입력이있을 때마다이 서비스를 다음과 같이 구현하여 호출합니다.
@Override public void setRootLogLevel(Level level) { if (context != null && context.isStarted()) { ((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).setLevel(level); } }
내 새로운 루트 로거 수준.
from https://stackoverflow.com/questions/16910955/programmatically-configure-logback-appender by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @PathVariable을 사용한 스프링 MVC 주석 컨트롤러 인터페이스 (0) | 2018.12.18 |
---|---|
[SPRING] Spring annotation 기반 DI 대 XML 구성? (0) | 2018.12.18 |
[SPRING] 서로 다른 인수를 갖는 동일한 URL 패턴에 대해 두 개의 메소드를 작성하십시오. (0) | 2018.12.18 |
[SPRING] 다른 속성의 속성 - 자리 표시 자 위치 (0) | 2018.12.18 |
[SPRING] Spring의 Websocket 인증 및 권한 부여 (0) | 2018.12.18 |