/* * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.boot.logging.java; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.EnumSet; import java.util.List; import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.springframework.boot.logging.AbstractLoggingSystemTests; import org.springframework.boot.logging.LogLevel; import org.springframework.boot.logging.LoggerConfiguration; import org.springframework.boot.logging.LoggingSystem; import org.springframework.boot.testutil.InternalOutputCapture; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import static org.assertj.core.api.Assertions.assertThat; /** * Tests for {@link JavaLoggingSystem}. * * @author Dave Syer * @author Phillip Webb * @author Ben Hale */ public class JavaLoggingSystemTests extends AbstractLoggingSystemTests { private static final FileFilter SPRING_LOG_FILTER = new FileFilter() { @Override public boolean accept(File pathname) { return pathname.getName().startsWith("spring.log"); } }; private final JavaLoggingSystem loggingSystem = new JavaLoggingSystem( getClass().getClassLoader()); @Rule public InternalOutputCapture output = new InternalOutputCapture(); private Logger logger; private Locale defaultLocale; @Before public void init() throws SecurityException, IOException { this.defaultLocale = Locale.getDefault(); Locale.setDefault(Locale.ENGLISH); this.logger = Logger.getLogger(getClass().getName()); } @After public void clearLocale() { Locale.setDefault(this.defaultLocale); } @After public void resetLogger() { this.logger.setLevel(Level.OFF); } @Test public void noFile() throws Exception { this.loggingSystem.beforeInitialize(); this.logger.info("Hidden"); this.loggingSystem.initialize(null, null, null); this.logger.info("Hello world"); String output = this.output.toString().trim(); assertThat(output).contains("Hello world").doesNotContain("Hidden"); assertThat(new File(tmpDir() + "/spring.log").exists()).isFalse(); } @Test public void withFile() throws Exception { File temp = new File(tmpDir()); File[] logFiles = temp.listFiles(SPRING_LOG_FILTER); for (File file : logFiles) { file.delete(); } this.loggingSystem.beforeInitialize(); this.logger.info("Hidden"); this.loggingSystem.initialize(null, null, getLogFile(null, tmpDir())); this.logger.info("Hello world"); String output = this.output.toString().trim(); assertThat(output).contains("Hello world").doesNotContain("Hidden"); assertThat(temp.listFiles(SPRING_LOG_FILTER).length).isGreaterThan(0); } @Test public void testCustomFormatter() throws Exception { this.loggingSystem.beforeInitialize(); this.loggingSystem.initialize(null, null, null); this.logger.info("Hello world"); String output = this.output.toString().trim(); assertThat(output).contains("Hello world").contains("???? INFO ["); } @Test public void testSystemPropertyInitializesFormat() throws Exception { System.setProperty("PID", "1234"); this.loggingSystem.beforeInitialize(); this.loggingSystem.initialize(null, "classpath:" + ClassUtils .addResourcePathToPackagePath(getClass(), "logging.properties"), null); this.logger.info("Hello world"); this.logger.info("Hello world"); String output = this.output.toString().trim(); assertThat(output).contains("Hello world").contains("1234 INFO ["); } @Test public void testNonDefaultConfigLocation() throws Exception { this.loggingSystem.beforeInitialize(); this.loggingSystem.initialize(null, "classpath:logging-nondefault.properties", null); this.logger.info("Hello world"); String output = this.output.toString().trim(); assertThat(output).contains("INFO: Hello"); } @Test(expected = IllegalStateException.class) public void testNonexistentConfigLocation() throws Exception { this.loggingSystem.beforeInitialize(); this.loggingSystem.initialize(null, "classpath:logging-nonexistent.properties", null); } @Test public void getSupportedLevels() { assertThat(this.loggingSystem.getSupportedLogLevels()) .isEqualTo(EnumSet.of(LogLevel.TRACE, LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR, LogLevel.OFF)); } @Test public void setLevel() throws Exception { this.loggingSystem.beforeInitialize(); this.loggingSystem.initialize(null, null, null); this.logger.fine("Hello"); this.loggingSystem.setLogLevel("org.springframework.boot", LogLevel.DEBUG); this.logger.fine("Hello"); assertThat(StringUtils.countOccurrencesOf(this.output.toString(), "Hello")) .isEqualTo(1); } @Test public void getLoggingConfigurations() throws Exception { this.loggingSystem.beforeInitialize(); this.loggingSystem.initialize(null, null, null); this.loggingSystem.setLogLevel(getClass().getName(), LogLevel.DEBUG); List<LoggerConfiguration> configurations = this.loggingSystem .getLoggerConfigurations(); assertThat(configurations).isNotEmpty(); assertThat(configurations.get(0).getName()) .isEqualTo(LoggingSystem.ROOT_LOGGER_NAME); } @Test public void getLoggingConfiguration() throws Exception { this.loggingSystem.beforeInitialize(); this.loggingSystem.initialize(null, null, null); this.loggingSystem.setLogLevel(getClass().getName(), LogLevel.DEBUG); LoggerConfiguration configuration = this.loggingSystem .getLoggerConfiguration(getClass().getName()); assertThat(configuration).isEqualTo(new LoggerConfiguration(getClass().getName(), LogLevel.DEBUG, LogLevel.DEBUG)); } }