Delete merge remainders Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/c337f9b9 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/c337f9b9 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/c337f9b9
Branch: refs/heads/master Commit: c337f9b922b41f4329ede25546765a6586675742 Parents: 9075473 Author: rpopma <[email protected]> Authored: Fri Nov 27 13:01:51 2015 +0900 Committer: rpopma <[email protected]> Committed: Fri Nov 27 13:01:51 2015 +0900 ---------------------------------------------------------------------- .../core/appender/AbstractManager.java.orig | 166 --------- .../rolling/RollingFileManager.java.orig | 343 ------------------- .../RollingRandomAccessFileManager.java.orig | 252 -------------- 3 files changed, 761 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c337f9b9/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java.orig ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java.orig b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java.orig deleted file mode 100644 index d256a4f..0000000 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java.orig +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.logging.log4j.core.appender; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.message.Message; -import org.apache.logging.log4j.status.StatusLogger; - -/** - * Abstract base class used to register managers. - */ -public abstract class AbstractManager { - - /** - * Allow subclasses access to the status logger without creating another instance. - */ - protected static final Logger LOGGER = StatusLogger.getLogger(); - - // Need to lock that map instead of using a ConcurrentMap due to stop removing the - // manager from the map and closing the stream, requiring the whole stop method to be locked. - private static final Map<String, AbstractManager> MAP = new HashMap<>(); - - private static final Lock LOCK = new ReentrantLock(); - - /** - * Number of Appenders using this manager. - */ - protected int count; - - private final String name; - - protected AbstractManager(final String name) { - this.name = name; - LOGGER.debug("Starting {} {}", this.getClass().getSimpleName(), name); - } - - /** - * Retrieves a Manager if it has been previously created or creates a new Manager. - * @param name The name of the Manager to retrieve. - * @param factory The Factory to use to create the Manager. - * @param data An Object that should be passed to the factory when creating the Manager. - * @param <M> The Type of the Manager to be created. - * @param <T> The type of the Factory data. - * @return A Manager with the specified name and type. - */ - public static <M extends AbstractManager, T> M getManager(final String name, final ManagerFactory<M, T> factory, - final T data) { - LOCK.lock(); - try { - @SuppressWarnings("unchecked") - M manager = (M) MAP.get(name); - if (manager == null) { - manager = factory.createManager(name, data); - if (manager == null) { - throw new IllegalStateException("ManagerFactory [" + factory + "] unable to create manager for [" - + name + "] with data [" + data + "]"); - } - MAP.put(name, manager); - } - manager.count++; - return manager; - } finally { - LOCK.unlock(); - } - } - - /** - * Determines if a Manager with the specified name exists. - * @param name The name of the Manager. - * @return True if the Manager exists, false otherwise. - */ - public static boolean hasManager(final String name) { - LOCK.lock(); - try { - return MAP.containsKey(name); - } finally { - LOCK.unlock(); - } - } - - /** - * May be overridden by Managers to perform processing while the Manager is being released and the - * lock is held. - */ - protected void releaseSub() { - } - - protected int getCount() { - return count; - } - - /** - * Called to signify that this Manager is no longer required by an Appender. - */ - public void release() { - LOCK.lock(); - try { - --count; - if (count <= 0) { - MAP.remove(name); - LOGGER.debug("Shutting down {} {}", this.getClass().getSimpleName(), getName()); - releaseSub(); - } - } finally { - LOCK.unlock(); - } - } - - /** - * Returns the name of the Manager. - * @return The name of the Manager. - */ - public String getName() { - return name; - } - - /** - * Provide a description of the content format supported by this Manager. Default implementation returns an empty - * (unspecified) Map. - * - * @return a Map of key/value pairs describing the Manager-specific content format, or an empty Map if no content - * format descriptors are specified. - */ - public Map<String, String> getContentFormat() { - return new HashMap<>(); - } - - protected void log(Level level, String message, Throwable throwable) { - Message m = LOGGER.getMessageFactory().newMessage("{} {} {}: {}", - getClass().getSimpleName(), getName(), message, throwable); - LOGGER.log(level, m, throwable); - } - - protected void logDebug(String message, Throwable throwable) { - log(Level.DEBUG, message, throwable); - } - - protected void logError(String message, Throwable throwable) { - log(Level.ERROR, message, throwable); - } - - protected void logWarn(String message, Throwable throwable) { - log(Level.WARN, message, throwable); - } - -} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c337f9b9/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java.orig ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java.orig b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java.orig deleted file mode 100644 index 608f2e8..0000000 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingFileManager.java.orig +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.logging.log4j.core.appender.rolling; - -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.Serializable; -import java.util.concurrent.Semaphore; - -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.FileManager; -import org.apache.logging.log4j.core.appender.ManagerFactory; -import org.apache.logging.log4j.core.appender.rolling.action.AbstractAction; -import org.apache.logging.log4j.core.appender.rolling.action.Action; -import org.apache.logging.log4j.core.util.Log4jThread; - -/** - * The Rolling File Manager. - */ -public class RollingFileManager extends FileManager { - - private static RollingFileManagerFactory factory = new RollingFileManagerFactory(); - - private long size; - private long initialTime; - private final PatternProcessor patternProcessor; - private final Semaphore semaphore = new Semaphore(1); - private final TriggeringPolicy triggeringPolicy; - private final RolloverStrategy rolloverStrategy; - - protected RollingFileManager(final String fileName, final String pattern, final OutputStream os, - final boolean append, final long size, final long time, final TriggeringPolicy triggeringPolicy, - final RolloverStrategy rolloverStrategy, final String advertiseURI, - final Layout<? extends Serializable> layout, final int bufferSize, final boolean writeHeader) { - super(fileName, os, append, false, advertiseURI, layout, bufferSize, writeHeader); - this.size = size; - this.initialTime = time; - this.triggeringPolicy = triggeringPolicy; - this.rolloverStrategy = rolloverStrategy; - this.patternProcessor = new PatternProcessor(pattern); - triggeringPolicy.initialize(this); - } - - /** - * Returns a RollingFileManager. - * @param fileName The file name. - * @param pattern The pattern for rolling file. - * @param append true if the file should be appended to. - * @param bufferedIO true if data should be buffered. - * @param policy The TriggeringPolicy. - * @param strategy The RolloverStrategy. - * @param advertiseURI the URI to use when advertising the file - * @param layout The Layout. - * @param bufferSize buffer size to use if bufferedIO is true - * @return A RollingFileManager. - */ - public static RollingFileManager getFileManager(final String fileName, final String pattern, final boolean append, - final boolean bufferedIO, final TriggeringPolicy policy, final RolloverStrategy strategy, - final String advertiseURI, final Layout<? extends Serializable> layout, final int bufferSize) { - - return (RollingFileManager) getManager(fileName, new FactoryData(pattern, append, - bufferedIO, policy, strategy, advertiseURI, layout, bufferSize), factory); - } - - @Override - protected synchronized void write(final byte[] bytes, final int offset, final int length) { - size += length; - super.write(bytes, offset, length); - } - - /** - * Returns the current size of the file. - * @return The size of the file in bytes. - */ - public long getFileSize() { - return size; - } - - /** - * Returns the time the file was created. - * @return The time the file was created. - */ - public long getFileTime() { - return initialTime; - } - - /** - * Determine if a rollover should occur. - * @param event The LogEvent. - */ - public synchronized void checkRollover(final LogEvent event) { - if (triggeringPolicy.isTriggeringEvent(event)) { - rollover(); - } - } - - public synchronized void rollover() { - if (rollover(rolloverStrategy)) { - try { - size = 0; - initialTime = System.currentTimeMillis(); - createFileAfterRollover(); - } catch (final IOException e) { - logError("failed to create file after rollover", e); - } - } - } - - protected void createFileAfterRollover() throws IOException { - final OutputStream os = new FileOutputStream(getFileName(), isAppend()); - if (getBufferSize() > 0) { // negative buffer size means no buffering - setOutputStream(new BufferedOutputStream(os, getBufferSize())); - } else { - setOutputStream(os); - } - } - - /** - * Returns the pattern processor. - * @return The PatternProcessor. - */ - public PatternProcessor getPatternProcessor() { - return patternProcessor; - } - - /** - * Returns the triggering policy. - * @param <T> TriggeringPolicy type - * @return The TriggeringPolicy - */ - public <T extends TriggeringPolicy> T getTriggeringPolicy() { - // TODO We could parameterize this class with a TriggeringPolicy instead of type casting here. - return (T) this.triggeringPolicy; - } - - /** - * Returns the rollover strategy. - * @return The RolloverStrategy - */ - public RolloverStrategy getRolloverStrategy() { - return this.rolloverStrategy; - } - - private boolean rollover(final RolloverStrategy strategy) { - - try { - // Block until the asynchronous operation is completed. - semaphore.acquire(); - } catch (final InterruptedException e) { - logError("Thread interrupted while attempting to check rollover", e); - return false; - } - - boolean success = false; - Thread thread = null; - - try { - final RolloverDescription descriptor = strategy.rollover(this); - if (descriptor != null) { - writeFooter(); - close(); - if (descriptor.getSynchronous() != null) { - LOGGER.debug("RollingFileManager executing synchronous {}", descriptor.getSynchronous()); - try { - success = descriptor.getSynchronous().execute(); - } catch (final Exception ex) { - logError("caught error in synchronous task", ex); - } - } - - if (success && descriptor.getAsynchronous() != null) { - LOGGER.debug("RollingFileManager executing async {}", descriptor.getAsynchronous()); - thread = new Log4jThread(new AsyncAction(descriptor.getAsynchronous(), this)); - thread.start(); - } - return true; - } - return false; - } finally { - if (thread == null || !thread.isAlive()) { - semaphore.release(); - } - } - - } - - /** - * Performs actions asynchronously. - */ - private static class AsyncAction extends AbstractAction { - - private final Action action; - private final RollingFileManager manager; - - /** - * Constructor. - * @param act The action to perform. - * @param manager The manager. - */ - public AsyncAction(final Action act, final RollingFileManager manager) { - this.action = act; - this.manager = manager; - } - - /** - * Perform an action. - * - * @return true if action was successful. A return value of false will cause - * the rollover to be aborted if possible. - * @throws java.io.IOException if IO error, a thrown exception will cause the rollover - * to be aborted if possible. - */ - @Override - public boolean execute() throws IOException { - try { - return action.execute(); - } finally { - manager.semaphore.release(); - } - } - - /** - * Cancels the action if not already initialized or waits till completion. - */ - @Override - public void close() { - action.close(); - } - - /** - * Determines if action has been completed. - * - * @return true if action is complete. - */ - @Override - public boolean isComplete() { - return action.isComplete(); - } - } - - /** - * Factory data. - */ - private static class FactoryData { - private final String pattern; - private final boolean append; - private final boolean bufferedIO; - private final int bufferSize; - private final TriggeringPolicy policy; - private final RolloverStrategy strategy; - private final String advertiseURI; - private final Layout<? extends Serializable> layout; - - /** - * Create the data for the factory. - * @param pattern The pattern. - * @param append The append flag. - * @param bufferedIO The bufferedIO flag. - * @param advertiseURI - * @param layout The Layout. - * @param bufferSize the buffer size - */ - public FactoryData(final String pattern, final boolean append, final boolean bufferedIO, - final TriggeringPolicy policy, final RolloverStrategy strategy, final String advertiseURI, - final Layout<? extends Serializable> layout, final int bufferSize) { - this.pattern = pattern; - this.append = append; - this.bufferedIO = bufferedIO; - this.bufferSize = bufferSize; - this.policy = policy; - this.strategy = strategy; - this.advertiseURI = advertiseURI; - this.layout = layout; - } - } - - /** - * Factory to create a RollingFileManager. - */ - private static class RollingFileManagerFactory implements ManagerFactory<RollingFileManager, FactoryData> { - - /** - * Create the RollingFileManager. - * @param name The name of the entity to manage. - * @param data The data required to create the entity. - * @return a RollingFileManager. - */ - @Override - public RollingFileManager createManager(final String name, final FactoryData data) { - final File file = new File(name); - final File parent = file.getParentFile(); - if (null != parent && !parent.exists()) { - parent.mkdirs(); - } - // LOG4J2-1140: check writeHeader before creating the file - final boolean writeHeader = !data.append || !file.exists(); - try { - file.createNewFile(); - } catch (final IOException ioe) { - LOGGER.error("Unable to create file " + name, ioe); - return null; - } - final long size = data.append ? file.length() : 0; - - OutputStream os; - try { - os = new FileOutputStream(name, data.append); - int bufferSize = data.bufferSize; - if (data.bufferedIO) { - os = new BufferedOutputStream(os, bufferSize); - } else { - bufferSize = -1; // negative buffer size signals bufferedIO was configured false - } - final long time = file.lastModified(); // LOG4J2-531 create file first so time has valid value - return new RollingFileManager(name, data.pattern, os, data.append, size, time, data.policy, - data.strategy, data.advertiseURI, data.layout, bufferSize, writeHeader); - } catch (final FileNotFoundException ex) { - LOGGER.error("FileManager (" + name + ") " + ex); - } - return null; - } - } - -} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c337f9b9/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java.orig ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java.orig b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java.orig deleted file mode 100644 index dc3261e..0000000 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/RollingRandomAccessFileManager.java.orig +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.logging.log4j.core.appender.rolling; - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import java.io.Serializable; -import java.nio.ByteBuffer; - -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.appender.AppenderLoggingException; -import org.apache.logging.log4j.core.appender.ManagerFactory; -import org.apache.logging.log4j.core.util.NullOutputStream; - -/** - * Extends RollingFileManager but instead of using a buffered output stream, this class uses a {@code ByteBuffer} and a - * {@code RandomAccessFile} to do the I/O. - */ -public class RollingRandomAccessFileManager extends RollingFileManager { - /** - * The default buffer size. - */ - public static final int DEFAULT_BUFFER_SIZE = 256 * 1024; - - private static final RollingRandomAccessFileManagerFactory FACTORY = new RollingRandomAccessFileManagerFactory(); - - private final boolean isImmediateFlush; - private RandomAccessFile randomAccessFile; - private final ByteBuffer buffer; - private final ThreadLocal<Boolean> isEndOfBatch = new ThreadLocal<>(); - - public RollingRandomAccessFileManager(final RandomAccessFile raf, final String fileName, final String pattern, - final OutputStream os, final boolean append, final boolean immediateFlush, final int bufferSize, - final long size, final long time, final TriggeringPolicy policy, final RolloverStrategy strategy, - final String advertiseURI, final Layout<? extends Serializable> layout, final boolean writeHeader) { - super(fileName, pattern, os, append, size, time, policy, strategy, advertiseURI, layout, bufferSize, - writeHeader); - this.isImmediateFlush = immediateFlush; - this.randomAccessFile = raf; - isEndOfBatch.set(Boolean.FALSE); - this.buffer = ByteBuffer.allocate(bufferSize); - writeHeader(); - } - - /** - * Writes the layout's header to the file if it exists. - */ - private void writeHeader() { - if (layout == null) { - return; - } - final byte[] header = layout.getHeader(); - if (header == null) { - return; - } - try { - // write to the file, not to the buffer: the buffer may not be empty - randomAccessFile.write(header, 0, header.length); - } catch (final IOException e) { - logError("unable to write header", e); - } - } - - public static RollingRandomAccessFileManager getRollingRandomAccessFileManager(final String fileName, - final String filePattern, final boolean isAppend, final boolean immediateFlush, final int bufferSize, - final TriggeringPolicy policy, final RolloverStrategy strategy, final String advertiseURI, - final Layout<? extends Serializable> layout) { - return (RollingRandomAccessFileManager) getManager(fileName, new FactoryData(filePattern, isAppend, - immediateFlush, bufferSize, policy, strategy, advertiseURI, layout), FACTORY); - } - - public Boolean isEndOfBatch() { - return isEndOfBatch.get(); - } - - public void setEndOfBatch(final boolean endOfBatch) { - this.isEndOfBatch.set(Boolean.valueOf(endOfBatch)); - } - - @Override - protected synchronized void write(final byte[] bytes, int offset, int length) { - super.write(bytes, offset, length); // writes to dummy output stream, needed to track file size - - int chunk = 0; - do { - if (length > buffer.remaining()) { - flush(); - } - chunk = Math.min(length, buffer.remaining()); - buffer.put(bytes, offset, chunk); - offset += chunk; - length -= chunk; - } while (length > 0); - - if (isImmediateFlush || isEndOfBatch.get() == Boolean.TRUE) { - flush(); - } - } - - @Override - protected void createFileAfterRollover() throws IOException { - this.randomAccessFile = new RandomAccessFile(getFileName(), "rw"); - if (isAppend()) { - randomAccessFile.seek(randomAccessFile.length()); - } - writeHeader(); - } - - @Override - public synchronized void flush() { - buffer.flip(); - try { - randomAccessFile.write(buffer.array(), 0, buffer.limit()); - } catch (final IOException ex) { - final String msg = "Error writing to RandomAccessFile " + getName(); - throw new AppenderLoggingException(msg, ex); - } - buffer.clear(); - } - - @Override - public synchronized void close() { - flush(); - try { - randomAccessFile.close(); - } catch (final IOException e) { - logError("unable to close RandomAccessFile", e); - } - } - - /** - * Returns the buffer capacity. - * - * @return the buffer size - */ - @Override - public int getBufferSize() { - return buffer.capacity(); - } - - /** - * Factory to create a RollingRandomAccessFileManager. - */ - private static class RollingRandomAccessFileManagerFactory implements - ManagerFactory<RollingRandomAccessFileManager, FactoryData> { - - /** - * Create the RollingRandomAccessFileManager. - * - * @param name The name of the entity to manage. - * @param data The data required to create the entity. - * @return a RollingFileManager. - */ - @Override - public RollingRandomAccessFileManager createManager(final String name, final FactoryData data) { - final File file = new File(name); - final File parent = file.getParentFile(); - if (null != parent && !parent.exists()) { - parent.mkdirs(); - } - - if (!data.append) { - file.delete(); - } - final long size = data.append ? file.length() : 0; - final long time = file.exists() ? file.lastModified() : System.currentTimeMillis(); - - final boolean writeHeader = !data.append || !file.exists(); - RandomAccessFile raf = null; - try { - raf = new RandomAccessFile(name, "rw"); - if (data.append) { - final long length = raf.length(); - LOGGER.trace("RandomAccessFile {} seek to {}", name, length); - raf.seek(length); - } else { - LOGGER.trace("RandomAccessFile {} set length to 0", name); - raf.setLength(0); - } - return new RollingRandomAccessFileManager(raf, name, data.pattern, NullOutputStream.NULL_OUTPUT_STREAM, - data.append, data.immediateFlush, data.bufferSize, size, time, data.policy, data.strategy, - data.advertiseURI, data.layout, writeHeader); - } catch (final IOException ex) { - LOGGER.error("Cannot access RandomAccessFile {}) " + ex); - if (raf != null) { - try { - raf.close(); - } catch (final IOException e) { - LOGGER.error("Cannot close RandomAccessFile {}", name, e); - } - } - } - return null; - } - } - - /** - * Factory data. - */ - private static class FactoryData { - private final String pattern; - private final boolean append; - private final boolean immediateFlush; - private final int bufferSize; - private final TriggeringPolicy policy; - private final RolloverStrategy strategy; - private final String advertiseURI; - private final Layout<? extends Serializable> layout; - - /** - * Create the data for the factory. - * - * @param pattern The pattern. - * @param append The append flag. - * @param immediateFlush - * @param bufferSize - * @param policy - * @param strategy - * @param advertiseURI - * @param layout - */ - public FactoryData(final String pattern, final boolean append, final boolean immediateFlush, - final int bufferSize, final TriggeringPolicy policy, final RolloverStrategy strategy, - final String advertiseURI, final Layout<? extends Serializable> layout) { - this.pattern = pattern; - this.append = append; - this.immediateFlush = immediateFlush; - this.bufferSize = bufferSize; - this.policy = policy; - this.strategy = strategy; - this.advertiseURI = advertiseURI; - this.layout = layout; - } - } - -}
