Spring Bootで起動／終了時のコンソール出力を抑制する

Spring Bootでアプリを作るとデフォルトではコンソールに色々な情報が出力されます。
Webアプリやcronから実行するバッチ処理なんかでは問題ないですが、ユーザーがコマンドラインから直接実行するようなアプリの場合には邪魔になります。

ここでは起動／終了時のコンソール出力を抑制する方法をまとめます。

# デフォルト設定でのコンソール出力

先ずはデフォルトでコンソールに出力される内容を確認するために、次のような簡単なアプリを作成して実行してみます。

```pom.xml
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
```

```Application.java
package tag1216.console;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args)) {
            Application app = ctx.getBean(Application.class);
            app.run(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }   

    public void run(String... args) throws Exception {
        System.out.println("処理開始");
        System.out.println("処理終了");
    }
}
```

コンソール出力はこのようになります。

```
(1)
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.2.5.RELEASE)

(2)
2015-09-05 15:30:34.754  INFO 797 --- [           main] tag1216.console.Application              : Starting Application on ***.local with PID 797 (/Users/***/develop/eclipse-jee-4.5/workspace/console-output/target/classes started by *** in /Users/***/develop/eclipse-jee-4.5/workspace/console-output)
(3)
2015-09-05 15:30:34.813  INFO 797 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@292b08d6: startup date [Sat Sep 05 15:30:34 JST 2015]; root of context hierarchy
2015-09-05 15:30:35.484  INFO 797 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
(2)
2015-09-05 15:30:35.499  INFO 797 --- [           main] tag1216.console.Application              : Started Application in 1.031 seconds (JVM running for 1.654)
処理開始
処理終了
(3)
2015-09-05 15:30:35.500  INFO 797 --- [           main] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@292b08d6: startup date [Sat Sep 05 15:30:34 JST 2015]; root of context hierarchy
(3)
2015-09-05 15:30:35.503  INFO 797 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
```

(1) 最初にSpring Bootのバナーが出力されます。
(2) その後はlogbackを使ったログ出力で、カテゴリがSpringApplicationに渡したクラス名になっている行は`startup information`というもので、マシン名、PID、ディレクトリ情報などが出力さています。
(3) その他にもログレベルINFOでいくつかのログが出力されています。

# バナー表示を抑制する

バナーを非表示にするには、設定ファイル(application.ymlまたはapplication.properties)で`spring.main.show-banner: false`を指定します。

```application.yml
spring.main.show-banner: false
```

これはSpringApplicationクラスのメソッドで指定することも可能です。

```Application.java
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.setShowBanner(false);
```

# startup infomationの出力を抑制する

こちらも設定ファイルかSpringApplicationのメソッドで指定できます。

```application.yml
spring.main.log-startup-info: false
```

```Application.java
springApplication.setLogStartupInfo(false);
```

# SpringのINFO出力を抑制する

デフォルト設定ではルートカテゴリのログレベルは[INFO]になっているので、設定ファイルでSpringのログ出力レベルを[WARN]に変更します。

```application.yml
logging.level:
  org.springframework: WARN
```

# まとめ

まとめると、設定ファイルは以下のようになります。

```application.yml
spring.main:
  show-banner: false
  log-startup-info: false
logging.level:
  org.springframework: WARN
```

実行結果

```
処理開始
処理終了
```