Skip to content

Commit

Permalink
Support lowering log level for MDC and markers with overriding filters.
Browse files Browse the repository at this point in the history
Resolves #57

* E.g. INFO,NONE@mdc:user=noisy&mdc:operation=boring
* Consistent handling of inheritance with LogEventFilter
  • Loading branch information
jhannes committed Nov 16, 2021
1 parent 7c1a68f commit 9bc645d
Show file tree
Hide file tree
Showing 28 changed files with 812 additions and 511 deletions.
2 changes: 1 addition & 1 deletion MANUAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ built on top of SLF4J - the logging lingua franka for Java.
* [Elasticsearch](https://jhannes.github.io/logevents/apidocs/org/logevents/observers/ElasticsearchLogEventObserver.html). Logging directly to Elastic search Index API avoids edge cases when writing and parsing log files
* [Azure Application Insights](https://jhannes.github.io/logevents/apidocs/org/logevents/extend/azure/ApplicationInsightsLogEventObserver.html) (requires optional com.microsoft.azure:applicationinsights-core dependency)
* [JMX integration](https://jhannes.github.io/logevents/apidocs/org/logevents/jmx/LogEventsMBeanFactory.html) to view the configuration and tweak log levels
* [Filter loggers](https://jhannes.github.io/logevents/apidocs/org/logevents/impl/ConditionalLogEventFilter.html) on markers and MDC values (e.g. `logger.org.example.app=INFO,DEBUG@mdc:user=superuser|admin`)
* [Filter loggers](https://jhannes.github.io/logevents/apidocs/org/logevents/impl/LogEventFilter.html) on markers and MDC values (e.g. `logger.org.example.app=INFO,DEBUG@mdc:user=superuser|admin`)
* [Filter observers](https://jhannes.github.io/logevents/apidocs/org/logevents/observers/AbstractFilteredLogEventObserver.html) on markers and MDC values

## Quick start:
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ logevents.status=CONFIG

By default, the [`file`](https://jhannes.github.io/logevents/apidocs/org/logevents/observers/FileLogEventObserver.html) observer will log to a file named `logs/your-app-name-%date.log` and [`console`](https://jhannes.github.io/logevents/apidocs/org/logevents/observers/ConsoleLogEventObserver.html) logs ANSI-colored logs to the console.

The default level for loggers with this configuration will be `WARN`, by `org.example` will log at `INFO` and `org.example.myapp` will log at `DEBUG`, or trace for HTTP_REQUEST when the `user` is `admin`. See [ConditionalLogEventFilter](https://jhannes.github.io/logevents/apidocs/org/logevents/impl/ConditionalLogEventFilter.html) for details. Use level `NONE` to turn off logging.
The default level for loggers with this configuration will be `WARN`, by `org.example` will log at `INFO` and `org.example.myapp` will log at `DEBUG`, or trace for HTTP_REQUEST when the `user` is `admin`. See [LogEventFilter](https://jhannes.github.io/logevents/apidocs/org/logevents/impl/LogEventFilter.html) for details. Use level `NONE` to turn off logging.

Logevents will output [configuration information](https://jhannes.github.io/logevents/apidocs/org/logevents/status/package-summary.html) to system err.

Expand Down Expand Up @@ -99,7 +99,7 @@ LOGEVENTS_LOGGER_COM_EXAMPLE=DEBUG,TRACE@mdc:user=superuser|admin|tester
requires optional com.microsoft.azure:applicationinsights-core dependency)
* [JMX integration](https://jhannes.github.io/logevents/apidocs/org/logevents/jmx/LogEventsMBeanFactory.html) to view
the configuration and tweak log levels
* [Filter loggers](https://jhannes.github.io/logevents/apidocs/org/logevents/impl/ConditionalLogEventFilter.html) on
* [Filter loggers](https://jhannes.github.io/logevents/apidocs/org/logevents/impl/LogEventFilter.html) on
markers and MDC values (e.g. `logger.org.example.app=INFO,DEBUG@mdc:user=superuser|admin`)
* [Filter observers](https://jhannes.github.io/logevents/apidocs/org/logevents/observers/AbstractFilteredLogEventObserver.html)
on markers and MDC values
5 changes: 2 additions & 3 deletions logevents/src/main/java/org/logevents/LogEventFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
import org.logevents.config.DefaultLogEventConfigurator;
import org.logevents.config.DefaultTestLogEventConfigurator;
import org.logevents.config.LogEventConfigurationException;
import org.logevents.impl.JavaUtilLoggingAdapter;
import org.logevents.impl.LevelThresholdFilter;
import org.logevents.impl.LogEventFilter;
import org.logevents.impl.JavaUtilLoggingAdapter;
import org.logevents.impl.LoggerDelegator;
import org.logevents.observers.CompositeLogEventObserver;
import org.logevents.observers.ConsoleLogEventObserver;
Expand Down Expand Up @@ -103,7 +102,7 @@ public void setRootLevel(Level level) {
* @param level The nullable name of the threshold. If null, inherit from parent
*/
public LogEventFilter setLevel(Logger logger, Level level) {
return setFilter(logger, level != null ? new LevelThresholdFilter(level) : null);
return setFilter(logger, level != null ? new LogEventFilter(level) : null);
}

public LogEventFilter setFilter(Logger logger, LogEventFilter filter) {
Expand Down
7 changes: 2 additions & 5 deletions logevents/src/main/java/org/logevents/LogEventObserver.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,8 @@ public interface LogEventObserver {

void logEvent(LogEvent logEvent);

default LogEventObserver filteredOn(Level level, Level configuredThreshold) {
if (configuredThreshold == null || configuredThreshold.compareTo(level) < 0) {
return new NullLogEventObserver();
}
return this;
default LogEventObserver filteredOn(Level level, boolean enabledByFilter) {
return enabledByFilter ? this : new NullLogEventObserver();
}

default List<LogEventObserver> toList() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@
import org.logevents.LogEventFactory;
import org.logevents.LogEventObserver;
import org.logevents.LoggerConfiguration;
import org.logevents.impl.LevelThresholdFilter;
import org.logevents.impl.LogEventFilter;
import org.logevents.impl.NeverLogEventFilter;
import org.logevents.jmx.LogEventsMBeanFactory;
import org.logevents.observers.CompositeLogEventObserver;
import org.logevents.impl.ConditionalLogEventFilter;
import org.logevents.observers.ConsoleLogEventObserver;
import org.logevents.observers.FileLogEventObserver;
import org.logevents.observers.LevelThresholdConditionalObserver;
Expand Down Expand Up @@ -529,14 +526,8 @@ protected void configureLogger(LogEventFactory factory, LoggerConfiguration logg
LogEventStatus.getInstance().addConfig(this, "Logger: " + logger);
}

private LogEventFilter getFilter(String part) {
if (part.contains(",")) {
return new ConditionalLogEventFilter(part);
} else if (part.trim().equals("NONE")) {
return new NeverLogEventFilter();
} else {
return new LevelThresholdFilter(Level.valueOf(part.trim()));
}
private LogEventFilter getFilter(String filterString) {
return new LogEventFilter(filterString.trim());
}

private void configureObserver(Map<String, Supplier<? extends LogEventObserver>> observers, String name, String className, Map<String, String> properties) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.io.IOException;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
Expand All @@ -24,6 +25,7 @@ public class LogEventSampler {
public static final Marker OPS = MarkerFactory.getMarker("OPS");
public static final Marker LIFECYCLE = MarkerFactory.getMarker("LIFECYCLE");
public static final Marker PERFORMANCE = MarkerFactory.getMarker("PERFORMANCE");
public static final Marker AUDIT = MarkerFactory.getMarker("AUDIT");
static {
HTTP_ASSET_REQUEST.add(HTTP_REQUEST);
HTTP_ERROR.add(HTTP_REQUEST);
Expand Down Expand Up @@ -144,7 +146,6 @@ public LogEventSampler withThrowable() {
private StackTraceElement mainMethod = new StackTraceElement("org.logeventsdemo.MyApplication", "main", "MyApplication.java", 20);
private StackTraceElement publicMethod = new StackTraceElement("org.logeventsdemo.internal.MyClassName", "publicMethod", "MyClassName.java", 31);
private StackTraceElement internalMethod = new StackTraceElement("org.logeventsdemo.internal.MyClassName", "internalMethod", "MyClassName.java", 311);
private StackTraceElement nioApiMethod = new StackTraceElement("java.nio.file.Files", "write", "Files.java", 3292);
private StackTraceElement nioInternalMethod = new StackTraceElement("sun.nio.fs.WindowsException", "translateToIOException", "WindowsException.java", 79);
private StackTraceElement ioApiMethod = new StackTraceElement("java.io.FilterOutputStream", "close", "FilterOutputStream.java", 180);
private StackTraceElement ioInternalMethod = new StackTraceElement("java.io.FileOutputStream", "close", "FileOutputStream.java", 323);
Expand Down Expand Up @@ -184,7 +185,7 @@ public LogEventSampler withRandomTime() {
}

public static Instant randomTime() {
return Instant.now().minusSeconds(random.nextInt(3600) + 60);
return Instant.now().minusSeconds(random.nextInt(3600) + 60).truncatedTo(ChronoUnit.SECONDS);
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
* If the event is logged with a marker, {@link LogEventPredicate#test(Marker)} is used to check if
* the message should be logged. MDC and Markers are the most likely things to test for.
*
* @see ConditionalLogEventFilter
* @see LogEventFilter
*/
public class ConditionalLogEventGenerator implements LogEventGenerator {
private final String loggerName;
Expand Down

This file was deleted.

0 comments on commit 9bc645d

Please sign in to comment.