001
014
015 package com.liferay.portal.test.log;
016
017 import com.liferay.portal.kernel.util.ReflectionUtil;
018
019 import java.io.Closeable;
020
021 import java.lang.reflect.Field;
022
023 import java.util.List;
024 import java.util.concurrent.CopyOnWriteArrayList;
025
026 import org.apache.log4j.AppenderSkeleton;
027 import org.apache.log4j.Category;
028 import org.apache.log4j.Level;
029 import org.apache.log4j.Logger;
030 import org.apache.log4j.spi.LoggingEvent;
031
032
035 public class CaptureAppender extends AppenderSkeleton implements Closeable {
036
037 public CaptureAppender(Logger logger) {
038 _logger = logger;
039
040 _level = _logger.getLevel();
041
042 _parentCategory = logger.getParent();
043
044 try {
045 _parentField.set(_logger, null);
046 }
047 catch (Exception e) {
048 throw new RuntimeException(e);
049 }
050 }
051
052 @Override
053 public void close() {
054 _logger.removeAppender(this);
055
056 _logger.setLevel(_level);
057
058 try {
059 _parentField.set(_logger, _parentCategory);
060 }
061 catch (Exception e) {
062 throw new RuntimeException(e);
063 }
064 }
065
066 public List<LoggingEvent> getLoggingEvents() {
067 return _loggingEvents;
068 }
069
070 @Override
071 public boolean requiresLayout() {
072 return false;
073 }
074
075 @Override
076 protected void append(LoggingEvent loggingEvent) {
077 _loggingEvents.add(loggingEvent);
078 }
079
080 private static final Field _parentField;
081
082 static {
083 try {
084 _parentField = ReflectionUtil.getDeclaredField(
085 Category.class, "parent");
086 }
087 catch (Exception e) {
088 throw new ExceptionInInitializerError(e);
089 }
090 }
091
092 private final Level _level;
093 private final Logger _logger;
094 private final List<LoggingEvent> _loggingEvents =
095 new CopyOnWriteArrayList<>();
096 private final Category _parentCategory;
097
098 }