diff --git a/README.md b/README.md
index 9cf953e..6f98de0 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,7 @@ In your `logback.xml`:
false
104857600
3
+ 100
30000
250
false
@@ -104,6 +105,7 @@ Configuration Reference
* `errorsToStderr` (optional, default false): If set to `true`, any errors in communicating with Elasticsearch will also be dumped to stderr (normally they are only reported to the internal Logback Status system, in order to prevent a feedback loop)
* `logsToStderr` (optional, default false): If set to `true`, dump the raw Elasticsearch messages to stderr
* `maxQueueSize` (optional, default 104,857,600 = 200MB): Maximum size (in characters) of the send buffer. After this point, *logs will be dropped*. This should only happen if Elasticsearch is down, but this is a self-protection mechanism to ensure that the logging system doesn't cause the main process to run out of memory. Note that this maximum is approximate; once the maximum is hit, no new logs will be accepted until it shrinks, but any logs already accepted to be processed will still be added to the buffer
+ * `maxEvents` (optional, default -1 i.e. not limited): Maximum amount of logging events to be stored for later sending.
* `loggerName` (optional): If set, raw ES-formatted log data will be sent to this logger
* `errorLoggerName` (optional): If set, any internal errors or problems will be logged to this logger
* `rawJsonMessage` (optional, default false): If set to `true`, the log message is interpreted as pre-formatted raw JSON message.
diff --git a/src/main/java/com/internetitem/logback/elasticsearch/AbstractElasticsearchAppender.java b/src/main/java/com/internetitem/logback/elasticsearch/AbstractElasticsearchAppender.java
index b0e7cb1..e5f7604 100644
--- a/src/main/java/com/internetitem/logback/elasticsearch/AbstractElasticsearchAppender.java
+++ b/src/main/java/com/internetitem/logback/elasticsearch/AbstractElasticsearchAppender.java
@@ -138,4 +138,8 @@ public void setAuthentication(Authentication auth) {
public void setMaxMessageSize(int maxMessageSize) {
settings.setMaxMessageSize(maxMessageSize);
}
+
+ public void setMaxEvents(int maxEvents) {
+ settings.setMaxEvents(maxEvents);
+ }
}
diff --git a/src/main/java/com/internetitem/logback/elasticsearch/AbstractElasticsearchPublisher.java b/src/main/java/com/internetitem/logback/elasticsearch/AbstractElasticsearchPublisher.java
index 98d7034..3bf8dff 100644
--- a/src/main/java/com/internetitem/logback/elasticsearch/AbstractElasticsearchPublisher.java
+++ b/src/main/java/com/internetitem/logback/elasticsearch/AbstractElasticsearchPublisher.java
@@ -104,8 +104,12 @@ public void addEvent(T event) {
return;
}
+ int max = settings.getMaxEvents();
synchronized (lock) {
events.add(event);
+ if (max > 0 && events.size() > max) {
+ events.subList(0, events.size() - max).clear();
+ }
if (!working) {
working = true;
Thread thread = new Thread(this, THREAD_NAME_PREFIX + THREAD_COUNTER.getAndIncrement());
diff --git a/src/main/java/com/internetitem/logback/elasticsearch/config/Settings.java b/src/main/java/com/internetitem/logback/elasticsearch/config/Settings.java
index e349b47..719f2e9 100644
--- a/src/main/java/com/internetitem/logback/elasticsearch/config/Settings.java
+++ b/src/main/java/com/internetitem/logback/elasticsearch/config/Settings.java
@@ -23,6 +23,7 @@ public class Settings {
private int maxQueueSize = 100 * 1024 * 1024;
private Authentication authentication;
private int maxMessageSize = -1;
+ private int maxEvents = -1;
public String getIndex() {
return index;
@@ -162,4 +163,12 @@ public int getMaxMessageSize() {
public void setMaxMessageSize(int maxMessageSize) {
this.maxMessageSize = maxMessageSize;
}
+
+ public int getMaxEvents() {
+ return maxEvents;
+ }
+
+ public void setMaxEvents(int maxEvents) {
+ this.maxEvents = maxEvents;
+ }
}