diff --git a/logback-core/pom.xml b/logback-core/pom.xml
index d175fc6079..35ae1c6162 100755
--- a/logback-core/pom.xml
+++ b/logback-core/pom.xml
@@ -60,6 +60,11 @@
true
+
+ com.yammer.metrics
+ metrics-core
+ 1.0-hubspot-SNAPSHOT
+
org.mockito
diff --git a/logback-core/src/main/java/ch/qos/logback/core/LogbackMetrics.java b/logback-core/src/main/java/ch/qos/logback/core/LogbackMetrics.java
new file mode 100644
index 0000000000..3a785809f4
--- /dev/null
+++ b/logback-core/src/main/java/ch/qos/logback/core/LogbackMetrics.java
@@ -0,0 +1,29 @@
+package ch.qos.logback.core;
+
+import ch.qos.logback.core.rolling.helper.ArchiveRemoverReason;
+import ch.qos.logback.core.rolling.helper.FileNamePattern;
+import com.google.common.collect.ImmutableMap;
+import com.yammer.metrics.Metrics;
+import com.yammer.metrics.core.Counter;
+import com.yammer.metrics.core.Histogram;
+import com.yammer.metrics.core.MetricName;
+
+public class LogbackMetrics {
+ public static Counter getDeletedLogFilesCounter(ArchiveRemoverReason reason, FileNamePattern fileNamePattern) {
+ return Metrics.newCounter(
+ new MetricName(
+ LogbackMetrics.class,
+ "log-files-deleted",
+ ImmutableMap.of("reason", reason.name(), "fileNamePattern", fileNamePattern.getPattern())
+ )
+ );
+ }
+ public static Histogram getDeletedLogFileSizeHistogram(ArchiveRemoverReason reason, FileNamePattern fileNamePattern) {
+ return Metrics.newHistogram(
+ new MetricName(
+ LogbackMetrics.class,
+ "deleted-log-file-size",
+ ImmutableMap.of("reason", reason.name(), "fileNamePattern", fileNamePattern.getPattern())
+ ));
+ }
+}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/ArchiveRemoverReason.java b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/ArchiveRemoverReason.java
new file mode 100644
index 0000000000..8003a2c924
--- /dev/null
+++ b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/ArchiveRemoverReason.java
@@ -0,0 +1,6 @@
+package ch.qos.logback.core.rolling.helper;
+
+public enum ArchiveRemoverReason {
+ MAX_HISTORY, // Exceeded max age for an archived file
+ TOTAL_SIZE_CAP, // Exceeded total size of all archived files
+}
diff --git a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java
index 357e333790..a288034541 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java
@@ -12,6 +12,8 @@
package ch.qos.logback.core.rolling.helper;
import static ch.qos.logback.core.CoreConstants.UNBOUNDED_TOTAL_SIZE_CAP;
+import static ch.qos.logback.core.rolling.helper.ArchiveRemoverReason.MAX_HISTORY;
+import static ch.qos.logback.core.rolling.helper.ArchiveRemoverReason.TOTAL_SIZE_CAP;
import java.io.File;
import java.time.Instant;
@@ -19,6 +21,7 @@
import java.util.concurrent.Future;
import ch.qos.logback.core.CoreConstants;
+import ch.qos.logback.core.LogbackMetrics;
import ch.qos.logback.core.pattern.Converter;
import ch.qos.logback.core.pattern.LiteralConverter;
import ch.qos.logback.core.spi.ContextAwareBase;
@@ -114,6 +117,9 @@ private boolean checkAndDeleteFile(File f) {
addWarn("Cannot delete non existent file");
return false;
}
+
+ LogbackMetrics.getDeletedLogFilesCounter(MAX_HISTORY, fileNamePattern).inc();
+ LogbackMetrics.getDeletedLogFileSizeHistogram(MAX_HISTORY, fileNamePattern).update(f.length());
boolean result = f.delete();
if (!result) {
@@ -136,6 +142,11 @@ void capTotalSize(Instant now) {
// assume that deletion attempt will succeed.
totalRemoved += size;
+ LogbackMetrics.getDeletedLogFilesCounter(TOTAL_SIZE_CAP,
+ fileNamePattern).inc();
+ LogbackMetrics.getDeletedLogFileSizeHistogram(TOTAL_SIZE_CAP,
+ fileNamePattern).update(f.length());
+
checkAndDeleteFile(f);
}
totalSize += size;
diff --git a/logback-core/src/main/java/module-info.java b/logback-core/src/main/java/module-info.java
index 3ebdacaa80..13babd1f86 100644
--- a/logback-core/src/main/java/module-info.java
+++ b/logback-core/src/main/java/module-info.java
@@ -17,6 +17,8 @@
// optionally require jansi
requires static org.fusesource.jansi;
+ requires com.google.common;
+ requires metrics.core;
exports ch.qos.logback.core;
exports ch.qos.logback.core.boolex;