From 1efcd58fa36f6d1dea42c1ba16be0dbfc3707762 Mon Sep 17 00:00:00 2001 From: wenxuan70 Date: Wed, 20 Sep 2023 11:15:07 +0800 Subject: [PATCH] feat: support log path configuration parameters --- .../PolarisLoggingApplicationListener.java | 19 +++++++ .../PolarisLoggingAutoConfiguration.java | 21 ++++++++ ...arisLoggingBootstrapAutoConfiguration.java | 14 +++++ .../logging/PolarisLoggingProperties.java | 35 ++++++++++++ .../main/resources/META-INF/spring.factories | 6 ++- .../context/PolarisLoggingApplication.java | 31 +++++++++++ .../PolarisLoggingSystemPropertyTest.java | 53 +++++++++++++++++++ .../PolarisLoggingAutoConfigurationTest.java | 48 +++++++++++++++++ .../src/test/resources/bootstrap.yml | 2 + 9 files changed, 227 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingAutoConfiguration.java create mode 100644 spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingBootstrapAutoConfiguration.java create mode 100644 spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingProperties.java create mode 100644 spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/PolarisLoggingApplication.java create mode 100644 spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/PolarisLoggingSystemPropertyTest.java create mode 100644 spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingAutoConfigurationTest.java diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingApplicationListener.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingApplicationListener.java index a75087ec7..0d2c1b6f9 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingApplicationListener.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingApplicationListener.java @@ -16,7 +16,9 @@ */ package com.tencent.cloud.polaris.context.logging; +import com.tencent.polaris.logging.LoggingConsts; import com.tencent.polaris.logging.PolarisLogging; +import org.apache.commons.lang.StringUtils; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; import org.springframework.boot.context.event.ApplicationFailedEvent; @@ -24,6 +26,7 @@ import org.springframework.boot.context.logging.LoggingApplicationListener; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.GenericApplicationListener; import org.springframework.core.ResolvableType; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.lang.NonNull; /** @@ -52,6 +55,22 @@ public class PolarisLoggingApplicationListener implements GenericApplicationList @Override public void onApplicationEvent(@NonNull ApplicationEvent applicationEvent) { + ConfigurableEnvironment environment = null; + + if (ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(applicationEvent.getClass())) { + environment = ((ApplicationEnvironmentPreparedEvent) applicationEvent).getEnvironment(); + } + else if (ApplicationFailedEvent.class.isAssignableFrom(applicationEvent.getClass())) { + environment = ((ApplicationFailedEvent) applicationEvent).getApplicationContext().getEnvironment(); + } + + if (environment != null) { + String loggingPath = environment.getProperty("spring.cloud.polaris.logging.path"); + if (StringUtils.isNotBlank(loggingPath)) { + System.setProperty(LoggingConsts.LOGGING_PATH_PROPERTY, loggingPath); + } + } + PolarisLogging.getInstance().loadConfiguration(); } } diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingAutoConfiguration.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingAutoConfiguration.java new file mode 100644 index 000000000..b2e14d033 --- /dev/null +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingAutoConfiguration.java @@ -0,0 +1,21 @@ +package com.tencent.cloud.polaris.context.logging; + +import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; + +/** + * Autoconfiguration for polaris logging. + * + * @author wenxuan70 + */ +@ConditionalOnPolarisEnabled +@EnableConfigurationProperties({PolarisLoggingProperties.class}) +public class PolarisLoggingAutoConfiguration { + + @Bean + public PolarisLoggingProperties polarisLoggingProperties() { + return new PolarisLoggingProperties(); + } +} diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingBootstrapAutoConfiguration.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingBootstrapAutoConfiguration.java new file mode 100644 index 000000000..41a61762d --- /dev/null +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingBootstrapAutoConfiguration.java @@ -0,0 +1,14 @@ +package com.tencent.cloud.polaris.context.logging; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Import; + +/** + * Bootstrap autoconfiguration for polaris logging. + * + * @author wenxuan70 + */ +@ConditionalOnProperty("spring.cloud.polaris.enabled") +@Import(PolarisLoggingAutoConfiguration.class) +public class PolarisLoggingBootstrapAutoConfiguration { +} diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingProperties.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingProperties.java new file mode 100644 index 000000000..37940a7d3 --- /dev/null +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingProperties.java @@ -0,0 +1,35 @@ +package com.tencent.cloud.polaris.context.logging; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * The properties for polaris logging. + * + * @author wenxuan70 + */ +@ConfigurationProperties(prefix = "spring.cloud.polaris.logging") +public class PolarisLoggingProperties { + + /** + * logging path. + */ + @Value("${spring.cloud.polaris.logging.path:#{systemProperties['user.dir'] + T(java.io.File).separator + 'polaris' + T(java.io.File).separator + 'logs'}}") + private String path; + + public String getPath() { + return path; + } + + public void setPath(String path) { + System.out.println("设置spring.cloud.polaris.logging.path: " + path); + this.path = path; + } + + @Override + public String toString() { + return "PolarisLoggingProperties{" + + "path='" + path + '\'' + + '}'; + } +} diff --git a/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/spring.factories b/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/spring.factories index a121e3c26..4a8ef0da2 100644 --- a/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/spring.factories @@ -1,7 +1,9 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration,\ - com.tencent.cloud.polaris.context.config.PolarisContextPostConfiguration + com.tencent.cloud.polaris.context.config.PolarisContextPostConfiguration,\ + com.tencent.cloud.polaris.context.logging.PolarisLoggingAutoConfiguration org.springframework.cloud.bootstrap.BootstrapConfiguration=\ - com.tencent.cloud.polaris.context.config.PolarisContextBootstrapAutoConfiguration + com.tencent.cloud.polaris.context.config.PolarisContextBootstrapAutoConfiguration,\ + com.tencent.cloud.polaris.context.logging.PolarisLoggingBootstrapAutoConfiguration org.springframework.context.ApplicationListener=\ com.tencent.cloud.polaris.context.logging.PolarisLoggingApplicationListener diff --git a/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/PolarisLoggingApplication.java b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/PolarisLoggingApplication.java new file mode 100644 index 000000000..bf2a9158b --- /dev/null +++ b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/PolarisLoggingApplication.java @@ -0,0 +1,31 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 com.tencent.cloud.polaris.context; + +import com.tencent.cloud.polaris.context.logging.PolarisLoggingApplicationListener; + +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Test for {@link PolarisLoggingApplicationListener}. + * + * @author wenxuan70 + */ +@SpringBootApplication +public class PolarisLoggingApplication { +} diff --git a/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/PolarisLoggingSystemPropertyTest.java b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/PolarisLoggingSystemPropertyTest.java new file mode 100644 index 000000000..9b96a1a14 --- /dev/null +++ b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/PolarisLoggingSystemPropertyTest.java @@ -0,0 +1,53 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 com.tencent.cloud.polaris.context; + +import com.tencent.cloud.polaris.context.logging.PolarisLoggingApplicationListener; +import com.tencent.cloud.polaris.context.logging.PolarisLoggingAutoConfiguration; +import com.tencent.cloud.polaris.context.logging.PolarisLoggingProperties; +import com.tencent.polaris.logging.LoggingConsts; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for {@link PolarisLoggingApplicationListener} + * + * @author wenxuan70 + */ +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = PolarisLoggingApplication.class, + properties = {"spring.config.location=classpath:bootstrap.yml"}) +@ImportAutoConfiguration(PolarisLoggingAutoConfiguration.class) +public class PolarisLoggingSystemPropertyTest { + + @Autowired + private PolarisLoggingProperties polarisLoggingProperties; + + @Test + public void testSystemProperty() { + assertThat(polarisLoggingProperties.getPath()).isEqualTo("/tmp/polaris/logs"); + assertThat(System.getProperty(LoggingConsts.LOGGING_PATH_PROPERTY)).isEqualTo("/tmp/polaris/logs"); + } +} diff --git a/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingAutoConfigurationTest.java b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingAutoConfigurationTest.java new file mode 100644 index 000000000..a181103ab --- /dev/null +++ b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingAutoConfigurationTest.java @@ -0,0 +1,48 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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 com.tencent.cloud.polaris.context.logging; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for {@link PolarisLoggingAutoConfigurationTest}. + * + * @author wenxuan70 + */ +public class PolarisLoggingAutoConfigurationTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(PolarisLoggingAutoConfiguration.class)) + .withPropertyValues( + "spring.cloud.polaris.enabled=true", + "spring.cloud.polaris.logging.path=/tmp/polaris/logs" + ); + + @Test + public void testProperties() { + contextRunner.run(context -> { + String loggingPath = context.getEnvironment().getProperty("spring.cloud.polaris.logging.path"); + assertThat(loggingPath).isEqualTo("/tmp/polaris/logs"); + }); + } +} diff --git a/spring-cloud-tencent-polaris-context/src/test/resources/bootstrap.yml b/spring-cloud-tencent-polaris-context/src/test/resources/bootstrap.yml index c445dd227..de73a15d7 100644 --- a/spring-cloud-tencent-polaris-context/src/test/resources/bootstrap.yml +++ b/spring-cloud-tencent-polaris-context/src/test/resources/bootstrap.yml @@ -7,3 +7,5 @@ spring: service: TestApp enabled: true local-port: 9090 + logging: + path: /tmp/polaris/logs