Skip to content

Commit 1f3f307

Browse files
Release 1.3.1: Fixes resource leak with reading properties file, fixes potential issue with formatter
1 parent 346c555 commit 1f3f307

6 files changed

Lines changed: 79 additions & 38 deletions

File tree

src/main/java/com/teragrep/jla_04/RelpConfig.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ private void initLogger() {
7474
try {
7575
inputStream = new FileInputStream(configpath);
7676
LogManager.getLogManager().readConfiguration(inputStream);
77+
inputStream.close();
7778
} catch (Exception e) {
7879
e.printStackTrace();
7980
}
@@ -83,15 +84,10 @@ private void initLogger() {
8384
private void initFormatter() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
8485
// Get normal prop and fallback to manager prop; from that fallback to simple formatter
8586
String formatter_name = System.getProperty("java.util.logging.RelpHandler." + this.getName() + ".formatter", this.manager.getProperty("java.util.logging.RelpHandler." + this.getName() + ".formatter"));
86-
if(formatter_name != null) {
87-
ClassLoader classloader = ClassLoader.getSystemClassLoader();
88-
if (classloader == null) {
89-
System.out.println("Unable to initialize ClassLoader.getSystemClassLoader(), defaulting to SimpleFormatter");
90-
}
91-
if (classloader != null) {
92-
Object formatter_object = classloader.loadClass(formatter_name).newInstance();
93-
this.formatter = (Formatter) formatter_object;
94-
}
87+
ClassLoader classloader = ClassLoader.getSystemClassLoader();
88+
if (classloader != null && formatter_name != null) {
89+
Object formatter_object = classloader.loadClass(formatter_name).newInstance();
90+
this.formatter = (Formatter) formatter_object;
9591
}
9692
else {
9793
this.formatter = new SimpleFormatter() {

src/main/java/com/teragrep/jla_04/RelpHandler.java

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ public class RelpHandler extends Handler {
3636
private RelpBatch batch;
3737
private RelpConfig config;
3838
boolean connected = false;
39-
Formatter formatter;
4039

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

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

66-
private void initFormatter(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
67-
String formatter_value = System.getProperty("java.util.logging.RelpHandler." + name + ".formatter");
68-
ClassLoader classloader = ClassLoader.getSystemClassLoader();
69-
if(classloader == null) {
70-
System.out.println("Unable to initialize ClassLoader.getSystemClassLoader(), defaulting to SimpleFormatter");
71-
}
72-
if (classloader != null && formatter_value != null) {
73-
Object formatter_object = classloader.loadClass(formatter_value).newInstance();
74-
this.formatter = (Formatter) formatter_object;
75-
}
76-
else {
77-
this.formatter = new SimpleFormatter() {
78-
@Override
79-
public synchronized String format(LogRecord logrecord) {
80-
return String.format("%1$s", logrecord.getMessage());
81-
}
82-
};
83-
}
84-
}
85-
86-
@Override
87-
public synchronized void setFormatter(Formatter formatter) {
88-
this.formatter = formatter;
89-
}
90-
9164
@Override
9265
public synchronized void publish(LogRecord logRecord) {
9366
// Discards logs with lower than configured logging level

src/test/java/com/teragrep/jla_04/InputVerificationTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import org.junit.jupiter.api.*;
2121

22+
import java.util.Properties;
2223
import java.util.logging.LogManager;
2324
import java.util.logging.Logger;
2425

@@ -39,18 +40,24 @@ public void testHandler(RelpHandler handler, Boolean failure, String message) {
3940
public void testEmptyValues() {
4041
Assertions.assertThrows(IllegalArgumentException.class, () -> {
4142
// Empty address
43+
Properties default_props = (Properties) System.getProperties().clone();
4244
System.setProperty("java.util.logging.RelpHandler.emptyaddress.server.address", "");
4345
System.setProperty("java.util.logging.RelpHandler.emptyaddress.server.port", "1666");
4446
System.setProperty("java.util.logging.RelpHandler.emptyaddress.appname", "emptyaddress");
4547
testHandler(new RelpHandler("emptyaddress"), true, "Empty address");
48+
System.getProperties().clear();
49+
System.setProperties(default_props);
4650
});
4751

4852
Assertions.assertThrows(IllegalArgumentException.class, () -> {
4953
// Empty appname
54+
Properties default_props = (Properties) System.getProperties().clone();
5055
System.setProperty("java.util.logging.RelpHandler.emptyappname.server.address", "127.0.0.1");
5156
System.setProperty("java.util.logging.RelpHandler.emptyappname.server.port", "1666");
5257
System.setProperty("java.util.logging.RelpHandler.emptyappname.appname", "");
5358
testHandler(new RelpHandler("emptyappname"), true, "Empty appname");
59+
System.getProperties().clear();
60+
System.setProperties(default_props);
5461
});
5562
}
5663

@@ -59,23 +66,32 @@ public void testEmptyValues() {
5966
public void testMissingProperties() {
6067
Assertions.assertDoesNotThrow(() -> {
6168
// No address
69+
Properties default_props = (Properties) System.getProperties().clone();
6270
System.setProperty("java.util.logging.RelpHandler.missingaddress.server.port", "1666");
6371
System.setProperty("java.util.logging.RelpHandler.missingaddress.appname", "missingaddress");
6472
testHandler(new RelpHandler("missingaddress"), false, "Missing address");
73+
System.getProperties().clear();
74+
System.setProperties(default_props);
6575
});
6676

6777
Assertions.assertDoesNotThrow(() -> {
6878
// No port
79+
Properties default_props = (Properties) System.getProperties().clone();
6980
System.setProperty("java.util.logging.RelpHandler.missingport.server.address", "127.0.0.1");
7081
System.setProperty("java.util.logging.RelpHandler.missingport.appname", "missingport");
7182
testHandler(new RelpHandler("missingport"), false, "Missing port");
83+
System.getProperties().clear();
84+
System.setProperties(default_props);
7285
});
7386

7487
Assertions.assertDoesNotThrow(() -> {
7588
// No appname
89+
Properties default_props = (Properties) System.getProperties().clone();
7690
System.setProperty("java.util.logging.RelpHandler.missingappname.server.address", "127.0.0.1");
7791
System.setProperty("java.util.logging.RelpHandler.missingappname.server.port", "1666");
7892
testHandler(new RelpHandler("missingappname"), false, "Missing appname");
93+
System.getProperties().clear();
94+
System.setProperties(default_props);
7995
});
8096
}
8197

@@ -84,18 +100,24 @@ public void testMissingProperties() {
84100
public void testInvalidPortRangeValues() {
85101
Assertions.assertThrows(IllegalArgumentException.class, () -> {
86102
// Port is too small
103+
Properties default_props = (Properties) System.getProperties().clone();
87104
System.setProperty("java.util.logging.RelpHandler.smallport.server.address", "127.0.0.1");
88105
System.setProperty("java.util.logging.RelpHandler.smallport.server.port", "-3");
89106
System.setProperty("java.util.logging.RelpHandler.smallport.appname", "smallport");
90107
testHandler(new RelpHandler("smallport"), true,"Small port");
108+
System.getProperties().clear();
109+
System.setProperties(default_props);
91110
});
92111

93112
Assertions.assertThrows(IllegalArgumentException.class, () -> {
94113
// Port is too big
114+
Properties default_props = (Properties) System.getProperties().clone();
95115
System.setProperty("java.util.logging.RelpHandler.bigport.server.address", "127.0.0.1");
96116
System.setProperty("java.util.logging.RelpHandler.bigport.server.port", "123456");
97117
System.setProperty("java.util.logging.RelpHandler.bigport.appname", "bigport");
98118
testHandler(new RelpHandler("bigport"), true,"Big port");
119+
System.getProperties().clear();
120+
System.setProperties(default_props);
99121
});
100122
}
101123

@@ -104,10 +126,13 @@ public void testInvalidPortRangeValues() {
104126
public void testNonNumericPortValue() {
105127
Assertions.assertThrows(NumberFormatException.class, () -> {
106128
// Port is not numeric
129+
Properties default_props = (Properties) System.getProperties().clone();
107130
System.setProperty("java.util.logging.RelpHandler.invalidport.server.address", "127.0.0.1");
108131
System.setProperty("java.util.logging.RelpHandler.invalidport.server.port", "NotNumeric");
109132
System.setProperty("java.util.logging.RelpHandler.invalidport.appname", "invalidport");
110133
testHandler(new RelpHandler("invalidport"), true,"Invalid port");
134+
System.getProperties().clear();
135+
System.setProperties(default_props);
111136
});
112137
}
113138

@@ -116,10 +141,13 @@ public void testNonNumericPortValue() {
116141
public void testEmptyLoggerName() {
117142
Assertions.assertThrows(IllegalArgumentException.class, () -> {
118143
// Logger name is empty
144+
Properties default_props = (Properties) System.getProperties().clone();
119145
System.setProperty("java.util.logging.RelpHandler.emptylogger.server.address", "127.0.0.1");
120146
System.setProperty("java.util.logging.RelpHandler.emptylogger.server.port", "1666");
121147
System.setProperty("java.util.logging.RelpHandler.emptylogger.appname", "emptylogger");
122148
testHandler(new RelpHandler(""), true,"Empty logger name");
149+
System.getProperties().clear();
150+
System.setProperties(default_props);
123151
});
124152
}
125153

@@ -128,20 +156,26 @@ public void testEmptyLoggerName() {
128156
public void testInvalidReconnectInterval() {
129157
Assertions.assertThrows(IllegalArgumentException.class, () -> {
130158
// Interval is set but empty
159+
Properties default_props = (Properties) System.getProperties().clone();
131160
System.setProperty("java.util.logging.RelpHandler.intervalempty.server.address", "127.0.0.1");
132161
System.setProperty("java.util.logging.RelpHandler.intervalempty.server.port", "1666");
133162
System.setProperty("java.util.logging.RelpHandler.intervalempty.appname", "intervalempty");
134163
System.setProperty("java.util.logging.RelpHandler.intervalempty.server.reconnectInterval", "");
135164
testHandler(new RelpHandler("intervalempty"), true,"Empty interval");
165+
System.getProperties().clear();
166+
System.setProperties(default_props);
136167
});
137168

138169
Assertions.assertThrows(IllegalArgumentException.class, () -> {
139170
// Interval is invalid
171+
Properties default_props = (Properties) System.getProperties().clone();
140172
System.setProperty("java.util.logging.RelpHandler.intervalinvalid.server.address", "127.0.0.1");
141173
System.setProperty("java.util.logging.RelpHandler.intervalinvalid.server.port", "1666");
142174
System.setProperty("java.util.logging.RelpHandler.intervalinvalid.appname", "intervalinvalid");
143175
System.setProperty("java.util.logging.RelpHandler.intervalinvalid.server.reconnectInterval", "-13");
144176
testHandler(new RelpHandler("intervalinvalid"), true,"Invalid interval");
177+
System.getProperties().clear();
178+
System.setProperties(default_props);
145179
});
146180
}
147181

@@ -150,11 +184,14 @@ public void testInvalidReconnectInterval() {
150184
public void testInvalidFormatterValue() {
151185
Assertions.assertThrows(java.lang.ClassNotFoundException.class, () -> {
152186
// Formatter is invalid
187+
Properties default_props = (Properties) System.getProperties().clone();
153188
System.setProperty("java.util.logging.RelpHandler.invalidformatter.server.address", "127.0.0.1");
154189
System.setProperty("java.util.logging.RelpHandler.invalidformatter.server.port", "1666");
155190
System.setProperty("java.util.logging.RelpHandler.invalidformatter.appname", "invalidformatter");
156191
System.setProperty("java.util.logging.RelpHandler.invalidformatter.formatter", "java.util.class.doesnt.exist");
157192
testHandler(new RelpHandler("invalidformatter"), true,"Invalid Formatter");
193+
System.getProperties().clear();
194+
System.setProperties(default_props);
158195
});
159196
}
160197
}

src/test/java/com/teragrep/jla_04/PrebuiltTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.io.FileNotFoundException;
2626
import java.io.IOException;
2727
import java.io.InputStream;
28+
import java.util.Properties;
2829
import java.util.logging.LogManager;
2930
import java.util.logging.Logger;
3031

@@ -34,6 +35,7 @@ public class PrebuiltTest {
3435
@DisplayName("Tests all from properties")
3536
public void testFullyFromProperties() {
3637
Assertions.assertDoesNotThrow(() -> {
38+
Properties default_props = (Properties) System.getProperties().clone();
3739
LogManager.getLogManager().reset();
3840
InputStream inputStream = null;
3941
try {
@@ -47,8 +49,9 @@ public void testFullyFromProperties() {
4749
catch (IOException e) {
4850
System.out.println("Can't read conf/logging.properties: " + e.getMessage());
4951
}
50-
5152
logger.info("I should be from fully.properties");
53+
System.getProperties().clear();
54+
System.setProperties(default_props);
5255
});
5356
}
5457
}

src/test/java/com/teragrep/jla_04/PropertiesFileTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.junit.jupiter.api.DisplayName;
2222
import org.junit.jupiter.api.Test;
2323

24+
import java.util.Properties;
2425
import java.util.logging.LogManager;
2526
import java.util.logging.Logger;
2627

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

4145
}
@@ -44,24 +48,30 @@ public void testReadPropertiesFile() {
4448
@DisplayName("Tests reading properties file and overriding values")
4549
public void testOverridePropertiesFile() {
4650
Assertions.assertDoesNotThrow(() -> {
51+
Properties default_props = (Properties) System.getProperties().clone();
4752
System.setProperty("java.util.logging.config.file", System.getProperty("user.dir") + "/src/test/java/com/teragrep/jla_04//logging.properties");
4853
System.setProperty("java.util.logging.RelpHandler.fromprops-override.hostname", "fromprops-hostname-overridden");
4954
RelpHandler handler = new RelpHandler("fromprops-override");
5055
LogManager.getLogManager().reset();
5156
logger.addHandler(handler);
5257
logger.info("I am from properties file but overridden");
58+
System.getProperties().clear();
59+
System.setProperties(default_props);
5360
});
5461
}
5562

5663
//@Test
5764
@DisplayName("Tests reading properties file and getting formatter")
5865
public void testGettingFormatter() {
5966
Assertions.assertDoesNotThrow(() -> {
67+
Properties default_props = (Properties) System.getProperties().clone();
6068
System.setProperty("java.util.logging.config.file", System.getProperty("user.dir") + "/src/test/java/com/teragrep/jla_04//logging.properties");
6169
RelpHandler handler = new RelpHandler("fromprops-formatter");
6270
LogManager.getLogManager().reset();
6371
logger.addHandler(handler);
6472
logger.info("My formatter should be from logging.properties");
73+
System.getProperties().clear();
74+
System.setProperties(default_props);
6575
});
6676
}
6777
}

0 commit comments

Comments
 (0)