読者です 読者をやめる 読者になる 読者になる

Webサービスで起業を目指すプログラマーblog

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

GlassFish4でSpringBootを動かすとログが無限に出力される対処方法

GlassFish SpringBoot

GlassFish4でSpringBootアプリを動かすと、アプリで設定したログファイルに無限にログが出力され、サーバーのディスクを使い切るという現象に遭遇しました。

いろいろ調べてもなかなか対処方法がありませんでしたが、困った時の「stack overflow」に似たようなことで質問が上がっていたので試したら無事解決したので、その手順を紹介します。

動作環境

SpringBoot 1.3.6
Logback 1.1.7
SLF4j 1.7.21
GlassFish 4.1.1 Full Profile

GlassFishは、PayaraServer 163 Fullのdomain1を使用

問題の現象

GlassFishにSpringBootアプリをwarでデプロイし、アプリが起動するとアプリで設定したログファイルに次のようなものが無限に出力される。

INFO  [2016-11-08 16:59:28.375] unknown.jul.logger .   ____          _            __ _ _  
INFO  [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \  
INFO  [2016-11-08 16:59:28.397] unknown.jul.logger ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \  
INFO  [2016-11-08 16:59:28.397] unknown.jul.logger \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  
INFO  [2016-11-08 16:59:28.397] unknown.jul.logger '  |____| .__|_| |_|_| |_\__, | / / / /  
INFO  [2016-11-08 16:59:28.398] unknown.jul.logger =========|_|==============|___/=/_/_/_/  
INFO  [2016-11-08 16:59:28.398] unknown.jul.logger :: Spring Boot ::        (v1.3.6.RELEASE)  
INFO  [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.375  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : .   ____          _            __ _ _  
INFO  [2016-11-08 16:59:28.398] unknown.jul.logger INFO  [2016-11-08 16:59:28.375] unknown.jul.logger .   ____          _            __ _ _  
INFO  [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.397  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \  
INFO  [2016-11-08 16:59:28.398] unknown.jul.logger INFO  [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \  
INFO  [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \  
INFO  [2016-11-08 16:59:28.399] unknown.jul.logger INFO  [2016-11-08 16:59:28.397] unknown.jul.logger ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \  
INFO  [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  
INFO  [2016-11-08 16:59:28.399] unknown.jul.logger INFO  [2016-11-08 16:59:28.397] unknown.jul.logger \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  
INFO  [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : '  |____| .__|_| |_|_| |_\__, | / / / /  
INFO  [2016-11-08 16:59:28.400] unknown.jul.logger INFO  [2016-11-08 16:59:28.397] unknown.jul.logger '  |____| .__|_| |_|_| |_\__, | / / / /  
INFO  [2016-11-08 16:59:28.400] unknown.jul.logger 2016-11-08 16:59:28.398  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : =========|_|==============|___/=/_/_/_/  
INFO  [2016-11-08 16:59:28.400] unknown.jul.logger INFO  [2016-11-08 16:59:28.398] unknown.jul.logger =========|_|==============|___/=/_/_/_/  
INFO  [2016-11-08 16:59:28.400] unknown.jul.logger 2016-11-08 16:59:28.398  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : :: Spring Boot ::        (v1.3.6.RELEASE)  
INFO  [2016-11-08 16:59:28.400] unknown.jul.logger INFO  [2016-11-08 16:59:28.398] unknown.jul.logger :: Spring Boot ::        (v1.3.6.RELEASE)  
INFO  [2016-11-08 16:59:28.400] unknown.jul.logger 2016-11-08 16:59:28.398  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : 2016-11-08 16:59:28.375  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : .   ____          _            __ _ _  
INFO  [2016-11-08 16:59:28.401] unknown.jul.logger INFO  [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.375  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : .   ____          _            __ _ _  
INFO  [2016-11-08 16:59:28.401] unknown.jul.logger 2016-11-08 16:59:28.398  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : INFO  [2016-11-08 16:59:28.375] unknown.jul.logger .   ____          _            __ _ _  
INFO  [2016-11-08 16:59:28.401] unknown.jul.logger INFO  [2016-11-08 16:59:28.398] unknown.jul.logger INFO  [2016-11-08 16:59:28.375] unknown.jul.logger .   ____          _            __ _ _  
INFO  [2016-11-08 16:59:28.401] unknown.jul.logger 2016-11-08 16:59:28.398  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : 2016-11-08 16:59:28.397  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \  
INFO  [2016-11-08 16:59:28.401] unknown.jul.logger INFO  [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.397  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \  
INFO  [2016-11-08 16:59:28.402] unknown.jul.logger 2016-11-08 16:59:28.398  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : INFO  [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \  
INFO  [2016-11-08 16:59:28.402] unknown.jul.logger INFO  [2016-11-08 16:59:28.398] unknown.jul.logger INFO  [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \  
INFO  [2016-11-08 16:59:28.402] unknown.jul.logger 2016-11-08 16:59:28.399  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : 2016-11-08 16:59:28.397  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \  
INFO  [2016-11-08 16:59:28.402] unknown.jul.logger INFO  [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397  INFO 2466 --- [       Thread-8] unknown.jul.logger                       : ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \  

GlassFishでLoggerが認識されていないのが原因のようです。

手順

GlassFishにあるファイルを編集する前にバックアップを取りましょう。


1.GlassFishが起動している場合、停止する

glassfish4/glassfish/bin/asadmin stop-domain domain1


2.GlassFIshのlibディレクトリにlogback・slf4jライブラリを配置する

# 配置先
glassfish4/glassfish/lib/endorsed

# 配置するライブラリ
jul-to-slf4j-x.x.x.jar
slf4j-api-x.x.x.jar
logback-core-x.x.x.jar
logback-classic-x.x.x.jar


3.GlassFishのconfigディレクトリにlogback.xmlを配置し、次のように定義する

vi glassfish/domains/domain1/config/logback.xml

logback.xml

<configuration debug="true" scan="true">
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>log/server.log</file>
        <append>true</append>
        <encoder>
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{52} - %msg%n</Pattern>
        </encoder>
    </appender>
    <root>
        <level value="INFO"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>


4.GlassFishにある「logging.properties」の一部を書き換える
管理コンソールで変更している場合、変更した値になっているので注意して下さい。

vi glassfish4/glassfish/domain1/config/logging.properties

Before

handlers=java.util.logging.ConsoleHandler
handlerServices=com.sun.enterprise.server.logging.GFFileHandler
java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.file=${com.sun.aas.instanceRoot}/logs/server.log
com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0
com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1
java.util.logging.FileHandler.limit=50000
com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=false
com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000
com.sun.enterprise.server.logging.GFFileHandler.excludeFields=
com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=true
com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=false
java.util.logging.FileHandler.count=1
com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0
log4j.logger.org.hibernate.validator.util.Version=warn
com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0
com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=false
java.util.logging.FileHandler.pattern=%h/java%u.log
java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter

After

handlers=org.slf4j.bridge.SLF4JBridgeHandler #変更
handlerServices=com.sun.enterprise.server.logging.GFFileHandler
java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.file=${com.sun.aas.instanceRoot}/logs/server.log #そのまま
com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0
com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1
java.util.logging.FileHandler.limit=50000
com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=false
com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000
com.sun.enterprise.server.logging.GFFileHandler.excludeFields=
com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=true
com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=false
java.util.logging.FileHandler.count=1
com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0
log4j.logger.org.hibernate.validator.util.Version=warn
com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0
com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=false
java.util.logging.FileHandler.pattern=%h/java%u.log
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter #変更
com.sun.enterprise.server.logging.GFFileHandler.alarms=false #追加


5.GlassFishの「domain.xml」にJVMオプションを追加する

vi glassfish4/glassfish/domains/domain1/config/domain.xml


domain.xml

# <domain>
#   <configs>
#     <config name="server-config">
#       <java-config> 配下に追加する(250行目の次)
<jvm-options>-Djava.util.logging.config.file=${com.sun.aas.instanceRoot}/config/logging.properties</jvm-options>
<jvm-options>-Dlogback.configurationFile=file:///${com.sun.aas.instanceRoot}/config/logback.xml</jvm-options>


6.GlassFishを起動する

glassfish4/glassfish/bin/asadmin start-domain domain1

補足

SpringBootアプリには、「jul-to-slf4j」は含んでいません。
logback.xmlは、SpringBootのbase.xmlを読み込み、独自設定を追加しています。
application.propertiesの「logging.file」は、設定していません。
logging.properties(alarms以外)、jvm-optionは、管理コンソールの「server-config」で設定できます。

まとめ

ネットにあった内容をそのまま試して日本語に起こしただけです。
詳しいことは分からないので聞かないようにお願いしますw

この記事で関連する書籍

Java EE 7徹底入門 標準Javaフレームワークによる高信頼性Webシステムの構築

Java EE 7徹底入門 標準Javaフレームワークによる高信頼性Webシステムの構築