diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/LocationPatternConvertersRequireLocationTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/LocationPatternConvertersRequireLocationTest.java new file mode 100644 index 00000000000..64d8019661e --- /dev/null +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/LocationPatternConvertersRequireLocationTest.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.logging.log4j.core.pattern; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; +import org.apache.logging.log4j.core.impl.LocationAware; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class LocationPatternConvertersRequireLocationTest { + + /** + * Reproduces github issue #2781. + */ + @ParameterizedTest + @CsvSource({"%L", "%l", "%F", "%C", "%M"}) + void testThatLocationDependentPatternConvertersIndicateLocationRequirement(final String converterKey) + throws Exception { + final PatternFormatter formatter = createSinglePatternFormatterFromConverterKey(converterKey); + + final LocationAware locationAwareFormatter = assertInstanceOf(LocationAware.class, formatter.getConverter()); + assertTrue(locationAwareFormatter.requiresLocation()); + } + + private static PatternFormatter createSinglePatternFormatterFromConverterKey(final String converterKey) { + final PatternParser parser = new PatternParser(PatternConverter.CATEGORY); + final List formatters = parser.parse(converterKey); + assertEquals(1, formatters.size()); + final PatternFormatter formatter = formatters.get(0); + return formatter; + } +} diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileLocationPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileLocationPatternConverter.java index b7315ea397a..42222dd2cfb 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileLocationPatternConverter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileLocationPatternConverter.java @@ -18,13 +18,14 @@ import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.impl.LocationAware; /** * Returns the event's line location information in a StringBuilder. */ @Plugin(name = "FileLocationPatternConverter", category = PatternConverter.CATEGORY) @ConverterKeys({"F", "file"}) -public final class FileLocationPatternConverter extends LogEventPatternConverter { +public final class FileLocationPatternConverter extends LogEventPatternConverter implements LocationAware { /** * Singleton. */ @@ -58,4 +59,9 @@ public void format(final LogEvent event, final StringBuilder output) { output.append(element.getFileName()); } } + + @Override + public boolean requiresLocation() { + return true; + } } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/package-info.java index dba7d0e5493..5818a773fe9 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/package-info.java @@ -18,7 +18,7 @@ * Provides classes implementing format specifiers in conversion patterns. */ @Export -@Version("2.21.1") +@Version("2.24.0") package org.apache.logging.log4j.core.pattern; import org.osgi.annotation.bundle.Export; diff --git a/src/changelog/.2.x.x/2781_fix_file_location_pattern_converter_location_requirement.xml b/src/changelog/.2.x.x/2781_fix_file_location_pattern_converter_location_requirement.xml new file mode 100644 index 00000000000..e51aa8a0e9b --- /dev/null +++ b/src/changelog/.2.x.x/2781_fix_file_location_pattern_converter_location_requirement.xml @@ -0,0 +1,8 @@ + + + + Fix location requirement for the `%F` and `%file` keys in Pattern Layout +