/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.configuration.bootstrap; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.util.regex.Pattern; /** * Keeps archival copies of log files. This was introduced as the configuration abilities of Log4J (like RollingFileAppender) to not cover * the desired behavior. * * @author Robert Mischke */ public final class LogArchiver { private static final Pattern CURRENT_LOG_FILE_PATTERN = Pattern.compile("^(\\w+)\\.(log(\\.\\d+)?)$"); private static final Pattern ARCHIVED_LOG_FILE_PATTERN = Pattern.compile("^(\\w+)\\.(previous\\.log(\\.\\d+)?)$"); private static final String CURRENT_TO_ARCHIVED_LOG_FILE_REPLACEMENT = "$1.previous.$2"; private LogArchiver() {} /** * Execute in the given directory. * * @param directory the directory to archive log files in */ public static void run(File directory) { deleteOldArchiveFiles(directory); archiveLastRunsLogs(directory); } private static void deleteOldArchiveFiles(File directory) { final PrintStream sysErr = System.err; // the log system is not available yet, so log errors to SysErr File[] oldArchiveFiles = directory.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.isFile() && ARCHIVED_LOG_FILE_PATTERN.matcher(file.getName()).matches(); } }); for (File oldFile : oldArchiveFiles) { try { Files.delete(oldFile.toPath()); if (oldFile.exists()) { sysErr.println("ERROR: Failed to delete archived log file " + oldFile.getAbsolutePath()); } } catch (IOException e) { sysErr.println("ERROR: Failed to delete archived log file " + oldFile.getAbsolutePath() + ": " + e.toString()); } } } private static void archiveLastRunsLogs(File directory) { final PrintStream sysErr = System.err; // the log system is not available yet, so log errors to SysErr File[] lastRunsLogs = directory.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.isFile() && CURRENT_LOG_FILE_PATTERN.matcher(file.getName()).matches(); } }); for (File logFile : lastRunsLogs) { final String oldName = logFile.getName(); final String newName = CURRENT_LOG_FILE_PATTERN.matcher(oldName).replaceFirst(CURRENT_TO_ARCHIVED_LOG_FILE_REPLACEMENT); final File archiveFile = new File(logFile.getParentFile(), newName); try { Files.move(logFile.toPath(), archiveFile.toPath()); } catch (IOException e) { sysErr.println("ERROR: Failed to archive the previous run's log file " + logFile.getAbsolutePath() + " as " + archiveFile.getAbsolutePath()); } } } }