Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/de/tosox/zonerelay/ApplicationModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ UserSettings provideUserSettings(UserSettingsManager manager) {
@Provides
@Singleton
LogManager provideLogManager(JTextPane outputPane, AppPaths paths, UserSettings settings) {
return new LogManager(outputPane, paths.getLogsDir(), settings.getLogLevel());
return new LogManager(outputPane, paths.getLogsDir(), settings.getLogLevel(), settings.getLogRetentionCount());
}

@Provides
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,30 @@ public class UserSettings {
private static final String DEFAULT_LANGUAGE = "en-US";
private static final LogLevel DEFAULT_LOGLEVEL = LogLevel.INFO;
private static final ArchiveCleanupStrategy DEFAULT_CLEANUP = ArchiveCleanupStrategy.KEEP_LATEST_ONLY;
private static final int DEFAULT_LOG_RETENTION_COUNT = 10;

private final String language;
private final LogLevel logLevel;
private final ArchiveCleanupStrategy archiveCleanupStrategy;
private final int logRetentionCount;

public UserSettings() {
this.language = DEFAULT_LANGUAGE;
this.logLevel = DEFAULT_LOGLEVEL;
this.archiveCleanupStrategy = DEFAULT_CLEANUP;
this.logRetentionCount = DEFAULT_LOG_RETENTION_COUNT;
}

@JsonCreator
public UserSettings(
@JsonProperty("language") String language,
@JsonProperty("logLevel") LogLevel logLevel,
@JsonProperty("archiveCleanupStrategy") ArchiveCleanupStrategy archiveCleanupStrategy) {
@JsonProperty("archiveCleanupStrategy") ArchiveCleanupStrategy archiveCleanupStrategy,
@JsonProperty("logRetentionCount") Integer logRetentionCount) {
this.language = language != null ? language : DEFAULT_LANGUAGE;
this.logLevel = logLevel != null ? logLevel : DEFAULT_LOGLEVEL;
this.archiveCleanupStrategy = archiveCleanupStrategy != null ? archiveCleanupStrategy : DEFAULT_CLEANUP;
this.logRetentionCount = logRetentionCount != null ? logRetentionCount : DEFAULT_LOG_RETENTION_COUNT;
}

public static UserSettings defaults() {
Expand Down
22 changes: 20 additions & 2 deletions src/main/java/de/tosox/zonerelay/shared/logging/LogManager.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,32 @@
package de.tosox.zonerelay.shared.logging;

import lombok.Getter;
import org.apache.commons.io.FileUtils;

import javax.swing.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import java.util.List;

@Getter
public class LogManager {
private final Path logFolder;
private final Logger fileLogger;
private final Logger uiLogger;
private final int logRetentionCount;

public LogManager(JTextPane outputPane, Path logsDir, LogLevel logLevel) {
public LogManager(JTextPane outputPane, Path logsDir, LogLevel logLevel, int logRetentionCount) {
this.logRetentionCount = logRetentionCount;
this.logFolder = createRunLogFolder(logsDir);
this.fileLogger = new FileLogger(logFolder.resolve("app.log"), logLevel);
this.uiLogger = new UILogger(outputPane);
}

private Path createRunLogFolder(Path baseDir) {
// TODO: Clean up log directories
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss");
String folderName = "log_" + formatter.format(LocalDateTime.now());
Path folder = baseDir.resolve(folderName);
Expand All @@ -31,6 +35,20 @@ private Path createRunLogFolder(Path baseDir) {
} catch (IOException e) {
throw new RuntimeException("Could not create log folder: " + folder, e);
}
pruneOldLogFolders(baseDir);
return folder;
}

private void pruneOldLogFolders(Path baseDir) {
try (var stream = Files.list(baseDir)) {
List<Path> runs = stream
.filter(p -> Files.isDirectory(p) && p.getFileName().toString().startsWith("log_"))
.sorted(Comparator.comparing(p -> p.getFileName().toString()))
.toList();
int excess = runs.size() - logRetentionCount;
for (int i = 0; i < excess; i++) {
FileUtils.deleteDirectory(runs.get(i).toFile());
}
} catch (IOException ignored) {}
}
}
Loading