Search in sources :

Example 1 with FileRenameAction

use of org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction in project logging-log4j2 by apache.

the class DefaultRolloverStrategy method purgeAscending.

/**
     * Purges and renames old log files in preparation for rollover. The oldest file will have the smallest index, the
     * newest the highest.
     *
     * @param lowIndex low index. Log file associated with low index will be deleted if needed.
     * @param highIndex high index.
     * @param manager The RollingFileManager
     * @return true if purge was successful and rollover should be attempted.
     */
private int purgeAscending(final int lowIndex, final int highIndex, final RollingFileManager manager) {
    final SortedMap<Integer, Path> eligibleFiles = getEligibleFiles(manager);
    final int maxFiles = highIndex - lowIndex + 1;
    boolean renameFiles = false;
    while (eligibleFiles.size() >= maxFiles) {
        try {
            LOGGER.debug("Eligible files: {}", eligibleFiles);
            Integer key = eligibleFiles.firstKey();
            LOGGER.debug("Deleting {}", eligibleFiles.get(key).toFile().getAbsolutePath());
            Files.delete(eligibleFiles.get(key));
            eligibleFiles.remove(key);
            renameFiles = true;
        } catch (IOException ioe) {
            LOGGER.error("Unable to delete {}, {}", eligibleFiles.firstKey(), ioe.getMessage(), ioe);
            break;
        }
    }
    final StringBuilder buf = new StringBuilder();
    if (renameFiles) {
        for (Map.Entry<Integer, Path> entry : eligibleFiles.entrySet()) {
            buf.setLength(0);
            // LOG4J2-531: directory scan & rollover must use same format
            manager.getPatternProcessor().formatFileName(strSubstitutor, buf, entry.getKey() - 1);
            String currentName = entry.getValue().toFile().getName();
            String renameTo = buf.toString();
            int suffixLength = suffixLength(renameTo);
            if (suffixLength > 0 && suffixLength(currentName) == 0) {
                renameTo = renameTo.substring(0, renameTo.length() - suffixLength);
            }
            Action action = new FileRenameAction(entry.getValue().toFile(), new File(renameTo), true);
            try {
                LOGGER.debug("DefaultRolloverStrategy.purgeAscending executing {}", action);
                if (!action.execute()) {
                    return -1;
                }
            } catch (final Exception ex) {
                LOGGER.warn("Exception during purge in RollingFileAppender", ex);
                return -1;
            }
        }
    }
    return eligibleFiles.size() > 0 ? (eligibleFiles.lastKey() < highIndex ? eligibleFiles.lastKey() + 1 : highIndex) : lowIndex;
}
Also used : Path(java.nio.file.Path) FileRenameAction(org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction) Action(org.apache.logging.log4j.core.appender.rolling.action.Action) IOException(java.io.IOException) IOException(java.io.IOException) FileRenameAction(org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction) Map(java.util.Map) SortedMap(java.util.SortedMap) File(java.io.File)

Example 2 with FileRenameAction

use of org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction in project logging-log4j2 by apache.

the class DefaultRolloverStrategy method purgeDescending.

/**
     * Purges and renames old log files in preparation for rollover. The newest file will have the smallest index, the
     * oldest will have the highest.
     *
     * @param lowIndex low index
     * @param highIndex high index. Log file associated with high index will be deleted if needed.
     * @param manager The RollingFileManager
     * @return true if purge was successful and rollover should be attempted.
     */
private int purgeDescending(final int lowIndex, final int highIndex, final RollingFileManager manager) {
    // Retrieve the files in descending order, so the highest key will be first.
    final SortedMap<Integer, Path> eligibleFiles = getEligibleFiles(manager, false);
    final int maxFiles = highIndex - lowIndex + 1;
    while (eligibleFiles.size() >= maxFiles) {
        try {
            Integer key = eligibleFiles.firstKey();
            Files.delete(eligibleFiles.get(key));
            eligibleFiles.remove(key);
        } catch (IOException ioe) {
            LOGGER.error("Unable to delete {}, {}", eligibleFiles.firstKey(), ioe.getMessage(), ioe);
            break;
        }
    }
    final StringBuilder buf = new StringBuilder();
    for (Map.Entry<Integer, Path> entry : eligibleFiles.entrySet()) {
        buf.setLength(0);
        // LOG4J2-531: directory scan & rollover must use same format
        manager.getPatternProcessor().formatFileName(strSubstitutor, buf, entry.getKey() + 1);
        String currentName = entry.getValue().toFile().getName();
        String renameTo = buf.toString();
        int suffixLength = suffixLength(renameTo);
        if (suffixLength > 0 && suffixLength(currentName) == 0) {
            renameTo = renameTo.substring(0, renameTo.length() - suffixLength);
        }
        Action action = new FileRenameAction(entry.getValue().toFile(), new File(renameTo), true);
        try {
            LOGGER.debug("DefaultRolloverStrategy.purgeDescending executing {}", action);
            if (!action.execute()) {
                return -1;
            }
        } catch (final Exception ex) {
            LOGGER.warn("Exception during purge in RollingFileAppender", ex);
            return -1;
        }
    }
    return lowIndex;
}
Also used : Path(java.nio.file.Path) FileRenameAction(org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction) Action(org.apache.logging.log4j.core.appender.rolling.action.Action) IOException(java.io.IOException) IOException(java.io.IOException) FileRenameAction(org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction) Map(java.util.Map) SortedMap(java.util.SortedMap) File(java.io.File)

Example 3 with FileRenameAction

use of org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction in project logging-log4j2 by apache.

the class DefaultRolloverStrategy method rollover.

/**
     * Performs the rollover.
     *
     * @param manager The RollingFileManager name for current active log file.
     * @return A RolloverDescription.
     * @throws SecurityException if an error occurs.
     */
@Override
public RolloverDescription rollover(final RollingFileManager manager) throws SecurityException {
    int fileIndex;
    if (minIndex == Integer.MIN_VALUE) {
        final SortedMap<Integer, Path> eligibleFiles = getEligibleFiles(manager);
        fileIndex = eligibleFiles.size() > 0 ? eligibleFiles.lastKey() + 1 : 1;
    } else {
        if (maxIndex < 0) {
            return null;
        }
        final long startNanos = System.nanoTime();
        fileIndex = purge(minIndex, maxIndex, manager);
        if (fileIndex < 0) {
            return null;
        }
        if (LOGGER.isTraceEnabled()) {
            final double durationMillis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos);
            LOGGER.trace("DefaultRolloverStrategy.purge() took {} milliseconds", durationMillis);
        }
    }
    final StringBuilder buf = new StringBuilder(255);
    manager.getPatternProcessor().formatFileName(strSubstitutor, buf, fileIndex);
    final String currentFileName = manager.getFileName();
    String renameTo = buf.toString();
    final String compressedName = renameTo;
    Action compressAction = null;
    FileExtension fileExtension = manager.getFileExtension();
    if (fileExtension != null) {
        renameTo = renameTo.substring(0, renameTo.length() - fileExtension.length());
        compressAction = fileExtension.createCompressAction(renameTo, compressedName, true, compressionLevel);
    }
    if (currentFileName.equals(renameTo)) {
        LOGGER.warn("Attempt to rename file {} to itself will be ignored", currentFileName);
        return new RolloverDescriptionImpl(currentFileName, false, null, null);
    }
    final FileRenameAction renameAction = new FileRenameAction(new File(currentFileName), new File(renameTo), manager.isRenameEmptyFiles());
    final Action asyncAction = merge(compressAction, customActions, stopCustomActionsOnError);
    return new RolloverDescriptionImpl(currentFileName, false, renameAction, asyncAction);
}
Also used : Path(java.nio.file.Path) FileRenameAction(org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction) Action(org.apache.logging.log4j.core.appender.rolling.action.Action) FileRenameAction(org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction) File(java.io.File)

Aggregations

File (java.io.File)3 Path (java.nio.file.Path)3 Action (org.apache.logging.log4j.core.appender.rolling.action.Action)3 FileRenameAction (org.apache.logging.log4j.core.appender.rolling.action.FileRenameAction)3 IOException (java.io.IOException)2 Map (java.util.Map)2 SortedMap (java.util.SortedMap)2