Commit 389ab957 authored by Stephane Nicoll's avatar Stephane Nicoll

Merge pull request #15089 from TwinProduction

* pr/15089:
  Polish "Rename logging.file to logging.file.name"
  Rename logging.file to logging.file.name
parents 56ae9cfc 7939b8b4
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -23,6 +23,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionOutcome; ...@@ -23,6 +23,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition; import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.logging.LogFile;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ConditionContext; import org.springframework.context.annotation.ConditionContext;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
...@@ -35,6 +36,7 @@ import org.springframework.util.StringUtils; ...@@ -35,6 +36,7 @@ import org.springframework.util.StringUtils;
* {@link EnableAutoConfiguration Auto-configuration} for {@link LogFileWebEndpoint}. * {@link EnableAutoConfiguration Auto-configuration} for {@link LogFileWebEndpoint}.
* *
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Christian Carriere-Tisseur
* @since 2.0.0 * @since 2.0.0
*/ */
@Configuration @Configuration
...@@ -56,20 +58,23 @@ public class LogFileWebEndpointAutoConfiguration { ...@@ -56,20 +58,23 @@ public class LogFileWebEndpointAutoConfiguration {
private static class LogFileCondition extends SpringBootCondition { private static class LogFileCondition extends SpringBootCondition {
@SuppressWarnings("deprecation")
@Override @Override
public ConditionOutcome getMatchOutcome(ConditionContext context, public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) { AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment(); Environment environment = context.getEnvironment();
String config = environment.resolvePlaceholders("${logging.file:}"); String config = getLogFileConfig(environment, LogFile.FILE_NAME_PROPERTY,
LogFile.FILE_PROPERTY);
ConditionMessage.Builder message = ConditionMessage.forCondition("Log File"); ConditionMessage.Builder message = ConditionMessage.forCondition("Log File");
if (StringUtils.hasText(config)) { if (StringUtils.hasText(config)) {
return ConditionOutcome return ConditionOutcome
.match(message.found("logging.file").items(config)); .match(message.found(LogFile.FILE_NAME_PROPERTY).items(config));
} }
config = environment.resolvePlaceholders("${logging.path:}"); config = getLogFileConfig(environment, LogFile.FILE_PATH_PROPERTY,
LogFile.PATH_PROPERTY);
if (StringUtils.hasText(config)) { if (StringUtils.hasText(config)) {
return ConditionOutcome return ConditionOutcome
.match(message.found("logging.path").items(config)); .match(message.found(LogFile.FILE_PATH_PROPERTY).items(config));
} }
config = environment.getProperty("management.endpoint.logfile.external-file"); config = environment.getProperty("management.endpoint.logfile.external-file");
if (StringUtils.hasText(config)) { if (StringUtils.hasText(config)) {
...@@ -80,6 +85,15 @@ public class LogFileWebEndpointAutoConfiguration { ...@@ -80,6 +85,15 @@ public class LogFileWebEndpointAutoConfiguration {
return ConditionOutcome.noMatch(message.didNotFind("logging file").atAll()); return ConditionOutcome.noMatch(message.didNotFind("logging file").atAll());
} }
private String getLogFileConfig(Environment environment, String configName,
String deprecatedConfigName) {
String config = environment.resolvePlaceholders("${" + configName + ":}");
if (StringUtils.hasText(config)) {
return config;
}
return environment.resolvePlaceholders("${" + deprecatedConfigName + ":}");
}
} }
} }
...@@ -34,7 +34,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. ...@@ -34,7 +34,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
* *
* @author Andy Wilkinson * @author Andy Wilkinson
*/ */
@TestPropertySource(properties = "logging.file=src/test/resources/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/sample.log") @TestPropertySource(properties = "logging.file.name=src/test/resources/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/sample.log")
public class LogFileWebEndpointDocumentationTests public class LogFileWebEndpointDocumentationTests
extends MockMvcEndpointDocumentationTests { extends MockMvcEndpointDocumentationTests {
......
...@@ -38,6 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -38,6 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Phillip Webb * @author Phillip Webb
* @author Christian Carriere-Tisseur
*/ */
public class LogFileWebEndpointAutoConfigurationTests { public class LogFileWebEndpointAutoConfigurationTests {
...@@ -49,12 +50,26 @@ public class LogFileWebEndpointAutoConfigurationTests { ...@@ -49,12 +50,26 @@ public class LogFileWebEndpointAutoConfigurationTests {
@Test @Test
public void logFileWebEndpointIsAutoConfiguredWhenLoggingFileIsSet() { public void logFileWebEndpointIsAutoConfiguredWhenLoggingFileIsSet() {
this.contextRunner.withPropertyValues("logging.file.name:test.log").run(
(context) -> assertThat(context).hasSingleBean(LogFileWebEndpoint.class));
}
@Test
@Deprecated
public void logFileWebEndpointIsAutoConfiguredWhenLoggingFileIsSetWithDeprecatedProperty() {
this.contextRunner.withPropertyValues("logging.file:test.log").run( this.contextRunner.withPropertyValues("logging.file:test.log").run(
(context) -> assertThat(context).hasSingleBean(LogFileWebEndpoint.class)); (context) -> assertThat(context).hasSingleBean(LogFileWebEndpoint.class));
} }
@Test @Test
public void logFileWebEndpointIsAutoConfiguredWhenLoggingPathIsSet() { public void logFileWebEndpointIsAutoConfiguredWhenLoggingPathIsSet() {
this.contextRunner.withPropertyValues("logging.file.path:test/logs").run(
(context) -> assertThat(context).hasSingleBean(LogFileWebEndpoint.class));
}
@Test
@Deprecated
public void logFileWebEndpointIsAutoConfiguredWhenLoggingPathIsSetWithDeprecatedProperty() {
this.contextRunner.withPropertyValues("logging.path:test/logs").run( this.contextRunner.withPropertyValues("logging.path:test/logs").run(
(context) -> assertThat(context).hasSingleBean(LogFileWebEndpoint.class)); (context) -> assertThat(context).hasSingleBean(LogFileWebEndpoint.class));
} }
...@@ -71,7 +86,7 @@ public class LogFileWebEndpointAutoConfigurationTests { ...@@ -71,7 +86,7 @@ public class LogFileWebEndpointAutoConfigurationTests {
@Test @Test
public void logFileWebEndpointCanBeDisabled() { public void logFileWebEndpointCanBeDisabled() {
this.contextRunner this.contextRunner
.withPropertyValues("logging.file:test.log", .withPropertyValues("logging.file.name:test.log",
"management.endpoint.logfile.enabled:false") "management.endpoint.logfile.enabled:false")
.run((context) -> assertThat(context) .run((context) -> assertThat(context)
.hasSingleBean(LogFileWebEndpoint.class)); .hasSingleBean(LogFileWebEndpoint.class));
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -70,7 +70,7 @@ public class LogFileWebEndpoint { ...@@ -70,7 +70,7 @@ public class LogFileWebEndpoint {
} }
LogFile logFile = LogFile.get(this.environment); LogFile logFile = LogFile.get(this.environment);
if (logFile == null) { if (logFile == null) {
logger.debug("Missing 'logging.file' or 'logging.path' properties"); logger.debug("Missing 'logging.file.name' or 'logging.file.path' properties");
return null; return null;
} }
return new FileSystemResource(logFile.toString()); return new FileSystemResource(logFile.toString());
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -63,12 +63,22 @@ public class LogFileWebEndpointTests { ...@@ -63,12 +63,22 @@ public class LogFileWebEndpointTests {
@Test @Test
public void nullResponseWithMissingLogFile() { public void nullResponseWithMissingLogFile() {
this.environment.setProperty("logging.file", "no_test.log"); this.environment.setProperty("logging.file.name", "no_test.log");
assertThat(this.endpoint.logFile()).isNull(); assertThat(this.endpoint.logFile()).isNull();
} }
@Test @Test
public void resourceResponseWithLogFile() throws Exception { public void resourceResponseWithLogFile() throws Exception {
this.environment.setProperty("logging.file.name", this.logFile.getAbsolutePath());
Resource resource = this.endpoint.logFile();
assertThat(resource).isNotNull();
assertThat(StreamUtils.copyToString(resource.getInputStream(),
StandardCharsets.UTF_8)).isEqualTo("--TEST--");
}
@Test
@Deprecated
public void resourceResponseWithLogFileAndDeprecatedProperty() throws Exception {
this.environment.setProperty("logging.file", this.logFile.getAbsolutePath()); this.environment.setProperty("logging.file", this.logFile.getAbsolutePath());
Resource resource = this.endpoint.logFile(); Resource resource = this.endpoint.logFile();
assertThat(resource).isNotNull(); assertThat(resource).isNotNull();
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -65,7 +65,7 @@ public class LogFileWebEndpointWebIntegrationTests { ...@@ -65,7 +65,7 @@ public class LogFileWebEndpointWebIntegrationTests {
@Test @Test
public void getRequestProducesResponseWithLogFile() { public void getRequestProducesResponseWithLogFile() {
TestPropertyValues.of("logging.file:" + this.logFile.getAbsolutePath()) TestPropertyValues.of("logging.file.name:" + this.logFile.getAbsolutePath())
.applyTo(context); .applyTo(context);
client.get().uri("/actuator/logfile").exchange().expectStatus().isOk() client.get().uri("/actuator/logfile").exchange().expectStatus().isOk()
.expectBody(String.class).isEqualTo("--TEST--"); .expectBody(String.class).isEqualTo("--TEST--");
......
...@@ -37,12 +37,12 @@ content into your application. Rather, pick only the properties that you need. ...@@ -37,12 +37,12 @@ content into your application. Rather, pick only the properties that you need.
# LOGGING # LOGGING
logging.config= # Location of the logging configuration file. For instance, `classpath:logback.xml` for Logback. logging.config= # Location of the logging configuration file. For instance, `classpath:logback.xml` for Logback.
logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions. logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions.
logging.file= # Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.
logging.file.max-history=0 # Maximum of archive log files to keep. Only supported with the default logback setup. logging.file.max-history=0 # Maximum of archive log files to keep. Only supported with the default logback setup.
logging.file.max-size=10MB # Maximum log file size. Only supported with the default logback setup. logging.file.max-size=10MB # Maximum log file size. Only supported with the default logback setup.
logging.file.name= # Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.
logging.file.path= # Location of the log file. For instance, `/var/log`.
logging.group.*= # Log groups to quickly change multiple loggers at the same time. For instance, `logging.level.db=org.hibernate,org.springframework.jdbc`. logging.group.*= # Log groups to quickly change multiple loggers at the same time. For instance, `logging.level.db=org.hibernate,org.springframework.jdbc`.
logging.level.*= # Log levels severity mapping. For instance, `logging.level.org.springframework=DEBUG`. logging.level.*= # Log levels severity mapping. For instance, `logging.level.org.springframework=DEBUG`.
logging.path= # Location of the log file. For instance, `/var/log`.
logging.pattern.console= # Appender pattern for output to the console. Supported only with the default Logback setup. logging.pattern.console= # Appender pattern for output to the console. Supported only with the default Logback setup.
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS # Appender pattern for log date format. Supported only with the default Logback setup. logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS # Appender pattern for log date format. Supported only with the default Logback setup.
logging.pattern.file= # Appender pattern for output to a file. Supported only with the default Logback setup. logging.pattern.file= # Appender pattern for output to a file. Supported only with the default Logback setup.
......
...@@ -1518,7 +1518,7 @@ in the following example: ...@@ -1518,7 +1518,7 @@ in the following example:
---- ----
You can also set the location of a file to which to write the log (in addition to the You can also set the location of a file to which to write the log (in addition to the
console) by using "logging.file". console) by using "logging.file.name".
To configure the more fine-grained settings of a logging system, you need to use the native To configure the more fine-grained settings of a logging system, you need to use the native
configuration format supported by the `LoggingSystem` in question. By default, Spring Boot configuration format supported by the `LoggingSystem` in question. By default, Spring Boot
...@@ -1548,8 +1548,8 @@ If you look at `base.xml` in the spring-boot jar, you can see that it uses ...@@ -1548,8 +1548,8 @@ If you look at `base.xml` in the spring-boot jar, you can see that it uses
some useful System properties that the `LoggingSystem` takes care of creating for you: some useful System properties that the `LoggingSystem` takes care of creating for you:
* `${PID}`: The current process ID. * `${PID}`: The current process ID.
* `${LOG_FILE}`: Whether `logging.file` was set in Boot's external configuration. * `${LOG_FILE}`: Whether `logging.file.name` was set in Boot's external configuration.
* `${LOG_PATH}`: Whether `logging.path` (representing a directory for * `${LOG_PATH}`: Whether `logging.file.path` (representing a directory for
log files to live in) was set in Boot's external configuration. log files to live in) was set in Boot's external configuration.
* `${LOG_EXCEPTION_CONVERSION_WORD}`: Whether `logging.exception-conversion-word` was set * `${LOG_EXCEPTION_CONVERSION_WORD}`: Whether `logging.exception-conversion-word` was set
in Boot's external configuration. in Boot's external configuration.
...@@ -1582,12 +1582,12 @@ shown in the following example: ...@@ -1582,12 +1582,12 @@ shown in the following example:
</configuration> </configuration>
---- ----
You also need to add `logging.file` to your `application.properties`, as shown in the You also need to add `logging.file.name` to your `application.properties`, as shown in the
following example: following example:
[source,properties,indent=0,subs="verbatim,quotes,attributes"] [source,properties,indent=0,subs="verbatim,quotes,attributes"]
---- ----
logging.file=myapplication.log logging.file.name=myapplication.log
---- ----
......
...@@ -164,9 +164,9 @@ use the following additional endpoints: ...@@ -164,9 +164,9 @@ use the following additional endpoints:
|Yes |Yes
|`logfile` |`logfile`
|Returns the contents of the logfile (if `logging.file` or `logging.path` properties have |Returns the contents of the logfile (if `logging.file.name` or `logging.file.path`
been set). Supports the use of the HTTP `Range` header to retrieve part of the log file's properties have been set). Supports the use of the HTTP `Range` header to retrieve part of
content. the log file's content.
|Yes |Yes
|`prometheus` |`prometheus`
......
...@@ -1686,7 +1686,7 @@ The following colors and styles are supported: ...@@ -1686,7 +1686,7 @@ The following colors and styles are supported:
=== File Output === File Output
By default, Spring Boot logs only to the console and does not write log files. If you By default, Spring Boot logs only to the console and does not write log files. If you
want to write log files in addition to the console output, you need to set a want to write log files in addition to the console output, you need to set a
`logging.file` or `logging.path` property (for example, in your `logging.file.name` or `logging.file.path` property (for example, in your
`application.properties`). `application.properties`).
The following table shows how the `logging.*` properties can be used together: The following table shows how the `logging.*` properties can be used together:
...@@ -1694,7 +1694,7 @@ The following table shows how the `logging.*` properties can be used together: ...@@ -1694,7 +1694,7 @@ The following table shows how the `logging.*` properties can be used together:
.Logging properties .Logging properties
[cols="1,1,1,4"] [cols="1,1,1,4"]
|=== |===
|`logging.file` |`logging.path` |Example |Description |`logging.file.name` |`logging.file.path` |Example |Description
|_(none)_ |_(none)_
|_(none)_ |_(none)_
...@@ -1835,7 +1835,7 @@ To help with the customization, some other properties are transferred from the S ...@@ -1835,7 +1835,7 @@ To help with the customization, some other properties are transferred from the S
|`LOG_EXCEPTION_CONVERSION_WORD` |`LOG_EXCEPTION_CONVERSION_WORD`
|The conversion word used when logging exceptions. |The conversion word used when logging exceptions.
|`logging.file` |`logging.file.name`
|`LOG_FILE` |`LOG_FILE`
|If defined, it is used in the default log configuration. |If defined, it is used in the default log configuration.
...@@ -1849,7 +1849,7 @@ setup.) ...@@ -1849,7 +1849,7 @@ setup.)
|Maximum number of archive log files to keep (if LOG_FILE enabled). (Only supported with |Maximum number of archive log files to keep (if LOG_FILE enabled). (Only supported with
the default Logback setup.) the default Logback setup.)
|`logging.path` |`logging.file.path`
|`LOG_PATH` |`LOG_PATH`
|If defined, it is used in the default log configuration. |If defined, it is used in the default log configuration.
......
...@@ -68,8 +68,8 @@ import org.springframework.util.StringUtils; ...@@ -68,8 +68,8 @@ import org.springframework.util.StringUtils;
* {@literal java -jar myapp.jar [--debug | --trace]}). If you prefer to ignore these * {@literal java -jar myapp.jar [--debug | --trace]}). If you prefer to ignore these
* properties you can set {@link #setParseArgs(boolean) parseArgs} to {@code false}. * properties you can set {@link #setParseArgs(boolean) parseArgs} to {@code false}.
* <p> * <p>
* By default, log output is only written to the console. If a log file is required the * By default, log output is only written to the console. If a log file is required, the
* {@code logging.path} and {@code logging.file} properties can be used. * {@code logging.file.path} and {@code logging.file.name} properties can be used.
* <p> * <p>
* Some system properties may be set as side effects, and these can be useful if the * Some system properties may be set as side effects, and these can be useful if the
* logging configuration supports placeholders (i.e. log4j or logback): * logging configuration supports placeholders (i.e. log4j or logback):
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -25,11 +25,12 @@ import org.springframework.util.StringUtils; ...@@ -25,11 +25,12 @@ import org.springframework.util.StringUtils;
/** /**
* A reference to a log output file. Log output files are specified using * A reference to a log output file. Log output files are specified using
* {@code logging.file} or {@code logging.path} {@link Environment} properties. If the * {@code logging.file.name} or {@code logging.file.path} {@link Environment} properties.
* {@code logging.file} property is not specified {@code "spring.log"} will be written in * If the {@code logging.file.name} property is not specified {@code "spring.log"} will be
* the {@code logging.path} directory. * written in the {@code logging.file.path} directory.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Christian Carriere-Tisseur
* @since 1.2.1 * @since 1.2.1
* @see #get(PropertyResolver) * @see #get(PropertyResolver)
*/ */
...@@ -38,15 +39,33 @@ public class LogFile { ...@@ -38,15 +39,33 @@ public class LogFile {
/** /**
* The name of the Spring property that contains the name of the log file. Names can * The name of the Spring property that contains the name of the log file. Names can
* be an exact location or relative to the current directory. * be an exact location or relative to the current directory.
* @deprecated since 2.2.0 in favor of {@link #FILE_NAME_PROPERTY}
*/ */
@Deprecated
public static final String FILE_PROPERTY = "logging.file"; public static final String FILE_PROPERTY = "logging.file";
/** /**
* The name of the Spring property that contains the directory where log files are * The name of the Spring property that contains the directory where log files are
* written. * written.
* @deprecated since 2.2.0 in favor of {@link #FILE_PATH_PROPERTY}
*/ */
@Deprecated
public static final String PATH_PROPERTY = "logging.path"; public static final String PATH_PROPERTY = "logging.path";
/**
* The name of the Spring property that contains the name of the log file. Names can
* be an exact location or relative to the current directory.
* @since 2.2.0
*/
public static final String FILE_NAME_PROPERTY = "logging.file.name";
/**
* The name of the Spring property that contains the directory where log files are
* written.
* @since 2.2.0
*/
public static final String FILE_PATH_PROPERTY = "logging.file.path";
private final String file; private final String file;
private final String path; private final String path;
...@@ -112,13 +131,25 @@ public class LogFile { ...@@ -112,13 +131,25 @@ public class LogFile {
* @return a {@link LogFile} or {@code null} if the environment didn't contain any * @return a {@link LogFile} or {@code null} if the environment didn't contain any
* suitable properties * suitable properties
*/ */
@SuppressWarnings("deprecation")
public static LogFile get(PropertyResolver propertyResolver) { public static LogFile get(PropertyResolver propertyResolver) {
String file = propertyResolver.getProperty(FILE_PROPERTY); String file = getLogFileProperty(propertyResolver, FILE_NAME_PROPERTY,
String path = propertyResolver.getProperty(PATH_PROPERTY); FILE_PROPERTY);
String path = getLogFileProperty(propertyResolver, FILE_PATH_PROPERTY,
PATH_PROPERTY);
if (StringUtils.hasLength(file) || StringUtils.hasLength(path)) { if (StringUtils.hasLength(file) || StringUtils.hasLength(path)) {
return new LogFile(file, path); return new LogFile(file, path);
} }
return null; return null;
} }
private static String getLogFileProperty(PropertyResolver propertyResolver,
String propertyName, String deprecatedPropertyName) {
String property = propertyResolver.getProperty(propertyName);
if (property != null) {
return property;
}
return propertyResolver.getProperty(deprecatedPropertyName);
}
} }
...@@ -71,6 +71,21 @@ ...@@ -71,6 +71,21 @@
"name": "logging.file", "name": "logging.file",
"type": "java.lang.String", "type": "java.lang.String",
"description": "Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.", "description": "Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.",
"sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener",
"deprecation": {
"replacement": "logging.file.name"
}
},
{
"name": "logging.file.name",
"type": "java.lang.String",
"description": "Log file name (for instance, `myapp.log`). Names can be an exact location or relative to the current directory.",
"sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener"
},
{
"name": "logging.file.path",
"type": "java.lang.String",
"description": "Location of the log file. For instance, `/var/log`.",
"sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener" "sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener"
}, },
{ {
...@@ -103,7 +118,10 @@ ...@@ -103,7 +118,10 @@
"name": "logging.path", "name": "logging.path",
"type": "java.lang.String", "type": "java.lang.String",
"description": "Location of the log file. For instance, `/var/log`.", "description": "Location of the log file. For instance, `/var/log`.",
"sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener" "sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener",
"deprecation": {
"replacement": "logging.file.path"
}
}, },
{ {
"name": "logging.pattern.console", "name": "logging.pattern.console",
......
...@@ -100,13 +100,13 @@ public class SpringApplicationBuilderTests { ...@@ -100,13 +100,13 @@ public class SpringApplicationBuilderTests {
public void propertiesWithRepeatSeparator() { public void propertiesWithRepeatSeparator() {
SpringApplicationBuilder application = new SpringApplicationBuilder() SpringApplicationBuilder application = new SpringApplicationBuilder()
.sources(ExampleConfig.class).contextClass(StaticApplicationContext.class) .sources(ExampleConfig.class).contextClass(StaticApplicationContext.class)
.properties("one=c:\\logging.file", "two=a:b", "three:c:\\logging.file", .properties("one=c:\\logging.file.name", "two=a:b",
"four:a:b"); "three:c:\\logging.file.name", "four:a:b");
this.context = application.run(); this.context = application.run();
ConfigurableEnvironment environment = this.context.getEnvironment(); ConfigurableEnvironment environment = this.context.getEnvironment();
assertThat(environment.getProperty("one")).isEqualTo("c:\\logging.file"); assertThat(environment.getProperty("one")).isEqualTo("c:\\logging.file.name");
assertThat(environment.getProperty("two")).isEqualTo("a:b"); assertThat(environment.getProperty("two")).isEqualTo("a:b");
assertThat(environment.getProperty("three")).isEqualTo("c:\\logging.file"); assertThat(environment.getProperty("three")).isEqualTo("c:\\logging.file.name");
assertThat(environment.getProperty("four")).isEqualTo("a:b"); assertThat(environment.getProperty("four")).isEqualTo("a:b");
} }
......
...@@ -211,6 +211,22 @@ public class LoggingApplicationListenerTests { ...@@ -211,6 +211,22 @@ public class LoggingApplicationListenerTests {
@Test @Test
public void addLogFileProperty() { public void addLogFileProperty() {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"logging.config=classpath:logback-nondefault.xml",
"logging.file.name=target/foo.log");
this.initializer.initialize(this.context.getEnvironment(),
this.context.getClassLoader());
Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class);
String existingOutput = this.outputCapture.toString();
logger.info("Hello world");
String output = this.outputCapture.toString().substring(existingOutput.length())
.trim();
assertThat(output).startsWith("target/foo.log");
}
@Test
@Deprecated
public void addLogFilePropertyWithDeprecatedProperty() {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"logging.config=classpath:logback-nondefault.xml", "logging.config=classpath:logback-nondefault.xml",
"logging.file=target/foo.log"); "logging.file=target/foo.log");
...@@ -226,6 +242,19 @@ public class LoggingApplicationListenerTests { ...@@ -226,6 +242,19 @@ public class LoggingApplicationListenerTests {
@Test @Test
public void addLogFilePropertyWithDefault() { public void addLogFilePropertyWithDefault() {
assertThat(new File("target/foo.log").exists()).isFalse();
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"logging.file.name=target/foo.log");
this.initializer.initialize(this.context.getEnvironment(),
this.context.getClassLoader());
Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class);
logger.info("Hello world");
assertThat(new File("target/foo.log").exists()).isTrue();
}
@Test
@Deprecated
public void addLogFilePropertyWithDefaultAndDeprecatedProperty() {
assertThat(new File("target/foo.log").exists()).isFalse(); assertThat(new File("target/foo.log").exists()).isFalse();
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"logging.file=target/foo.log"); "logging.file=target/foo.log");
...@@ -238,6 +267,21 @@ public class LoggingApplicationListenerTests { ...@@ -238,6 +267,21 @@ public class LoggingApplicationListenerTests {
@Test @Test
public void addLogPathProperty() { public void addLogPathProperty() {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"logging.config=classpath:logback-nondefault.xml",
"logging.file.path=target/foo/");
this.initializer.initialize(this.context.getEnvironment(),
this.context.getClassLoader());
Log logger = LogFactory.getLog(LoggingApplicationListenerTests.class);
String existingOutput = this.outputCapture.toString();
logger.info("Hello world");
String output = this.outputCapture.toString().substring(existingOutput.length())
.trim();
assertThat(output).startsWith("target/foo/spring.log");
}
@Test
public void addLogPathPropertyWithDeprecatedProperty() {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"logging.config=classpath:logback-nondefault.xml", "logging.config=classpath:logback-nondefault.xml",
"logging.path=target/foo/"); "logging.path=target/foo/");
...@@ -491,9 +535,10 @@ public class LoggingApplicationListenerTests { ...@@ -491,9 +535,10 @@ public class LoggingApplicationListenerTests {
@Test @Test
public void systemPropertiesAreSetForLoggingConfiguration() { public void systemPropertiesAreSetForLoggingConfiguration() {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"logging.exception-conversion-word=conversion", "logging.file=target/log", "logging.exception-conversion-word=conversion",
"logging.path=path", "logging.pattern.console=console", "logging.file.name=target/log", "logging.file.path=path",
"logging.pattern.file=file", "logging.pattern.level=level"); "logging.pattern.console=console", "logging.pattern.file=file",
"logging.pattern.level=level");
this.initializer.initialize(this.context.getEnvironment(), this.initializer.initialize(this.context.getEnvironment(),
this.context.getClassLoader()); this.context.getClassLoader());
assertThat(System.getProperty(LoggingSystemProperties.CONSOLE_LOG_PATTERN)) assertThat(System.getProperty(LoggingSystemProperties.CONSOLE_LOG_PATTERN))
...@@ -511,6 +556,19 @@ public class LoggingApplicationListenerTests { ...@@ -511,6 +556,19 @@ public class LoggingApplicationListenerTests {
assertThat(System.getProperty(LoggingSystemProperties.PID_KEY)).isNotNull(); assertThat(System.getProperty(LoggingSystemProperties.PID_KEY)).isNotNull();
} }
@Test
@Deprecated
public void systemPropertiesAreSetForLoggingConfigurationWithDeprecatedProperties() {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"logging.file=target/log", "logging.path=path");
this.initializer.initialize(this.context.getEnvironment(),
this.context.getClassLoader());
assertThat(System.getProperty(LoggingSystemProperties.LOG_FILE))
.isEqualTo("target/log");
assertThat(System.getProperty(LoggingSystemProperties.LOG_PATH))
.isEqualTo("path");
}
@Test @Test
public void environmentPropertiesIgnoreUnresolvablePlaceholders() { public void environmentPropertiesIgnoreUnresolvablePlaceholders() {
// gh-7719 // gh-7719
...@@ -536,7 +594,7 @@ public class LoggingApplicationListenerTests { ...@@ -536,7 +594,7 @@ public class LoggingApplicationListenerTests {
@Test @Test
public void logFilePropertiesCanReferenceSystemProperties() { public void logFilePropertiesCanReferenceSystemProperties() {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"logging.file=target/${PID}.log"); "logging.file.name=target/${PID}.log");
this.initializer.initialize(this.context.getEnvironment(), this.initializer.initialize(this.context.getEnvironment(),
this.context.getClassLoader()); this.context.getClassLoader());
assertThat(System.getProperty(LoggingSystemProperties.LOG_FILE)) assertThat(System.getProperty(LoggingSystemProperties.LOG_FILE))
......
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.springframework.boot.logging; package org.springframework.boot.logging;
import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
...@@ -39,14 +40,27 @@ public class LogFileTests { ...@@ -39,14 +40,27 @@ public class LogFileTests {
@Test @Test
public void noProperties() { public void noProperties() {
PropertyResolver resolver = getPropertyResolver(null, null); PropertyResolver resolver = getPropertyResolver(Collections.emptyMap());
LogFile logFile = LogFile.get(resolver); LogFile logFile = LogFile.get(resolver);
assertThat(logFile).isNull(); assertThat(logFile).isNull();
} }
@Test @Test
public void loggingFile() { public void loggingFile() {
PropertyResolver resolver = getPropertyResolver("log.file", null); PropertyResolver resolver = getPropertyResolver(
Collections.singletonMap("logging.file.name", "log.file"));
testLoggingFile(resolver);
}
@Test
@Deprecated
public void loggingFileWithDeprecatedProperties() {
PropertyResolver resolver = getPropertyResolver(
Collections.singletonMap("logging.file", "log.file"));
testLoggingFile(resolver);
}
private void testLoggingFile(PropertyResolver resolver) {
LogFile logFile = LogFile.get(resolver); LogFile logFile = LogFile.get(resolver);
Properties properties = new Properties(); Properties properties = new Properties();
logFile.applyTo(properties); logFile.applyTo(properties);
...@@ -58,7 +72,20 @@ public class LogFileTests { ...@@ -58,7 +72,20 @@ public class LogFileTests {
@Test @Test
public void loggingPath() { public void loggingPath() {
PropertyResolver resolver = getPropertyResolver(null, "logpath"); PropertyResolver resolver = getPropertyResolver(
Collections.singletonMap("logging.file.path", "logpath"));
testLoggingPath(resolver);
}
@Test
@Deprecated
public void loggingPathWithDeprecatedProperties() {
PropertyResolver resolver = getPropertyResolver(
Collections.singletonMap("logging.path", "logpath"));
testLoggingPath(resolver);
}
private void testLoggingPath(PropertyResolver resolver) {
LogFile logFile = LogFile.get(resolver); LogFile logFile = LogFile.get(resolver);
Properties properties = new Properties(); Properties properties = new Properties();
logFile.applyTo(properties); logFile.applyTo(properties);
...@@ -71,7 +98,24 @@ public class LogFileTests { ...@@ -71,7 +98,24 @@ public class LogFileTests {
@Test @Test
public void loggingFileAndPath() { public void loggingFileAndPath() {
PropertyResolver resolver = getPropertyResolver("log.file", "logpath"); Map<String, Object> properties = new LinkedHashMap<>();
properties.put("logging.file.name", "log.file");
properties.put("logging.file.path", "logpath");
PropertyResolver resolver = getPropertyResolver(properties);
testLoggingFileAndPath(resolver);
}
@Test
@Deprecated
public void loggingFileAndPathWithDeprecatedProperties() {
Map<String, Object> properties = new LinkedHashMap<>();
properties.put("logging.file", "log.file");
properties.put("logging.path", "logpath");
PropertyResolver resolver = getPropertyResolver(properties);
testLoggingFileAndPath(resolver);
}
private void testLoggingFileAndPath(PropertyResolver resolver) {
LogFile logFile = LogFile.get(resolver); LogFile logFile = LogFile.get(resolver);
Properties properties = new Properties(); Properties properties = new Properties();
logFile.applyTo(properties); logFile.applyTo(properties);
...@@ -82,10 +126,7 @@ public class LogFileTests { ...@@ -82,10 +126,7 @@ public class LogFileTests {
.isEqualTo("logpath"); .isEqualTo("logpath");
} }
private PropertyResolver getPropertyResolver(String file, String path) { private PropertyResolver getPropertyResolver(Map<String, Object> properties) {
Map<String, Object> properties = new LinkedHashMap<>();
properties.put("logging.file", file);
properties.put("logging.path", path);
PropertySource<?> propertySource = new MapPropertySource("properties", PropertySource<?> propertySource = new MapPropertySource("properties",
properties); properties);
MutablePropertySources propertySources = new MutablePropertySources(); MutablePropertySources propertySources = new MutablePropertySources();
......
...@@ -3,7 +3,7 @@ service.name=Phil ...@@ -3,7 +3,7 @@ service.name=Phil
spring.security.user.name=user spring.security.user.name=user
spring.security.user.password=password spring.security.user.password=password
# logging.file=/tmp/logs/app.log # logging.file.name=/tmp/logs/app.log
# logging.level.org.springframework.security=DEBUG # logging.level.org.springframework.security=DEBUG
management.server.address=127.0.0.1 management.server.address=127.0.0.1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment