Skip to content

Commit

Permalink
Merge pull request #38 from fluent/issue37
Browse files Browse the repository at this point in the history
Fix FluentLoggerFactory to hold FluentLogger(s) over GC.
  • Loading branch information
oza committed Dec 7, 2014
2 parents 1d131e5 + 7cb9077 commit 857778c
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/main/java/org/fluentd/logger/FluentLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public static synchronized FluentLogger getLogger(String tagPrefix, String host,
/**
* the method is for testing
*/
static Map<String, FluentLogger> getLoggers() {
static Map<FluentLogger, String> getLoggers() {
return factory.getLoggers();
}

Expand Down
21 changes: 13 additions & 8 deletions src/main/java/org/fluentd/logger/FluentLoggerFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@

public class FluentLoggerFactory {

private final Map<String, FluentLogger> loggers;
private final Map<FluentLogger, String> loggers;

public FluentLoggerFactory() {
loggers = new WeakHashMap<String, FluentLogger>();
loggers = new WeakHashMap<FluentLogger, String>();
}

public FluentLogger getLogger(String tagPrefix) {
Expand All @@ -51,8 +51,13 @@ public FluentLogger getLogger(String tagPrefix, String host, int port, int timeo
public synchronized FluentLogger getLogger(String tagPrefix, String host, int port, int timeout, int bufferCapacity,
Reconnector reconnector) {
String key = String.format("%s_%s_%d_%d_%d", new Object[] { tagPrefix, host, port, timeout, bufferCapacity });
if (loggers.containsKey(key)) {
return loggers.get(key);
if (loggers.containsValue(key)) {
for (Map.Entry<FluentLogger, String> entry : loggers.entrySet()) {
if (entry.getValue().equals(key)) {
return entry.getKey();
}
}
throw new IllegalStateException();
} else {
Sender sender = null;
Properties props = System.getProperties();
Expand All @@ -68,7 +73,7 @@ public synchronized FluentLogger getLogger(String tagPrefix, String host, int po
}
}
FluentLogger logger = new FluentLogger(tagPrefix, sender);
loggers.put(key, logger);
loggers.put(logger, key);
return logger;
}
}
Expand All @@ -86,19 +91,19 @@ private Sender createSenderInstance(final String className, final Object[] param
/**
* the method is for testing
*/
Map<String, FluentLogger> getLoggers() {
Map<FluentLogger, String> getLoggers() {
return loggers;
}

public synchronized void closeAll() {
for (FluentLogger logger : loggers.values()) {
for (FluentLogger logger : loggers.keySet()) {
logger.close();
}
loggers.clear();
}

public synchronized void flushAll() {
for (FluentLogger logger : loggers.values()) {
for (FluentLogger logger : loggers.keySet()) {
logger.flush();
}
}
Expand Down
50 changes: 50 additions & 0 deletions src/test/java/org/fluentd/logger/TestFluentLogFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.fluentd.logger;

import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

public class TestFluentLogFactory {
private FluentLoggerFactory loggerFactory;

@Before
public void setup() {
loggerFactory = new FluentLoggerFactory();
}

@Test
public void testGetLogger() {
FluentLogger loggerA0 = loggerFactory.getLogger("tagprefix_a");
FluentLogger loggerA1 = loggerFactory.getLogger("tagprefix_a");
FluentLogger loggerB0 = loggerFactory.getLogger("tagprefix_b");
FluentLogger loggerA_lh0 = loggerFactory.getLogger("tagprefix_a", "localhost", 1234);
FluentLogger loggerA_lh1 = loggerFactory.getLogger("tagprefix_a", "127.0.0.1", 1234);
assertTrue(loggerA0 == loggerA1);
assertTrue(loggerA0 != loggerB0);
assertTrue(loggerA0 != loggerA_lh0);
assertTrue(loggerA_lh0 != loggerA_lh1);
}

@Test
public void testItHoldsLoggersOverGC() throws InterruptedException {
ArrayList<FluentLogger> loggers = new ArrayList<FluentLogger>();
for(int i=0; i<100; i++) {
loggers.add(loggerFactory.getLogger("testtag" + i, "localhost", 999));
}
System.gc();
Thread.sleep(1000);
assertEquals(loggers.size(), loggerFactory.getLoggers().size());

FluentLogger head = loggers.get(0);
FluentLogger tail = loggers.get(loggers.size() - 1);
loggers.clear();
System.gc();
Thread.sleep(1000);
assertEquals(2, loggerFactory.getLoggers().size());
}
}
2 changes: 1 addition & 1 deletion src/test/java/org/fluentd/logger/TestFluentLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ public void testClose() throws Exception {
FluentLogger.getLogger("tag2");
FluentLogger.getLogger("tag3");

Map<String, FluentLogger> loggers;
Map<FluentLogger, String> loggers;
{
loggers = FluentLogger.getLoggers();
assertEquals(3, loggers.size());
Expand Down

0 comments on commit 857778c

Please sign in to comment.