Merge pull request #15089 from TwinProduction
* pr/15089: Polish "Rename logging.file to logging.file.name" Rename logging.file to logging.file.name
This commit is contained in:
commit
389ab9579f
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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;
|
||||||
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;
|
||||||
* {@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 {
|
||||||
|
|
||||||
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 {
|
||||||
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.
|
||||||
*
|
*
|
||||||
* @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;
|
||||||
* @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 {
|
||||||
|
|
||||||
@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 {
|
||||||
@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));
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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 {
|
||||||
}
|
}
|
||||||
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());
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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 {
|
||||||
|
|
||||||
@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();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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 {
|
||||||
|
|
||||||
@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.
|
||||||
# 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:
|
||||||
----
|
----
|
||||||
|
|
||||||
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
|
||||||
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:
|
||||||
</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:
|
||||||
|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:
|
||||||
=== 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:
|
||||||
.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
|
||||||
|`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.)
|
||||||
|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;
|
||||||
* {@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):
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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 {
|
||||||
/**
|
/**
|
||||||
* 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 {
|
||||||
* @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 @@
|
||||||
"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 @@
|
||||||
"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 {
|
||||||
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 {
|
||||||
|
|
||||||
@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 {
|
||||||
|
|
||||||
@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 {
|
||||||
|
|
||||||
@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 {
|
||||||
@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 {
|
||||||
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 {
|
||||||
@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))
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* 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 @@
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
@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 {
|
||||||
|
|
||||||
@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 {
|
||||||
|
|
||||||
@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 {
|
||||||
.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
|
||||||
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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue