| // Copyright (C) 2013 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.gerrit.testutil.log; |
| |
| import org.apache.log4j.Appender; |
| import org.apache.log4j.LogManager; |
| import org.apache.log4j.Logger; |
| import org.apache.log4j.spi.LoggingEvent; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Enumeration; |
| import java.util.List; |
| |
| public class LogUtil { |
| /** |
| * Change logger's setting so it only logs to a collection. |
| * |
| * @param logName Name of the logger to modify. |
| * @param collection The collection to log into. |
| * @return The logger's original settings. |
| */ |
| public static LoggerSettings logToCollection(String logName, |
| Collection<LoggingEvent> collection) { |
| Logger logger = LogManager.getLogger(logName); |
| LoggerSettings loggerSettings = new LoggerSettings(logger); |
| logger.removeAllAppenders(); |
| logger.setAdditivity(false); |
| CollectionAppender listAppender = new CollectionAppender(collection); |
| logger.addAppender(listAppender); |
| return loggerSettings; |
| } |
| |
| /** |
| * Capsule for a logger's settings that get mangled by rerouting logging to a collection |
| */ |
| public static class LoggerSettings { |
| private final boolean additive; |
| private final List<Appender> appenders; |
| |
| /** |
| * Read off logger settings from an instance. |
| * |
| * @param logger The logger to read the settings off from. |
| */ |
| private LoggerSettings(Logger logger) { |
| this.additive = logger.getAdditivity(); |
| |
| Enumeration<?> appenders = logger.getAllAppenders(); |
| this.appenders = new ArrayList<>(); |
| while (appenders.hasMoreElements()) { |
| Object appender = appenders.nextElement(); |
| if (appender instanceof Appender) { |
| this.appenders.add((Appender)appender); |
| } else { |
| throw new RuntimeException("getAllAppenders of " + logger |
| + " contained an object that is not an Appender"); |
| } |
| } |
| } |
| |
| /** |
| * Pushes this settings back onto a logger. |
| * |
| * @param logger the logger on which to push the settings. |
| */ |
| public void pushOntoLogger(Logger logger) { |
| logger.setAdditivity(additive); |
| |
| logger.removeAllAppenders(); |
| for (Appender appender : appenders) { |
| logger.addAppender(appender); |
| } |
| } |
| } |
| } |