Logback Logger의 래퍼로 작동하는 클래스를 작성하고 있습니다. 특히 감사 로깅을 용이하게하는 것입니다. 사람들이 가져 와서 사용할 수 있어야하는 독립적 인 라이브러리 여야합니다. 내가 가진 문제는 프로그램 적으로 LogBack을 선언하는 데 필요한 최소한의 문서화와 관련이 있습니다. 다른 스택 오버플로 질문 (Setting Logback Appender path programmatically)에 대한 일반 선언을 기반으로합니다.Logback 감사 로거 래퍼 만들기
현재 정의한 내용은 다음과 같습니다. 현재 마커 필터가 작동하는 데 문제가 있습니다. 그것은 마커 필터처럼, 내가 선언 한 것처럼 아무것도하지 않는다. 궁극적으로 감사 로깅을 제외하고 다른 정보가 감사 로그 파일에 기록되지 않도록해야합니다. 그것이 내가 불일치에 대해 거부하는 이유입니다. 내 테스트에서 그것은 단지 무시된다는 것으로 보인다.
프로그래밍 방식으로 생성 된 Logback 파일에 관한 모든 정보 또는 지침이 많은 도움이 될 것입니다. 또한 사용자가 내 클래스를 사용하여 감사 로깅을 수행 한 다음 Logback.xml이 자체로 별도의 로깅을 수행 할 때 걱정해야 할 사항이 있습니까? 당신이
import ch.qos.logback.classic.Level;
import ch.qos.logback.core.spi.FilterReply;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.filter.EvaluatorFilter;
import ch.qos.logback.classic.boolex.OnMarkerEvaluator;
public class AuditLogger {
private static Logger logbackLogger;
final static Marker AUDIT = MarkerFactory.getMarker("AUDIT");
static {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
RollingFileAppender rfAppender = new RollingFileAppender();
rfAppender.setContext(loggerContext);
rfAppender.setFile("auditLogFile.currentDay.log");
TimeBasedRollingPolicy rollingPolicy = new TimeBasedRollingPolicy();
rollingPolicy.setContext(loggerContext);
// rolling policies need to know their parent
// it's one of the rare cases, where a sub-component knows about its parent
rollingPolicy.setParent(rfAppender);
rollingPolicy.setFileNamePattern("auditLogFile.%d{yyyy-MM-dd}.log");
rollingPolicy.start();
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("[%d{ISO8601}] %5marker - %msg%n");
encoder.start();
rfAppender.setEncoder(encoder);
rfAppender.setRollingPolicy(rollingPolicy);
rfAppender.start();
EvaluatorFilter evalFilter= new EvaluatorFilter();
OnMarkerEvaluator markerEval= new OnMarkerEvaluator();
markerEval.addMarker("AUDIT");
evalFilter.setEvaluator(markerEval);
evalFilter.setOnMatch(FilterReply.ACCEPT);
evalFilter.setOnMismatch(FilterReply.DENY);
rfAppender.addFilter(evalFilter);
logbackLogger = loggerContext.getLogger("AUDIT_LOGGER");
logbackLogger.addAppender(rfAppender);
logbackLogger.setLevel(Level.DEBUG);
}
public AuditLogger(){}
public void log(String msg){
logbackLogger.debug(AUDIT, msg);
}
}
그래서 저는 EvaluatorFilter와 OnMarkerEvaluator를 "start()"해야한다고 알았습니다. 이 두 문장 ("evalFilter.start()"및 "markerEval.start()")을 넣으면 필터가 작동합니다. 프로그래밍 방식으로 생성 된 로그백 구성과 기본 xml 둘 다 상호 작용하는 방법에 대한 자세한 정보를 찾고 있습니다. – JDP10101