001/*
002 * (C) Copyright 2017-2018 Nuxeo (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Thomas Roger
018 */
019package org.nuxeo.runtime.test.runner;
020
021import org.apache.logging.log4j.Level;
022import org.apache.logging.log4j.core.Logger;
023import org.apache.logging.log4j.core.LoggerContext;
024import org.apache.logging.log4j.core.appender.ConsoleAppender;
025import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
026import org.apache.logging.log4j.core.filter.ThresholdFilter;
027
028/**
029 * @since 9.3
030 */
031public class LogFeature implements RunnerFeature {
032
033    protected static final String CONSOLE_APPENDER = "CONSOLE";
034
035    protected static final String CONSOLE_LOG_FEATURE_APPENDER = "CONSOLE_LOG_FEATURE";
036
037    protected ConsoleAppender consoleAppender;
038
039    protected ConsoleAppender hiddenAppender;
040
041    public void hideWarningFromConsoleLog() {
042        setConsoleLogThreshold(Level.ERROR.toString());
043    }
044
045    /**
046     * @since 9.10
047     */
048    public void hideErrorFromConsoleLog() {
049        setConsoleLogThreshold(Level.FATAL.toString());
050    }
051
052    /**
053     * @since 9.10
054     */
055    public void setConsoleLogThreshold(String level) {
056        if (consoleAppender != null) {
057            return;
058        }
059
060        Logger rootLogger = LoggerContext.getContext(false).getRootLogger();
061        consoleAppender = (ConsoleAppender) rootLogger.getAppenders().get(CONSOLE_APPENDER);
062        rootLogger.removeAppender(consoleAppender);
063        ConsoleAppender newAppender = ConsoleAppender.newBuilder()
064                                                     .withName(CONSOLE_LOG_FEATURE_APPENDER)
065                                                     .setTarget(Target.SYSTEM_OUT)
066                                                     .withFilter(ThresholdFilter.createFilter(Level.toLevel(level),
067                                                             null, null))
068                                                     .build();
069        newAppender.start();
070        rootLogger.addAppender(newAppender);
071        hiddenAppender = newAppender;
072    }
073
074    public void restoreConsoleLog() {
075        if (consoleAppender == null) {
076            return;
077        }
078
079        Logger rootLogger = LoggerContext.getContext(false).getRootLogger();
080        rootLogger.removeAppender(hiddenAppender);
081        rootLogger.addAppender(consoleAppender);
082        consoleAppender = null;
083        hiddenAppender = null;
084    }
085
086}