1 | package com.reallifedeveloper.common.infrastructure.jmx; | |
2 | ||
3 | import java.util.List; | |
4 | import java.util.Optional; | |
5 | import java.util.stream.Stream; | |
6 | ||
7 | import org.apache.logging.log4j.Level; | |
8 | import org.apache.logging.log4j.core.Logger; | |
9 | import org.apache.logging.log4j.core.LoggerContext; | |
10 | import org.springframework.jmx.export.annotation.ManagedAttribute; | |
11 | import org.springframework.jmx.export.annotation.ManagedOperation; | |
12 | import org.springframework.jmx.export.annotation.ManagedOperationParameter; | |
13 | import org.springframework.jmx.export.annotation.ManagedOperationParameters; | |
14 | import org.springframework.jmx.export.annotation.ManagedResource; | |
15 | ||
16 | import com.reallifedeveloper.common.domain.ErrorHandling; | |
17 | ||
18 | /** | |
19 | * An implementation of the JMX {@link LogConfiguratorMXBean} interface using Log4j. | |
20 | * | |
21 | * @author RealLifeDeveloper | |
22 | */ | |
23 | @ManagedResource(description = "Log4j Configuration") | |
24 | public class Log4jConfigurator implements LogConfiguratorMXBean { | |
25 | ||
26 | @Override | |
27 | @ManagedAttribute(description = "The available loggers") | |
28 | public List<String> getLoggers() { | |
29 | List<String> configLoggers = getContext().getConfiguration().getLoggers().entrySet().stream() | |
30 | .map(entry -> entry.getKey() + "=" + entry.getValue().getLevel()).toList(); | |
31 | List<String> contextLoggers = getContext().getLoggers().stream().map(l -> l.getName() + "=" + l.getLevel()).toList(); | |
32 |
1
1. getLoggers : replaced return value with Collections.emptyList for com/reallifedeveloper/common/infrastructure/jmx/Log4jConfigurator::getLoggers → KILLED |
return Stream.concat(configLoggers.stream(), contextLoggers.stream()).distinct().toList(); |
33 | } | |
34 | ||
35 | @Override | |
36 | @ManagedOperation(description = "Gives the log level for a logger") | |
37 | @ManagedOperationParameters({ @ManagedOperationParameter(name = "logger", description = "The name of the logger") }) | |
38 | public String getLogLevel(String loggerName) { | |
39 | return getLoggerIfExists(loggerName).map(l -> l.getLevel().name()).orElse("unavailable"); | |
40 | } | |
41 | ||
42 | @Override | |
43 | @ManagedOperation(description = "Sets the log level for a logger") | |
44 | @ManagedOperationParameters({ @ManagedOperationParameter(name = "logger", description = "The name of the logger"), | |
45 | @ManagedOperationParameter(name = "level", description = "The new log level") }) | |
46 | public void setLogLevel(String loggerName, String level) { | |
47 |
2
1. setLogLevel : negated conditional → KILLED 2. setLogLevel : negated conditional → KILLED |
if (isNotBlank(loggerName) && isNotBlank(level)) { |
48 | Level logLevel = Level.getLevel(level); | |
49 |
1
1. setLogLevel : negated conditional → KILLED |
if (logLevel != null) { |
50 | Logger logger = getOrCreateLogger(loggerName); | |
51 | logger.setLevel(logLevel); | |
52 | } | |
53 | } | |
54 | } | |
55 | ||
56 | @SuppressWarnings("PMD.CloseResource") // Closing the LoggerContext shuts down logging. | |
57 | private static Optional<Logger> getLoggerIfExists(String loggerName) { | |
58 |
1
1. getLoggerIfExists : removed call to com/reallifedeveloper/common/domain/ErrorHandling::checkNull → KILLED |
ErrorHandling.checkNull("loggerName must not be null", loggerName); |
59 | LoggerContext context = getContext(); | |
60 | if (context.hasLogger(loggerName) || context.getConfiguration().getLoggers().containsKey(loggerName)) { | |
61 | return Optional.of(context.getLogger(loggerName)); | |
62 | } else { | |
63 | return Optional.empty(); | |
64 | } | |
65 | } | |
66 | ||
67 | private static Logger getOrCreateLogger(String loggerName) { | |
68 | return getContext().getLogger(loggerName); | |
69 | } | |
70 | ||
71 | private static LoggerContext getContext() { | |
72 | return LoggerContext.getContext(); | |
73 | } | |
74 | ||
75 | private static boolean isNotBlank(String s) { | |
76 |
3
1. isNotBlank : replaced boolean return with true for com/reallifedeveloper/common/infrastructure/jmx/Log4jConfigurator::isNotBlank → KILLED 2. isNotBlank : negated conditional → KILLED 3. isNotBlank : negated conditional → KILLED |
return s != null && !s.isBlank(); |
77 | } | |
78 | } | |
Mutations | ||
32 |
1.1 |
|
47 |
1.1 2.2 |
|
49 |
1.1 |
|
58 |
1.1 |
|
76 |
1.1 2.2 3.3 |