Home / Class/ LogstashStructuredLogFormatter Class — spring-boot Architecture

LogstashStructuredLogFormatter Class — spring-boot Architecture

Architecture documentation for the LogstashStructuredLogFormatter class in LogstashStructuredLogFormatter.java from the spring-boot codebase.

Entity Profile

Relationship Graph

Source Code

core/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/LogstashStructuredLogFormatter.java lines 48–103

class LogstashStructuredLogFormatter extends JsonWriterStructuredLogFormatter<LogEvent> {

	LogstashStructuredLogFormatter(@Nullable StackTracePrinter stackTracePrinter, ContextPairs contextPairs,
			@Nullable StructuredLoggingJsonMembersCustomizer<?> customizer) {
		super((members) -> jsonMembers(stackTracePrinter, contextPairs, members), customizer);
	}

	private static void jsonMembers(@Nullable StackTracePrinter stackTracePrinter, ContextPairs contextPairs,
			JsonWriter.Members<LogEvent> members) {
		Extractor extractor = new Extractor(stackTracePrinter);
		members.add("@timestamp", LogEvent::getInstant).as(LogstashStructuredLogFormatter::asTimestamp);
		members.add("@version", "1");
		members.add("message", LogEvent::getMessage).as(StructuredMessage::get);
		members.add("logger_name", LogEvent::getLoggerName);
		members.add("thread_name", LogEvent::getThreadName);
		members.add("level", LogEvent::getLevel).as(Level::name);
		members.add("level_value", LogEvent::getLevel).as(Level::intLevel);
		Predicate<@Nullable ReadOnlyStringMap> mapIsEmpty = (map) -> map == null || map.isEmpty();
		members.from(LogEvent::getContextData)
			.whenNot(mapIsEmpty)
			.usingPairs(contextPairs.flat("_", LogstashStructuredLogFormatter::addContextDataPairs));
		Predicate<@Nullable Set<String>> collectionIsEmpty = CollectionUtils::isEmpty;
		members.add("tags", LogEvent::getMarker)
			.whenNotNull()
			.as(LogstashStructuredLogFormatter::getMarkers)
			.whenNot(collectionIsEmpty);
		members.add("stack_trace", LogEvent::getThrown).whenNotNull().as(extractor::stackTrace);
	}

	private static String asTimestamp(Instant instant) {
		java.time.Instant javaInstant = java.time.Instant.ofEpochMilli(instant.getEpochMillisecond())
			.plusNanos(instant.getNanoOfMillisecond());
		OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(javaInstant, ZoneId.systemDefault());
		return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(offsetDateTime);
	}

	private static void addContextDataPairs(ContextPairs.Pairs<ReadOnlyStringMap> contextPairs) {
		contextPairs.add((contextData, pairs) -> contextData.forEach(pairs::accept));
	}

	private static Set<String> getMarkers(Marker marker) {
		Set<String> result = new TreeSet<>();
		addMarkers(result, marker);
		return result;
	}

	private static void addMarkers(Set<String> result, Marker marker) {
		result.add(marker.getName());
		if (marker.hasParents()) {
			for (Marker parent : marker.getParents()) {
				addMarkers(result, parent);
			}
		}
	}

}

Domain

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free