Skip to content

Commit

Permalink
Release 1.3.1: Fixes resource leak with reading properties file, fixe…
Browse files Browse the repository at this point in the history
…s potential issue with formatter
  • Loading branch information
StrongestNumber9 committed Dec 20, 2021
1 parent 346c555 commit 1f3f307
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 38 deletions.
14 changes: 5 additions & 9 deletions src/main/java/com/teragrep/jla_04/RelpConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ private void initLogger() {
try {
inputStream = new FileInputStream(configpath);
LogManager.getLogManager().readConfiguration(inputStream);
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
Expand All @@ -83,15 +84,10 @@ private void initLogger() {
private void initFormatter() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
// Get normal prop and fallback to manager prop; from that fallback to simple formatter
String formatter_name = System.getProperty("java.util.logging.RelpHandler." + this.getName() + ".formatter", this.manager.getProperty("java.util.logging.RelpHandler." + this.getName() + ".formatter"));
if(formatter_name != null) {
ClassLoader classloader = ClassLoader.getSystemClassLoader();
if (classloader == null) {
System.out.println("Unable to initialize ClassLoader.getSystemClassLoader(), defaulting to SimpleFormatter");
}
if (classloader != null) {
Object formatter_object = classloader.loadClass(formatter_name).newInstance();
this.formatter = (Formatter) formatter_object;
}
ClassLoader classloader = ClassLoader.getSystemClassLoader();
if (classloader != null && formatter_name != null) {
Object formatter_object = classloader.loadClass(formatter_name).newInstance();
this.formatter = (Formatter) formatter_object;
}
else {
this.formatter = new SimpleFormatter() {
Expand Down
27 changes: 0 additions & 27 deletions src/main/java/com/teragrep/jla_04/RelpHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ public class RelpHandler extends Handler {
private RelpBatch batch;
private RelpConfig config;
boolean connected = false;
Formatter formatter;

// No arguments defaults to 'default' logger
public RelpHandler() throws NumberFormatException, NoSuchFieldException, IOException, TimeoutException, ClassNotFoundException, InstantiationException, IllegalAccessException {
Expand All @@ -53,7 +52,6 @@ public RelpHandler(String name) throws NumberFormatException, NoSuchFieldExcepti
private void initialize(String name) throws NoSuchFieldException, IOException, TimeoutException, ClassNotFoundException, InstantiationException, IllegalAccessException {
// All relevant onetime-setup configurations and their validations are in RelpConfig
this.config = new RelpConfig(name);
initFormatter(name);

// Connect
this.relpConnection = new RelpConnection();
Expand All @@ -63,31 +61,6 @@ private void initialize(String name) throws NoSuchFieldException, IOException, T
connect();
}

private void initFormatter(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
String formatter_value = System.getProperty("java.util.logging.RelpHandler." + name + ".formatter");
ClassLoader classloader = ClassLoader.getSystemClassLoader();
if(classloader == null) {
System.out.println("Unable to initialize ClassLoader.getSystemClassLoader(), defaulting to SimpleFormatter");
}
if (classloader != null && formatter_value != null) {
Object formatter_object = classloader.loadClass(formatter_value).newInstance();
this.formatter = (Formatter) formatter_object;
}
else {
this.formatter = new SimpleFormatter() {
@Override
public synchronized String format(LogRecord logrecord) {
return String.format("%1$s", logrecord.getMessage());
}
};
}
}

@Override
public synchronized void setFormatter(Formatter formatter) {
this.formatter = formatter;
}

@Override
public synchronized void publish(LogRecord logRecord) {
// Discards logs with lower than configured logging level
Expand Down
37 changes: 37 additions & 0 deletions src/test/java/com/teragrep/jla_04/InputVerificationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import org.junit.jupiter.api.*;

import java.util.Properties;
import java.util.logging.LogManager;
import java.util.logging.Logger;

Expand All @@ -39,18 +40,24 @@ public void testHandler(RelpHandler handler, Boolean failure, String message) {
public void testEmptyValues() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
// Empty address
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.emptyaddress.server.address", "");
System.setProperty("java.util.logging.RelpHandler.emptyaddress.server.port", "1666");
System.setProperty("java.util.logging.RelpHandler.emptyaddress.appname", "emptyaddress");
testHandler(new RelpHandler("emptyaddress"), true, "Empty address");
System.getProperties().clear();
System.setProperties(default_props);
});

Assertions.assertThrows(IllegalArgumentException.class, () -> {
// Empty appname
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.emptyappname.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.emptyappname.server.port", "1666");
System.setProperty("java.util.logging.RelpHandler.emptyappname.appname", "");
testHandler(new RelpHandler("emptyappname"), true, "Empty appname");
System.getProperties().clear();
System.setProperties(default_props);
});
}

Expand All @@ -59,23 +66,32 @@ public void testEmptyValues() {
public void testMissingProperties() {
Assertions.assertDoesNotThrow(() -> {
// No address
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.missingaddress.server.port", "1666");
System.setProperty("java.util.logging.RelpHandler.missingaddress.appname", "missingaddress");
testHandler(new RelpHandler("missingaddress"), false, "Missing address");
System.getProperties().clear();
System.setProperties(default_props);
});

Assertions.assertDoesNotThrow(() -> {
// No port
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.missingport.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.missingport.appname", "missingport");
testHandler(new RelpHandler("missingport"), false, "Missing port");
System.getProperties().clear();
System.setProperties(default_props);
});

Assertions.assertDoesNotThrow(() -> {
// No appname
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.missingappname.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.missingappname.server.port", "1666");
testHandler(new RelpHandler("missingappname"), false, "Missing appname");
System.getProperties().clear();
System.setProperties(default_props);
});
}

Expand All @@ -84,18 +100,24 @@ public void testMissingProperties() {
public void testInvalidPortRangeValues() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
// Port is too small
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.smallport.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.smallport.server.port", "-3");
System.setProperty("java.util.logging.RelpHandler.smallport.appname", "smallport");
testHandler(new RelpHandler("smallport"), true,"Small port");
System.getProperties().clear();
System.setProperties(default_props);
});

Assertions.assertThrows(IllegalArgumentException.class, () -> {
// Port is too big
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.bigport.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.bigport.server.port", "123456");
System.setProperty("java.util.logging.RelpHandler.bigport.appname", "bigport");
testHandler(new RelpHandler("bigport"), true,"Big port");
System.getProperties().clear();
System.setProperties(default_props);
});
}

Expand All @@ -104,10 +126,13 @@ public void testInvalidPortRangeValues() {
public void testNonNumericPortValue() {
Assertions.assertThrows(NumberFormatException.class, () -> {
// Port is not numeric
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.invalidport.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.invalidport.server.port", "NotNumeric");
System.setProperty("java.util.logging.RelpHandler.invalidport.appname", "invalidport");
testHandler(new RelpHandler("invalidport"), true,"Invalid port");
System.getProperties().clear();
System.setProperties(default_props);
});
}

Expand All @@ -116,10 +141,13 @@ public void testNonNumericPortValue() {
public void testEmptyLoggerName() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
// Logger name is empty
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.emptylogger.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.emptylogger.server.port", "1666");
System.setProperty("java.util.logging.RelpHandler.emptylogger.appname", "emptylogger");
testHandler(new RelpHandler(""), true,"Empty logger name");
System.getProperties().clear();
System.setProperties(default_props);
});
}

Expand All @@ -128,20 +156,26 @@ public void testEmptyLoggerName() {
public void testInvalidReconnectInterval() {
Assertions.assertThrows(IllegalArgumentException.class, () -> {
// Interval is set but empty
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.intervalempty.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.intervalempty.server.port", "1666");
System.setProperty("java.util.logging.RelpHandler.intervalempty.appname", "intervalempty");
System.setProperty("java.util.logging.RelpHandler.intervalempty.server.reconnectInterval", "");
testHandler(new RelpHandler("intervalempty"), true,"Empty interval");
System.getProperties().clear();
System.setProperties(default_props);
});

Assertions.assertThrows(IllegalArgumentException.class, () -> {
// Interval is invalid
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.intervalinvalid.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.intervalinvalid.server.port", "1666");
System.setProperty("java.util.logging.RelpHandler.intervalinvalid.appname", "intervalinvalid");
System.setProperty("java.util.logging.RelpHandler.intervalinvalid.server.reconnectInterval", "-13");
testHandler(new RelpHandler("intervalinvalid"), true,"Invalid interval");
System.getProperties().clear();
System.setProperties(default_props);
});
}

Expand All @@ -150,11 +184,14 @@ public void testInvalidReconnectInterval() {
public void testInvalidFormatterValue() {
Assertions.assertThrows(java.lang.ClassNotFoundException.class, () -> {
// Formatter is invalid
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.RelpHandler.invalidformatter.server.address", "127.0.0.1");
System.setProperty("java.util.logging.RelpHandler.invalidformatter.server.port", "1666");
System.setProperty("java.util.logging.RelpHandler.invalidformatter.appname", "invalidformatter");
System.setProperty("java.util.logging.RelpHandler.invalidformatter.formatter", "java.util.class.doesnt.exist");
testHandler(new RelpHandler("invalidformatter"), true,"Invalid Formatter");
System.getProperties().clear();
System.setProperties(default_props);
});
}
}
5 changes: 4 additions & 1 deletion src/test/java/com/teragrep/jla_04/PrebuiltTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.logging.LogManager;
import java.util.logging.Logger;

Expand All @@ -34,6 +35,7 @@ public class PrebuiltTest {
@DisplayName("Tests all from properties")
public void testFullyFromProperties() {
Assertions.assertDoesNotThrow(() -> {
Properties default_props = (Properties) System.getProperties().clone();
LogManager.getLogManager().reset();
InputStream inputStream = null;
try {
Expand All @@ -47,8 +49,9 @@ public void testFullyFromProperties() {
catch (IOException e) {
System.out.println("Can't read conf/logging.properties: " + e.getMessage());
}

logger.info("I should be from fully.properties");
System.getProperties().clear();
System.setProperties(default_props);
});
}
}
10 changes: 10 additions & 0 deletions src/test/java/com/teragrep/jla_04/PropertiesFileTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.Properties;
import java.util.logging.LogManager;
import java.util.logging.Logger;

Expand All @@ -31,11 +32,14 @@ public class PropertiesFileTest {
@DisplayName("Tests reading properties file")
public void testReadPropertiesFile() {
Assertions.assertDoesNotThrow(() -> {
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.config.file", System.getProperty("user.dir") + "/src/test/java/com/teragrep/jla_04//logging.properties");
RelpHandler handler = new RelpHandler("fromprops");
LogManager.getLogManager().reset();
logger.addHandler(handler);
logger.info("I am from properties file");
System.getProperties().clear();
System.setProperties(default_props);
});

}
Expand All @@ -44,24 +48,30 @@ public void testReadPropertiesFile() {
@DisplayName("Tests reading properties file and overriding values")
public void testOverridePropertiesFile() {
Assertions.assertDoesNotThrow(() -> {
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.config.file", System.getProperty("user.dir") + "/src/test/java/com/teragrep/jla_04//logging.properties");
System.setProperty("java.util.logging.RelpHandler.fromprops-override.hostname", "fromprops-hostname-overridden");
RelpHandler handler = new RelpHandler("fromprops-override");
LogManager.getLogManager().reset();
logger.addHandler(handler);
logger.info("I am from properties file but overridden");
System.getProperties().clear();
System.setProperties(default_props);
});
}

//@Test
@DisplayName("Tests reading properties file and getting formatter")
public void testGettingFormatter() {
Assertions.assertDoesNotThrow(() -> {
Properties default_props = (Properties) System.getProperties().clone();
System.setProperty("java.util.logging.config.file", System.getProperty("user.dir") + "/src/test/java/com/teragrep/jla_04//logging.properties");
RelpHandler handler = new RelpHandler("fromprops-formatter");
LogManager.getLogManager().reset();
logger.addHandler(handler);
logger.info("My formatter should be from logging.properties");
System.getProperties().clear();
System.setProperties(default_props);
});
}
}
Loading

0 comments on commit 1f3f307

Please sign in to comment.