Skip to content

Commit 68e9d29

Browse files
committed
Merge branch 'fix-main-logger-static-block' into 'main'
handle logging exception in static block See merge request weblogic-cloud/weblogic-kubernetes-operator!5053
2 parents dfca030 + 7394ef7 commit 68e9d29

File tree

1 file changed

+45
-18
lines changed

1 file changed

+45
-18
lines changed

operator/src/main/java/oracle/kubernetes/operator/BaseMain.java

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@
1010
import java.io.OutputStream;
1111
import java.io.PrintStream;
1212
import java.nio.file.Files;
13+
import java.nio.file.Path;
14+
import java.nio.file.Paths;
1315
import java.security.KeyManagementException;
1416
import java.security.KeyStoreException;
1517
import java.security.NoSuchAlgorithmException;
1618
import java.security.UnrecoverableKeyException;
1719
import java.security.cert.CertificateException;
1820
import java.security.spec.InvalidKeySpecException;
1921
import java.time.OffsetDateTime;
22+
import java.util.Arrays;
2023
import java.util.Collection;
2124
import java.util.Map;
2225
import java.util.Optional;
@@ -54,12 +57,19 @@ public abstract class BaseMain {
5457
static {
5558
try {
5659
Map<String, String> env = System.getenv();
57-
String loggingLevel = env.get("JAVA_LOGGING_LEVEL");
60+
final String loggingLevel = env.get("JAVA_LOGGING_LEVEL");
61+
Level level = Level.WARNING;
5862
if (loggingLevel != null) {
59-
Level level = Level.parse(loggingLevel);
63+
64+
if (Arrays.stream(new String[]{"OFF", "SEVERE", "WARNING", "INFO", "CONFIG", "FINE", "FINER", "FINEST", "ALL"})
65+
.anyMatch(l -> l.equals(loggingLevel))) {
66+
level = Level.parse(loggingLevel);
67+
} else {
68+
System.err.println("Invalid JAVA_LOGGING_LEVEL='" + loggingLevel + "', using WARNING");
69+
}
6070

6171
Logger rootLogger = Logger.getLogger("");
62-
rootLogger.setLevel(Level.WARNING);
72+
rootLogger.setLevel(level);
6373

6474
// Console Handler
6575
ConsoleHandler consoleHandler = new ConsoleHandler();
@@ -68,26 +78,43 @@ public abstract class BaseMain {
6878
rootLogger.addHandler(consoleHandler);
6979

7080
String logDir = env.get("OPERATOR_LOGDIR");
71-
if (logDir != null) {
81+
if (logDir != null && !(logDir = logDir.trim()).isEmpty()) {
7282
Files.createDirectories(PathSupport.getPath(new File(logDir)));
73-
83+
Path logPath = Paths.get(logDir).normalize();
7484
// File handler
75-
String pattern = logDir + "/operator%g.log";
76-
int limit = Integer.parseInt(env.getOrDefault("JAVA_LOGGING_MAXSIZE", "20000000"));
77-
int count = Integer.parseInt(env.getOrDefault("JAVA_LOGGING_COUNT", "10"));
78-
FileHandler fileHandler = new FileHandler(pattern, limit, count);
79-
fileHandler.setLevel(level);
80-
fileHandler.setFormatter(new oracle.kubernetes.operator.logging.OperatorLoggingFormatter());
81-
rootLogger.addHandler(fileHandler);
85+
if (logPath.startsWith("..") || logPath.toString().contains("/../")) {
86+
System.err.println("Invalid OPERATOR_LOGDIR (path traversal attempt): " + logDir);
87+
} else {
88+
int limit = getIntegerOrDefault(env.getOrDefault("JAVA_LOGGING_MAXSIZE", "20000000"), 20_000_000);
89+
int count = getIntegerOrDefault(env.getOrDefault("JAVA_LOGGING_COUNT", "10"), 10);
90+
91+
limit = Math.min(limit, 100_000_000);
92+
count = Math.min(count, 100);
93+
94+
FileHandler fileHandler = new FileHandler(logPath.resolve("operator%g.log").toString(), limit, count, true);
95+
fileHandler.setLevel(level);
96+
fileHandler.setFormatter(new oracle.kubernetes.operator.logging.OperatorLoggingFormatter());
97+
rootLogger.addHandler(fileHandler);
98+
Logger logger = Logger.getLogger("Operator", "Operator");
99+
logger.setLevel(level);
100+
logger.addHandler(consoleHandler);
101+
}
82102
}
83-
84-
Logger logger = Logger.getLogger("Operator", "Operator");
85-
logger.setLevel(level);
86-
logger.addHandler(consoleHandler);
87103
}
88104

89-
} catch (IOException e) {
90-
throw new RuntimeException(e);
105+
} catch (Throwable t) { // Catch ALL exceptions
106+
System.err.println("FATAL: Failed to initialize logging: " + t);
107+
t.printStackTrace();
108+
throw new RuntimeException("Logging initialization failed", t);
109+
}
110+
}
111+
112+
private static int getIntegerOrDefault(String val, int def) {
113+
try {
114+
int i = Integer.parseInt(val);
115+
return i > 0 ? i : def;
116+
} catch (NumberFormatException e) {
117+
return def;
91118
}
92119
}
93120

0 commit comments

Comments
 (0)